From: Masatake YAMATO Date: Mon, 14 Nov 2011 13:47:53 +0000 (+0900) Subject: mount: enable fstab.d X-Git-Tag: v2.21-rc1~167 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d8ebc83ff2e9f879ac60a663c1685011a048f603;p=thirdparty%2Futil-linux.git mount: enable fstab.d This patch makes mount command read fstab.d/*.fstab if the command is built with --enable-libmount-mount. [kzak@redhat.com: - add some info to fstab.5 and mount.8 man pages - use error callback for tab parser] Signed-off-by: Masatake YAMATO Signed-off-by: Karel Zak --- diff --git a/mount/fstab.5 b/mount/fstab.5 index b0cd7635a6..2db55030d8 100644 --- a/mount/fstab.5 +++ b/mount/fstab.5 @@ -45,9 +45,11 @@ fstab \- static information about the filesystems .SH SYNOPSIS .B /etc/fstab +.sp +.B /etc/fstab.d .SH DESCRIPTION The file -.B fstab +.B /etc/fstab contains descriptive information about the various file systems. .B fstab is only read by programs, and not written; it is the duty of the system @@ -65,6 +67,20 @@ sequentially iterate through .B fstab doing their thing. +The directory +.B /etc/fstab.d +is optional and contains fstab-like files. All files without .fstab extension or with '.' prefix +are ignored. The directory +.B /etc/fstab.d +is supported by +.BR mount (8) +and +.BR umount (8) +programs only if linked with libmount. The files in the directory are parsed in +order defined by +.BR strverscmp (3) +function. The command \fBfindmnt --fstab\fP returns complete list of the filesystems. + .B The first field .RI ( fs_spec ). .RS @@ -244,6 +260,7 @@ or .SH "SEE ALSO" .BR mount (8), .BR swapon (8), +.BR findmnt (8), .BR fs (5), .BR nfs (5), .BR xfs (5), diff --git a/mount/fstab.c b/mount/fstab.c index a1bae908ea..c6aa588906 100644 --- a/mount/fstab.c +++ b/mount/fstab.c @@ -150,23 +150,36 @@ read_mntentchn(mntFILE *mfp, const char *fnam, struct mntentchn *mc0) { } #ifdef HAVE_LIBMOUNT_MOUNT - -#define USE_UNSTABLE_LIBMOUNT_API #include /* libmount */ -static void read_mounttable() +static int parser_errcb(struct libmnt_table *tb __attribute__((__unused__)), + const char *filename, int line) { - struct mntentchn *mc0 = &mounttable, *mc = mc0; + fprintf(stderr, _("%s: %d: parse error -- line ignored.\n"), + filename, line); + + return 1; /* = recoverable error + * (the line is ignored, parsing continue) */ +} + +static void read_tab_common(struct mntentchn *mc0, + int (* reader)(struct libmnt_table *tb, + const char *filename), + const char *name_in_errmsg) +{ + struct mntentchn *mc = mc0; struct libmnt_table *tb = mnt_new_table(); struct libmnt_iter *itr = mnt_new_iter(MNT_ITER_FORWARD); struct libmnt_fs *fs; - got_mtab = 1; mc->nxt = mc->prev = NULL; if (!tb || !itr) goto err; - if (mnt_table_parse_mtab(tb, NULL)) + + mnt_table_set_parser_errcb(tb, parser_errcb); + + if (reader(tb, NULL)) goto err; while(mnt_table_next_fs(tb, itr, &fs) == 0) { @@ -187,12 +200,23 @@ static void read_mounttable() mc0->prev = mc; return; err: - error(_("warning: failed to read mtab")); + error(_("warning: failed to parse %s"), name_in_errmsg); mnt_free_table(tb); mnt_free_iter(itr); mc->nxt = mc->prev = NULL; } +static void read_mounttable() +{ + got_mtab = 1; + read_tab_common(&mounttable, mnt_table_parse_mtab, "mtab"); +} + +static void read_fstab() +{ + got_fstab = 1; + read_tab_common(&fstab, mnt_table_parse_fstab, "fstab"); +} #else /* !HAVE_LIBMOUNT_MOUNT */ /* @@ -226,7 +250,6 @@ read_mounttable() { } read_mntentchn(mfp, fnam, mc); } -#endif /* HAVE_LIBMOUNT_MOUNT */ static void read_fstab() { @@ -247,6 +270,7 @@ read_fstab() { } read_mntentchn(mfp, fnam, mc); } +#endif /* !HAVE_LIBMOUNT_MOUNT */ /* Given the name NAME, try to find it in mtab. */ diff --git a/mount/mount.8 b/mount/mount.8 index 83a7e1821e..fc352b5792 100644 --- a/mount/mount.8 +++ b/mount/mount.8 @@ -182,6 +182,14 @@ The file .BR fstab (5)), may contain lines describing what devices are usually mounted where, using which options. + +If the +.B mount +command is linked with libmount, then filesystems could be also defined in +.I /etc/fstab.d/*.fstab +files. See +.BR fstab (5) +for more details. .LP The command .RS @@ -206,7 +214,7 @@ filesystems are mounted simultaneously. When mounting a filesystem mentioned in .IR fstab or -.IR mtab , +.IR mtab, it suffices to give only the device, or only the mount point. @@ -2760,6 +2768,9 @@ support (for example /sbin/mount.fuse -t fuse.sshfs). .I /etc/fstab filesystem table .TP +.I /etc/fstab.d +directory with filesystem tables +.TP .I /etc/mtab table of mounted filesystems .TP @@ -2778,6 +2789,7 @@ a list of filesystem types to try .BR fstab (5), .BR umount (8), .BR swapon (8), +.BR findmnt (8), .BR nfs (5), .BR xfs (5), .BR e2label (8),