summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfram Gloger <bugzilla1@malloc.de>2012-10-15 15:31:23 -0400
committerSteve Dickson <steved@redhat.com>2012-10-15 15:31:23 -0400
commit329c63dd7e4e76fc66e8a6058d95c59974ad7db1 (patch)
treed2a2750d4ff285d3751aaa519c50b8ec5ba44975
parentfa7c7b6e590367a2b1dc2ba2d9f5f4500ff29ae3 (diff)
downloadnfs-utils-329c63dd7e4e76fc66e8a6058d95c59974ad7db1.zip
nfs-utils-329c63dd7e4e76fc66e8a6058d95c59974ad7db1.tar.gz
nfs-utils-329c63dd7e4e76fc66e8a6058d95c59974ad7db1.tar.xz
mount.nfs4: Backgrounding mount broken with NFS versions <4
When the NFS version isn't specified in the mount options, mount.nfs attempts V4 first and appends 'vers=4' to the extra_options string in the mount options. If the server isn't immediately reachable, this attempt fails. However, if the background option is specified and the server comes up later on, the extra_options are used again for all further attempts and thus they fail if the server only supports vers<4. Fix this by only amending extra_options on a successful vers=4 mount. This is now Debian bug #690181 and has apparently been around for ages. Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Wolfram Gloger <bugzilla1@malloc.de> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--utils/mount/stropts.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 0aa9a75..9b4197b 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -680,6 +680,7 @@ static int nfs_do_mount_v4(struct nfsmount_info *mi,
{
struct mount_options *options = po_dup(mi->options);
int result = 0;
+ char *extra_opts = NULL;
if (!options) {
errno = ENOMEM;
@@ -715,20 +716,26 @@ static int nfs_do_mount_v4(struct nfsmount_info *mi,
goto out_fail;
}
- /*
- * Update option string to be recorded in /etc/mtab.
- */
- if (po_join(options, mi->extra_opts) == PO_FAILED) {
+ if (po_join(options, &extra_opts) == PO_FAILED) {
errno = ENOMEM;
goto out_fail;
}
if (verbose)
printf(_("%s: trying text-based options '%s'\n"),
- progname, *mi->extra_opts);
+ progname, extra_opts);
result = nfs_sys_mount(mi, options);
+ /*
+ * If success, update option string to be recorded in /etc/mtab.
+ */
+ if (result) {
+ free(*mi->extra_opts);
+ *mi->extra_opts = extra_opts;
+ } else
+ free(extra_opts);
+
out_fail:
po_destroy(options);
return result;