From 329c63dd7e4e76fc66e8a6058d95c59974ad7db1 Mon Sep 17 00:00:00 2001 From: Wolfram Gloger Date: Mon, 15 Oct 2012 15:31:23 -0400 Subject: 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 --- utils/mount/stropts.c | 17 ++++++++++++----- 1 file 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; -- cgit