diff --git a/ChangeLog b/ChangeLog index d18d0935..ff57c9df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog for Gentoo System Intialization ("rc") scripts # Copyright 1999-2007 Gentoo Foundation; Distributed under the GPLv2 + 11 Oct 2007; Roy Marples : + + If / block device as in /etc/fstab does not exist, use /dev/root if + it's available in checkroot, #171593. + 09 Oct 2007; Roy Marples : netmount, localmount, halt.sh and net scripts now check OS specific flags diff --git a/init.d/checkroot b/init.d/checkroot index a392ea36..a45265cf 100755 --- a/init.d/checkroot +++ b/init.d/checkroot @@ -36,7 +36,7 @@ root_rw() { } do_fsck() { - local retval=0 opts= + local retval=0 opts= root= case "${RC_UNAME}" in FreeBSD) opts="-F";; Linux) opts="-T -C0";; @@ -52,9 +52,12 @@ do_fsck() { return 0 fi + root=$(fstabinfo --blockdevice /) + [ ! -e "${root}" -a -e /dev/root ] && root=/dev/root + if [ -e /forcefsck ] || get_bootparam "forcefsck" ; then ebegin "Checking root filesystem (full fsck forced)" - fsck ${opts} -f -n / + fsck ${opts} -f -n "${root}" # /forcefsck isn't deleted because checkfs needs it. # it'll be deleted in that script. retval=$? @@ -63,7 +66,7 @@ do_fsck() { local pass=$(fstabinfo --passno /) if [ ${pass:-0} != "0" ] ; then ebegin "Checking root filesystem" - fsck ${opts} -p / + fsck ${opts} -p "${root}" retval=$? else ebegin "Skipping root filesystem check" "(fstab's passno == 0)" @@ -92,7 +95,7 @@ do_fsck() { else if [ "${RC_FORCE_AUTO}" = "yes" ] ; then eend 2 "Rerunning fsck in force mode" - fsck ${opts} -y / + fsck ${opts} -y "${root}" retval=$? else eend 2 "Filesystem couldn't be fixed :(" diff --git a/src/fstabinfo.c b/src/fstabinfo.c index 23b5c42a..4d927f71 100644 --- a/src/fstabinfo.c +++ b/src/fstabinfo.c @@ -24,7 +24,7 @@ #define GET_ENT getmntent (fp) #define GET_ENT_FILE(_name) getmntfile (_name) #define END_ENT endmntent (fp) -#define ENT_DEVICE(_ent) ent->mnt_fsname +#define ENT_BLOCKDEVICE(_ent) ent->mnt_fsname #define ENT_FILE(_ent) ent->mnt_dir #define ENT_TYPE(_ent) ent->mnt_type #define ENT_OPTS(_ent) ent->mnt_opts @@ -36,7 +36,7 @@ #define GET_ENT getfsent () #define GET_ENT_FILE(_name) getfsfile (_name) #define END_ENT endfsent () -#define ENT_DEVICE(_ent) ent->fs_spec +#define ENT_BLOCKDEVICE(_ent) ent->fs_spec #define ENT_TYPE(_ent) ent->fs_vfstype #define ENT_FILE(_ent) ent->fs_file #define ENT_OPTS(_ent) ent->fs_mntops @@ -65,17 +65,19 @@ static struct mntent *getmntfile (const char *file) #endif #include "_usage.h" -#define getoptstring "mop:t:" getoptstring_COMMON +#define getoptstring "bmop:t:" getoptstring_COMMON static struct option longopts[] = { - { "options", 0, NULL, 'o'}, - { "passno", 1, NULL, 'p'}, - { "fstype", 1, NULL, 't'}, + { "blockdevice", 0, NULL, 'b' }, + { "options", 0, NULL, 'o' }, + { "passno", 1, NULL, 'p' }, + { "fstype", 1, NULL, 't' }, longopts_COMMON }; static const char * const longopts_help[] = { + "Extract the block device", "Extract the options field", - "Extract the pass number field", - "Extract the file system type", + "Extract or query the pass number field", + "List entries with matching file system type", longopts_help_COMMON }; #include "_usage.c" @@ -83,6 +85,7 @@ static const char * const longopts_help[] = { #define OUTPUT_FILE (1 << 1) #define OUTPUT_OPTIONS (1 << 3) #define OUTPUT_PASSNO (1 << 4) +#define OUTPUT_BLOCKDEV (1 << 5) int fstabinfo (int argc, char **argv) { @@ -105,6 +108,9 @@ int fstabinfo (int argc, char **argv) longopts, (int *) 0)) != -1) { switch (opt) { + case 'b': + output = OUTPUT_BLOCKDEV; + break; case 'o': output = OUTPUT_OPTIONS; break; @@ -177,6 +183,9 @@ int fstabinfo (int argc, char **argv) continue; switch (output) { + case OUTPUT_BLOCKDEV: + printf ("%s\n", ENT_BLOCKDEVICE (ent)); + break; case OUTPUT_OPTIONS: printf ("%s\n", ENT_OPTS (ent)); break;