From: Wolfram Gloger Date: Mon, 15 Oct 2012 19:31:23 +0000 (-0400) Subject: mount.nfs4: Backgrounding mount broken with NFS versions <4 X-Git-Tag: debian/1%1.2.8-1~11^2^2~89 X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=329c63dd7e4e76fc66e8a6058d95c59974ad7db1;p=nfs-utils.git 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 Signed-off-by: Wolfram Gloger Signed-off-by: Steve Dickson --- 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;