X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=debian%2Fpatches%2F02-fix-retry-option.patch;fp=debian%2Fpatches%2F02-fix-retry-option.patch;h=935cb3d13564dd4fefd16f01d10cb8949ad4441e;hb=17ef4d25b6b54769e2909c0d37469cb60c338027;hp=0000000000000000000000000000000000000000;hpb=c6712b71e259e01fbc46f8d64ab9b2b914c8f934;p=nfs-utils.git diff --git a/debian/patches/02-fix-retry-option.patch b/debian/patches/02-fix-retry-option.patch new file mode 100644 index 0000000..935cb3d --- /dev/null +++ b/debian/patches/02-fix-retry-option.patch @@ -0,0 +1,104 @@ +text-based mount command: Fix retry= option + +Steinar Gunderson reports: + +"It seems retry= is now additive with the text-based mount interface. In +particular, "mount -o retry=0" still gives a two-minute timeout." + +Make retry option parsing more robust, while we're at it. + +Signed-off-by: Chuck Lever +--- + + utils/mount/stropts.c | 55 ++++++++++++++++++++++++++++++++++++++----------- + 1 files changed, 43 insertions(+), 12 deletions(-) + +diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c +index cadb1f4..4df9ad9 100644 +--- a/utils/mount/stropts.c ++++ b/utils/mount/stropts.c +@@ -65,6 +65,14 @@ + #define NFS_MAXPATHNAME (1024) + #endif + ++#ifndef NFS_DEF_FG_TIMEOUT_MINUTES ++#define NFS_DEF_FG_TIMEOUT_MINUTES (2ul) ++#endif ++ ++#ifndef NFS_DEF_BG_TIMEOUT_MINUTES ++#define NFS_DEF_BG_TIMEOUT_MINUTES (10000ul) ++#endif ++ + extern int nfs_mount_data_version; + extern char *progname; + extern int verbose; +@@ -141,6 +149,35 @@ static int fill_ipv4_sockaddr(const char *hostname, struct sockaddr_in *addr) + } + + /* ++ * Set up a timeout value based on the value of the "retry=" option. ++ * ++ * Returns 1 if the option was parsed successfully, otherwise zero. ++ * Returns the parsed timeout, or the default, in *timeout. ++ */ ++static int parse_retry_option(time_t *timeout, struct mount_options *options, ++ unsigned long timeout_minutes) ++{ ++ char *retry_option, *endptr; ++ ++ retry_option = po_get(options, "retry"); ++ if (retry_option) { ++ long tmp; ++ ++ errno = 0; ++ tmp = strtol(retry_option, &endptr, 10); ++ if (errno || endptr == retry_option || tmp < 0) { ++ nfs_error(_("%s: incorrect retry timeout specified"), ++ progname); ++ return 0; ++ } ++ timeout_minutes = tmp; ++ } ++ ++ *timeout = time(NULL) + (time_t)(timeout_minutes * 60); ++ return 1; ++} ++ ++/* + * Append the 'addr=' option to the options string to pass a resolved + * server address to the kernel. After a successful mount, this address + * is also added to /etc/mtab for use when unmounting. +@@ -535,13 +572,10 @@ static int nfsmount_fg(const char *spec, const char *node, + char **extra_opts) + { + unsigned int secs = 1; +- time_t timeout = time(NULL); +- char *retry; ++ time_t timeout; + +- timeout += 60 * 2; /* default: 2 minutes */ +- retry = po_get(options, "retry"); +- if (retry) +- timeout += 60 * atoi(retry); ++ if (!parse_retry_option(&timeout, options, NFS_DEF_FG_TIMEOUT_MINUTES)) ++ return EX_FAIL; + + if (verbose) + printf(_("%s: timeout set for %s"), +@@ -612,13 +646,10 @@ static int nfsmount_child(const char *spec, const char *node, + int fake, char **extra_opts) + { + unsigned int secs = 1; +- time_t timeout = time(NULL); +- char *retry; ++ time_t timeout; + +- timeout += 60 * 10000; /* default: 10,000 minutes */ +- retry = po_get(options, "retry"); +- if (retry) +- timeout += 60 * atoi(retry); ++ if (!parse_retry_option(&timeout, options, NFS_DEF_BG_TIMEOUT_MINUTES)) ++ return EX_FAIL; + + for (;;) { + if (sleep(secs))