]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
mount.nfs - NFSv4 mounts give wrong error message when server denies the mount
authorSteve Dickson <steved@redhat.com>
Thu, 17 May 2007 00:04:19 +0000 (10:04 +1000)
committerNeil Brown <neilb@suse.de>
Thu, 17 May 2007 00:04:19 +0000 (10:04 +1000)
When nfs4 mount fail because the exported directory does
not exist, the mount command claims the local mount point
does not exist which is wrong. This patch fixes that problem
as well as  makes the v4 mount failures look like v3/v2 failures.

Signed-off-by: Steve Dickson <steved@redhat.com>
Signed-off-by: Neil Brown <neilb@suse.de>
utils/mount/mount.c

index 52b0d67d208281b5bbc75b3a1d55ef2a6854698e..171c714bf2350ec36d0c228aa790098791d9c1c6 100644 (file)
@@ -285,22 +285,49 @@ static void parse_opts (const char *options, int *flags, char **extra_opts)
        }
 }
 
-static void mount_error(char *node)
+static void mount_error(char *mntpnt, char *node)
 {
        switch(errno) {
                case ENOTDIR:
-                       fprintf(stderr, "%s: mount point %s is not a directory\n", progname, node);
+                       fprintf(stderr, "%s: mount point %s is not a directory\n", 
+                               progname, mntpnt);
                        break;
                case EBUSY:
-                       fprintf(stderr, "%s: %s is already mounted or busy\n", progname, node);
+                       fprintf(stderr, "%s: %s is already mounted or busy\n", 
+                               progname, mntpnt);
                        break;
                case ENOENT:
-                       fprintf(stderr, "%s: mount point %s does not exist\n", progname, node);
+                       if (node) {
+                               fprintf(stderr, "%s: %s failed, reason given by server: %s\n",
+                                       progname, node, strerror(errno));
+                       } else
+                               fprintf(stderr, "%s: mount point %s does not exist\n", 
+                                       progname, mntpnt);
                        break;
                default:
                        fprintf(stderr, "%s: %s\n", progname, strerror(errno));
        }
 }
+static int chk_mountpoint(mount_point)
+{
+       struct stat sb;
+
+       if (stat(mount_point, &sb) < 0){
+               mount_error(mount_point, NULL);
+               return 1;
+       }
+       if (S_ISDIR(sb.st_mode) == 0){
+               errno = ENOTDIR;
+               mount_error(mount_point, NULL);
+               return 1;
+       }
+       if (access(mount_point, X_OK) < 0) {
+               mount_error(mount_point, NULL);
+               return 1;
+       }
+
+       return 0;
+}
 
 extern u_short getport(
        struct sockaddr_in *saddr,
@@ -508,6 +535,9 @@ int main(int argc, char *argv[])
            }
        }
 
+       if (chk_mountpoint(mount_point))
+               exit(EX_FAIL);
+
        if (nfs_mount_vers == 4)
                mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
        else {
@@ -538,7 +568,7 @@ int main(int argc, char *argv[])
                                           mount_opts);
 
                if (mnt_err) {
-                       mount_error(mount_point);
+                       mount_error(mount_point, spec);
                        exit(EX_FAIL);
                }
        }