slugbug 206: fix the tmpfs directories in NFS
authorJohn Bowler <jbowler@nslu2-linux.org>
Tue, 19 Jul 2005 06:31:56 +0000 (06:31 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Tue, 19 Jul 2005 06:31:56 +0000 (06:31 +0000)
slugbug 207: fix the flashdisk mount so that it works in the presence of
an existing readonly mount (turnup, like reflash, now removes all existing
flashdisk mounts)

packages/openslug-init/openslug-init-0.10/functions
packages/openslug-init/openslug-init-0.10/reflash
packages/openslug-init/openslug-init-0.10/turnup
packages/openslug-init/openslug-init_0.10.bb

index 61b5eb2..43b1099 100755 (executable)
@@ -239,11 +239,18 @@ ifdown(){
        ifconfig "$1" down
 }
 #
-# mountflash "flash root directory" {mount options}
+# mountflash "flash device" "flash root directory" {mount options}
 #  Finds and mounts the flash file system on the given directory
 mountflash() {
        local ffsdev ffsdir
 
+       ffsdev="$1"
+       test -n "$ffsdev" -a -b "$ffsdev" || {
+               echo "$0: unable to find flash file system to copy ($ffsdev)" >&2
+               return 1
+       }
+       shift
+
        ffsdir="$1"
        test -n "$ffsdir" -a -d "$ffsdir" || {
                echo "$0: mountflash $ffsdir: not a directory (internal error)" >&2
@@ -251,14 +258,70 @@ mountflash() {
        }
        shift
 
-       ffsdev="$(mtblockdev Flashdisk)"
-       test -n "$ffsdev" -a -b "$ffsdev" || {
-               echo "$0: unable to find flash file system to copy ($ffsdev)" >&2
-               return 1
-       }
        mount -t jffs2 "$@" "$ffsdev" "$ffsdir" || {
                echo "$0: $ffsdev: unable to mount flash file system on $ffsdir" >&2
                return 1
        }
        return 0
 }
+#
+# umountflash [-r] "flash device"
+#  unmount any instance of the given flash device, if -r is specified a mount on
+#  root is an error, otherwise a mount on root is ignored (and remains).
+umountflash() {
+       local rootok ffsno ffsdev
+       rootok=1
+       case "$1" in
+       -r)     rootok=
+               shift;;
+       esac
+       #
+       # The argument is ffsdev
+       ffsdev="$1"
+       ffsno="$(devio "<<$ffsdev" prd)"
+       test -n "$ffsno" -a "$ffsno" -ge 0 || {
+               echo "$0: $ffsdev: device number $ffsno is not valid, cannot continue." >&2
+               return 1
+       }
+       #
+       # Make sure that Flashdisk isn't mounted on /
+       if test -z "$rootok" -a "$(devio "<</etc/init.d/sysconfsetup" prd)" -eq "$ffsno"
+       then
+               echo "$0: $ffsdev is mounted on /, use turnup ram" >&2
+               return 1
+       fi
+       #
+       # The function is currently always used interactively, so output 
+       echo "$0: umounting any existing mount of $ffsdev" >&2
+       #
+       # check each mount point, do this last first because otherwise nested
+       # mounts of ffsdev cannot be umounted.
+       ffs_umount() {
+               local device mp type options stuff
+
+               read device mp type options stuff
+               test -z "$device" && return 0
+
+               # handle following entries first
+               ffs_umount || return 1
+
+               # handle this entry, since this is currently only used for unmounting
+               # the flash root partition we know a file which must exist...
+               case "$type" in
+               jffs2)  test "$(devio "<<$mp/etc/init.d/sysconfsetup" prd 2>/dev/null)" -ne "$ffsno" ||
+                       umount "$mp" || {
+                               echo "$0: $mp: unable to umount $ffsdev" >&2
+                               return 1
+                       };;
+               esac
+
+               return 0
+       }
+       #
+       ffs_umount </proc/mounts || {
+               echo "$0: umount $ffsdev from all mount points then re-run reflash" >&2
+               return 1
+       }
+
+       return 0
+}
index 504e78f..bcf51fc 100644 (file)
@@ -213,59 +213,15 @@ then
                exit 1
        }
 fi
-#
-# find the device number of the flash partition then make sure it isn't
-# mounted anywhere.
-if test -n "$ffsdev"
-then
-       ffsno="$(devio "<<$ffsdev" prd)"
-       test -n "$ffsno" -a "$ffsno" -ge 0 || {
-               echo "reflash: $ffsdev: device number $ffsno is not valid, cannot continue." >&2
-               exit 1
-       }
-       #
-       # Make sure that Flashdisk isn't mounted on /
-       if test "$(devio "<</etc/init.d/sysconfsetup" prd)" -eq "$ffsno"
-       then
-               echo "reflash: $ffsdev is mounted on /, use turnup ram to reflash" >&2
-               exit 1
-       fi
-fi
+
 #
 # INPUTS OK, ENVIRONMENT OK, UMOUNT ANY EXISTING MOUNT OF THE FLASHDISK
 # ---------------------------------------------------------------------
 # This is only required if the device is going to be used
 if test -n "$ffsdev"
 then
-       echo "reflash: umounting any existing mount of $ffsdev" >&2
-       #
-       # check each mount point, do this last first because otherwise nested
-       # mounts of ffsdev cannot be umounted.
-       ffs_umount() {
-               local device mp type options stuff
-
-               read device mp type options stuff
-               test -z "$device" && return 0
-
-               # handle following entries first
-               ffs_umount || return 1
-
-               # handle this entry
-               case "$type" in
-               jffs2)  test "$(devio "<<$mp/etc/init.d/sysconfsetup" prd)" -ne "$ffsno" ||
-                       umount "$mp" || {
-                               echo "reflash: $mp: unable to umount $ffsdev" >&2
-                               return 1
-                       };;
-               esac
-
-               return 0
-       }
-       #
-       ffs_umount </proc/mounts || {
-               echo "reflash: umount $ffsdev from all mount points then re-run reflash" >&2
-               exit 1
-       }
+       # -r causes this to fail if the flash device is mounted on /
+       umountflash -r "$ffsdev" || exit 1
        #
        # Everything is umounted, now remount on a temporary directory.
        ffsdir="/tmp/flashdisk.$$"
@@ -274,7 +230,7 @@ then
                exit 1
        }
        #
-       mountflash "$ffsdir" -o ro || {
+       mountflash "$ffsdev" "$ffsdir" -o ro || {
                rmdir "$ffsdir"
                exit 1
        }
@@ -471,7 +427,7 @@ echo "reflash: restoring saved configuration files" >&2
 # /etc/rcS.d/S99finish on first boot (if it does not exist).  We need
 # a timestamp earlier than any files we create so touch it here, this
 # also acts as a test on the mounted file system
-mountflash "$ffsdir" && :>"$ffsdir/etc/.configured" || {
+mountflash "$ffsdev" "$ffsdir" && :>"$ffsdir/etc/.configured" || {
        rmdir "$ffsdir"
        echo "reflash: mount of new flash root file system failed" >&2
        if test -d "$ffsdir/etc"
index ce504b0..0029697 100644 (file)
@@ -4,10 +4,13 @@
 #
 . /etc/default/functions
 
+#
+# configuration
+#  The following variables control which directories in /var end up on the rootfs
+#  and which end up in a temporary file system.
 INRAM_MEMSTICK="/var/cache /var/lock /var/log /var/run /var/tmp /var/lib/ipkg"
-INRAM_NFS="/var/cache /var/run"
+INRAM_NFS="/var/cache /var/lock /var/run /var/tmp"
 INRAM_DISK=""
-
 #
 # force: override certain checks
 force=
@@ -61,6 +64,23 @@ fsoptions() {
        fi
 }
 #
+# get_flash <directory> {mount options}
+#  mount the flash device, writeable, on the given directory
+get_flash() {
+       local ffsdir ffsdev
+
+       ffsdir="$1"
+       shift
+       test -n "$ffsdir" -a -d "$ffsdir" || {
+               echo "$0: $ffsdir: internal error, flash mount point not a directory" >&2
+               return 1
+       }
+
+       ffsdev="$(mtblockdev Flashdisk)"
+       umountflash "$ffsdev" &&
+       mountflash "$ffsdev" "$ffsdir" "$@"
+}
+#
 # check_rootfs [-i] <root fs directory>
 #  Make sure the candidate rootfs is empty
 check_rootfs() {
@@ -425,7 +445,7 @@ disk() {
        }
 
        # make sure we can get to the flash file system first
-       mountflash "$ffs" || {
+       get_flash "$ffs" || {
                rmdir "$new" "$ffs"
                return 1
        }
@@ -509,7 +529,7 @@ boot_reset() {
                return 1
        }
 
-       mountflash "$ffs" || {
+       get_flash "$ffs" || {
                rmdir "$ffs"
                return 1
        }
@@ -558,7 +578,7 @@ nfs() {
        }
 
        # make sure we can get to the flash file system first
-       mountflash "$ffs" || {
+       get_flash "$ffs" || {
                rmdir "$new" "$ffs"
                return 1
        }
@@ -670,7 +690,7 @@ fix_hw_addr() {
                # this isn't the flash device
                ffs="/tmp/flashdisk.$$"
                # make sure we can get to the flash file system first
-               mountflash "$ffs" || {
+               get_flash "$ffs" || {
                        rmdir "$ffs"
                        return 1
                }
index 60726d8..fd2080f 100644 (file)
@@ -3,7 +3,7 @@ SECTION = "console/network"
 LICENSE = "GPL"
 DEPENDS = "base-files devio"
 RDEPENDS = "busybox devio"
-PR = "r39"
+PR = "r40"
 
 SRC_URI = "file://linuxrc \
           file://boot/flash \