[systemd-devel] [PATCH] fstab-generator: do not check btrfs and xfs

Andrey Borzenkov arvidjaar at gmail.com
Sun Jun 29 09:08:44 PDT 2014


В Sat, 28 Jun 2014 19:49:07 +0200
Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl> пишет:

> fsck.btrfs and fsck.xfs are documented to return immediately, so there is
> little sense in running them. Avoids some user confusion and a few lines
> in the logs.
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=1098799

This sounds far too specific for a generic tool. If I read this bug
report correctly, the primary complain was that systemd tries to
install fsck service even though fstab says skip fsck. This appears to
be the actual bug; I do not see how it can happen as fsck service
should be skipped for passno==0. 

> ---
>  man/systemd-fsck at .service.xml         | 15 ++++++++-------
>  src/fstab-generator/fstab-generator.c | 23 ++++++++++++++++++++++-
>  2 files changed, 30 insertions(+), 8 deletions(-)
> 
> diff --git a/man/systemd-fsck at .service.xml b/man/systemd-fsck at .service.xml
> index ee66f3712d..1e9975f426 100644
> --- a/man/systemd-fsck at .service.xml
> +++ b/man/systemd-fsck at .service.xml
> @@ -69,14 +69,15 @@
>                  all other file systems and for the root file system in
>                  the initramfs.</para>
>  
> -                <para>Those services are started at boot if
> -                <option>passno</option> in
> +                <para>Those services are started at boot for the root
> +                file system or when <option>passno</option> in
>                  <filename>/etc/fstab</filename> for the file system is
> -                set to a value greater than zero. The file system
> -                check for root is performed before the other file
> -                systems. Other file systems may be checked in
> -                parallel, except when they are one the same rotating
> -                disk.</para>
> +                set to a value greater than zero, except for file
> +                system types like btrfs and xfs which are checked by
> +                the kernel. The check for root is performed before the
> +                other file systems. Other file systems may be checked
> +                in parallel, except when they are one the same
> +                rotating disk.</para>
>  
>                  <para><filename>systemd-fsck</filename> does not know
>                  any details about specific filesystems, and simply
> diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c
> index 1256a1ce53..4dad82d425 100644
> --- a/src/fstab-generator/fstab-generator.c
> +++ b/src/fstab-generator/fstab-generator.c
> @@ -165,6 +165,14 @@ static bool mount_in_initrd(struct mntent *me) {
>                  streq(me->mnt_dir, "/usr");
>  }
>  
> +static bool mount_skip_fsck(const char *fstype) {
> +        static const char table[] =
> +                "btrfs\0"
> +                "xfs\0";
> +
> +        return fstype && nulstr_contains(table, fstype);
> +}
> +
>  static int add_mount(
>                  const char *what,
>                  const char *where,
> @@ -377,6 +385,7 @@ static int parse_fstab(bool initrd) {
>                  else {
>                          bool noauto, nofail, automount;
>                          const char *post;
> +                        int check;
>  
>                          noauto = !!hasmntopt(me, "noauto");
>                          nofail = !!hasmntopt(me, "nofail");
> @@ -393,6 +402,13 @@ static int parse_fstab(bool initrd) {
>                          else
>                                  post = SPECIAL_LOCAL_FS_TARGET;
>  
> +                        check = me->mnt_passno;
> +                        if (check && mount_skip_fsck(me->mnt_type)) {
> +                                log_warning("No need to check %s, type %s. Ignoring fstab passno.",
> +                                            what, me->mnt_type);
> +                                check = 0;
> +                        }
> +
>                          k = add_mount(what,
>                                        where,
>                                        me->mnt_type,
> @@ -415,6 +431,7 @@ static int parse_fstab(bool initrd) {
>  static int add_root_mount(void) {
>          _cleanup_free_ char *what = NULL;
>          const char *opts;
> +        int check;
>  
>          if (isempty(arg_root_what)) {
>                  log_debug("Could not find a root= entry on the kernel commandline.");
> @@ -436,12 +453,16 @@ static int add_root_mount(void) {
>          else
>                  opts = arg_root_options;
>  
> +        check = mount_skip_fsck(arg_root_fstype);
> +        if (!check)
> +                log_debug("Skipping fsck for root.");
> +
>          log_debug("Found entry what=%s where=/sysroot type=%s", what, strna(arg_root_fstype));
>          return add_mount(what,
>                           "/sysroot",
>                           arg_root_fstype,
>                           opts,
> -                         1,
> +                         check,
>                           false,
>                           false,
>                           false,



More information about the systemd-devel mailing list