Skip to content

Commit

Permalink
fstab-generator: handle NFS "bg" mounts correctly. (#6103)
Browse files Browse the repository at this point in the history
When "bg" is specified for NFS mounts, and if the server is
not accessible, two behaviors are possible depending on networking
details.
If a definitive error is received, such a EHOSTUNREACH or ECONNREFUSED,
mount.nfs will fork and continue in the background, while /bin/mount
will report success.
If no definitive error is reported but the connection times out
instead, then the mount.nfs timeout will normally be longer than the
systemd.mount timeout, so mount.nfs will be killed by systemd.

In the first case the mount has appeared to succeed even though
it hasn't.  This can be confusing.  Also the background mount.nfs
will never get cleaned up, even if the mount unit is stopped.

In the second case, mount.nfs is killed early and so the mount will
not complete when the server comes back.

Neither of these are ideal.

This patch modifies the options when an NFS bg mount is detected to
force an "fg" mount, but retain the default "retry" time of 10000
minutes that applies to "bg" mounts.
It also imposes "nofail" behaviour and sets the TimeoutSec for the
mount to "infinity" so the retry= time is allowed to complete.
This provides near-identical behaviour to an NFS bg mount started directly
by "mount -a".  The only difference is that systemd will not wait for
the first mount attempt, while "mount -a" will.

Fixes #6046
  • Loading branch information
neilbrown authored and poettering committed Jul 4, 2017
1 parent 45d1ffd commit 65e1dee
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
11 changes: 9 additions & 2 deletions man/systemd.mount.xml
Expand Up @@ -161,8 +161,15 @@

<para>The NFS mount option <option>bg</option> for NFS background mounts
as documented in <citerefentry project='man-pages'><refentrytitle>nfs</refentrytitle><manvolnum>5</manvolnum></citerefentry>
is not supported in <filename>/etc/fstab</filename> entries. The systemd mount option <option>nofail</option>
provides similar functionality and should be used instead.</para>
is detected by <command>systemd-fstab-generator</command> and the options
are transformed so that systemd fulfills the job-control implications of
that option. Specifically <command>systemd-fstab-generator</command> acts
as though <literal>x-systemd.mount-timout=infinity,retry=10000</literal> was
prepended to the option list, and <literal>fg,nofail</literal> was appended.
Depending on specific requirements, it may be appropriate to provide some of
these options explicitly, or to make use of the
<literal>x-systemd.automount</literal> option described below instead
of using <literal>bg</literal>.</para>

<para>When reading <filename>/etc/fstab</filename> a few special
mount options are understood by systemd which influence how
Expand Down
14 changes: 14 additions & 0 deletions src/fstab-generator/fstab-generator.c
Expand Up @@ -358,6 +358,20 @@ static int add_mount(
"Documentation=man:fstab(5) man:systemd-fstab-generator(8)\n",
source);

if (STR_IN_SET(fstype, "nfs", "nfs4") && !automount &&
fstab_test_yes_no_option(opts, "bg\0" "fg\0")) {
/* The default retry timeout that mount.nfs uses for 'bg' mounts
* is 10000 minutes, where as it uses 2 minutes for 'fg' mounts.
* As we are making 'bg' mounts look like an 'fg' mount to
* mount.nfs (so systemd can manage the job-control aspects of 'bg'),
* we need to explicitly preserve that default, and also ensure
* the systemd mount-timeout doesn't interfere.
* By placing these options first, they can be over-ridden by
* settings in /etc/fstab. */
opts = strjoina("x-systemd.mount-timeout=infinity,retry=10000,", opts, ",fg");
nofail = true;
}

if (!nofail && !automount)
fprintf(f, "Before=%s\n", post);

Expand Down

0 comments on commit 65e1dee

Please sign in to comment.