On Wed, 27 Feb 2008, Luke Yelavich wrote:

> Attached is a patch to allow an initramfs to use a root filesystem as a
> loop device, on top of another file system. A good example and use of
> this code is for Ubuntu's Windows installer, which creates a loopback
> filesystem on top of the Windows NTFS partition. The Windows partition
> is mounted, then the loopback filesystem is mounted from the Windows
> partition. The patch applies against git head.

ack cool,
see specific critics below.

> diff -urN initramfs-tools/init initramfs-tools.new/init
> --- initramfs-tools/init      2008-02-26 10:36:10.347676705 +1100
> +++ initramfs-tools.new/init  2008-02-26 13:50:26.459676705 +1100
> @@ -85,6 +85,15 @@
>                       ;;
>               esac
>               ;;
> +     loop=*)
> +             LOOP="${x#loop=}"
> +             ;;
> +     loopflags=*)
> +             LOOPFLAGS="-o ${x#loopflags=}"
> +             ;;
> +     loopfstype=*)
> +             LOOPFSTYPE="${x#loopfstype=}"
> +             ;;
>       nfsroot=*)
>               NFSROOT="${x#nfsroot=}"
>               ;;

don't see them in kernel-parameter.txt but this namespace seems sane,
so ack from me.

> diff -urN initramfs-tools/initramfs-tools.8 
> initramfs-tools.new/initramfs-tools.8
> --- initramfs-tools/initramfs-tools.8 2008-02-26 13:48:37.435676705 +1100
> +++ initramfs-tools.new/initramfs-tools.8     2008-02-26 13:49:26.251676705 
> +1100
<snipp manpage diff>
ok too.

> diff -urN initramfs-tools/scripts/local initramfs-tools.new/scripts/local
> --- initramfs-tools/scripts/local     2008-02-26 13:48:37.423676705 +1100
> +++ initramfs-tools.new/scripts/local 2008-02-26 13:49:26.239676705 +1100
> @@ -101,7 +101,8 @@
>       run_scripts /scripts/local-premount
>       [ "$quiet" != "y" ] && log_end_msg
>  
> -     if [ "${readonly}" = "y" ]; then
> +     if [ ${readonly} = y ] && \
> +        ([ -z "$LOOP" ] || [ "${FSTYPE#ntfs}" = "$FSTYPE" ]); then
>               roflag=-r
>       else
>               roflag=-w

hmm at first sight i found a bit strange that you use not a different boot
method for the loop fs stuff, like setting BOOT=loop if loop bootarg is
given and then just having scripts/loop.  but on the contrary i agree that
it is on a local fs almost identical path and would lead otherwise to
code duplication of the local boot scripts and thus fine with me.

> @@ -114,6 +115,43 @@
>       # Mount root
>       mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
>  
> +     if [ "$LOOP" ]; then
> +             mkdir -p /host
> +             mount -o move ${rootmnt} /host
> +
> +             while [ ! -e "/host/${LOOP#/}" ]; do
> +                     panic "ALERT!  /host/${LOOP#/} does not exist.  
> Dropping to a shell!"
> +             done

that check should go up and check that aboves mount doesn't fail,
otherwise i don't see a possibility of that happening.

> +
> +             # Get the loop filesystem type if not set
> +             if [ -z "${LOOPFSTYPE}" ]; then
> +                     eval $(fstype < "/host/${LOOP#/}")
> +             else
> +                     FSTYPE="${LOOPFSTYPE}"
> +             fi
> +             if [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then
> +                     FSTYPE=$(/lib/udev/vol_id -t "/host/${LOOP#/}")
> +                     [ -z "$FSTYPE" ] && FSTYPE="unknown"
> +             fi

no thanks
duplication use get_fstype

> +
> +             if [ ${readonly} = y ]; then
> +                     roflag=-r
> +             else
> +                     roflag=-w
> +             fi
> +
> +             # FIXME This has no error checking
> +             modprobe loop
> +             modprobe ${FSTYPE}
> +
> +             # FIXME This has no error checking
> +             mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} 
> "/host/${LOOP#/}" ${rootmnt}

yep that was the FIXME i was talking about above.
please add mount returnvalue check here too.
afais klibc mount returns sensible error codes.

> +
> +             if [ -d ${rootmnt}/host ]; then
> +                     mount -o move /host ${rootmnt}/host
> +             fi
> +     fi
> +
>       [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
>       run_scripts /scripts/local-bottom
>       [ "$quiet" != "y" ] && log_end_msg


thanks for the submission.

-- 
maks



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to