]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/stropts.c
proper merge
[nfs-utils.git] / utils / mount / stropts.c
index ac81616fde125a6820920780d7f7f653816d8cf9..e09aa7c3b470e5322e5b5ebf3115f73eeed947fd 100644 (file)
@@ -16,8 +16,8 @@
  *
  * You should have received a copy of the GNU General Public
  * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 021110-1307, USA.
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 0211-1301 USA
  *
  */
 
@@ -110,7 +110,7 @@ static void nfs_default_version(struct nfsmount_info *mi)
        }
 }
 #else
-inline void nfs_default_version(struct nfsmount_info *mi) {}
+inline void nfs_default_version(__attribute__ ((unused)) struct nfsmount_info *mi) {}
 #endif /* MOUNT_CONFIG */
 
 /*
@@ -437,8 +437,8 @@ static int nfs_construct_new_options(struct mount_options *options,
        if (po_append(options, new_option) == PO_FAILED)
                return 0;
 
-       po_remove_all(options, "port");
-       if (nfs_pmap->pm_port != NFS_PORT) {
+       if(po_remove_all(options, "port") == PO_FOUND ||
+          nfs_pmap->pm_port != NFS_PORT) {
                snprintf(new_option, sizeof(new_option) - 1,
                         "port=%lu", nfs_pmap->pm_port);
                if (po_append(options, new_option) == PO_FAILED)
@@ -538,6 +538,10 @@ nfs_rewrite_pmap_mount_options(struct mount_options *options)
                errno = ESPIPE;
                if (rpc_createerr.cf_stat == RPC_PROGNOTREGISTERED)
                        errno = EOPNOTSUPP;
+               else if (rpc_createerr.cf_stat == RPC_AUTHERROR)
+                       errno = EACCES;
+               else if (rpc_createerr.cf_stat == RPC_TIMEDOUT)
+                       errno = ETIMEDOUT;
                else if (rpc_createerr.cf_error.re_errno != 0)
                        errno = rpc_createerr.cf_error.re_errno;
                return 0;
@@ -650,7 +654,7 @@ out_fail:
 static int nfs_try_mount_v3v2(struct nfsmount_info *mi)
 {
        struct addrinfo *ai;
-       int ret;
+       int ret = 0;
 
        for (ai = mi->address; ai != NULL; ai = ai->ai_next) {
                ret = nfs_do_mount_v3v2(mi, ai->ai_addr, ai->ai_addrlen);
@@ -663,9 +667,10 @@ static int nfs_try_mount_v3v2(struct nfsmount_info *mi)
                case EHOSTUNREACH:
                        continue;
                default:
-                       break;
+                       goto out;
                }
        }
+out:
        return ret;
 }
 
@@ -737,7 +742,7 @@ out_fail:
 static int nfs_try_mount_v4(struct nfsmount_info *mi)
 {
        struct addrinfo *ai;
-       int ret;
+       int ret = 0;
 
        for (ai = mi->address; ai != NULL; ai = ai->ai_next) {
                ret = nfs_do_mount_v4(mi, ai->ai_addr, ai->ai_addrlen);
@@ -749,9 +754,10 @@ static int nfs_try_mount_v4(struct nfsmount_info *mi)
                case EHOSTUNREACH:
                        continue;
                default:
-                       break;
+                       goto out;
                }
        }
+out:
        return ret;
 }
 
@@ -905,7 +911,8 @@ static int nfsmount_parent(struct nfsmount_info *mi)
        if (nfs_try_mount(mi))
                return EX_SUCCESS;
 
-       if (nfs_is_permanent_error(errno)) {
+       /* retry background mounts when the server is not up */
+       if (nfs_is_permanent_error(errno) && errno != EOPNOTSUPP) {
                mount_error(mi->spec, mi->node, errno);
                return EX_FAIL;
        }
@@ -940,7 +947,8 @@ static int nfsmount_child(struct nfsmount_info *mi)
                if (nfs_try_mount(mi))
                        return EX_SUCCESS;
 
-               if (nfs_is_permanent_error(errno))
+               /* retry background mounts when the server is not up */
+               if (nfs_is_permanent_error(errno) && errno != EOPNOTSUPP)
                        break;
 
                if (time(NULL) > timeout)