Make V4 mounts return the correct errno to mount command
Subsystems (2)
PATCH 1/1 Make V4 mounts return the correct errno to mount command
Hey Trond,
Attached is a patch that changes nfs_sb_init() to returned correct errno (when nfs_get_root() fails), instead of returning a static errno of -EINVAL. By returning the correct errno, it allows the mount command to print the correct error message. For example, currently when you try to mount a v4 fs that is not exported on the server you get:
Lucky# mount -v -t nfs4 harryp:/home /mnt/harryp
mount: wrong fs type, bad option, bad superblock on harryp:/home,
or too many mounted file systems
With this patch, error message becomes:
Lucky# mount -v -t nfs4 harryp:/home /mnt/harryp
mount: special device harryp:/home does not exist
Now that the mount command correctly decipher the errror I also changed two hard coded printk into dprintks to cut down on the number of messages (from 4 to 2) that are logged for this type of error.
SteveD.
fs/nfs/inode.c renamed from fs/nfs/inode.c.orig +10 -6
@@ -237,7 +237,7 @@ nfs_get_root(struct super_block *sb, str error = server->rpc_ops->getroot (server, rootfh, fsinfo);if (error <0 ) { -printk (KERN_NOTICE "nfs_get_root: getattr error = %d\n" , -error); +dprintk ("nfs_get_root: getattr error = %d\n" , -error);return ERR_PTR (error); }
@@ -262,6 +262,7 @@ nfs_sb_init(struct super_block *sb, rpc_struct nfs_pathconf pathinfo = { .fattr = &fattr, }; +int no_root_error =0 ;/* We probably want something more informative here */ snprintf (sb->s_id,sizeof (sb->s_id),"%x:%x" ,MAJOR (sb->s_dev),MINOR (sb->s_dev));
@@ -272,12 +273,15 @@ nfs_sb_init(struct super_block *sb, rpc_ root_inode =nfs_get_root (sb, &server->fh, &fsinfo);/* Did getting the root inode fail? */ -if (IS_ERR (root_inode)) +if (IS_ERR (root_inode)) { + no_root_error =PTR_ERR (root_inode); goto out_no_root; + } sb->s_root =d_alloc_root (root_inode); -if (!sb->s_root) +if (!sb->s_root) { + no_root_error = -ENOMEM ; goto out_no_root; - + } sb->s_root->d_op = server->rpc_ops->dentry_ops;/* Get some general file system info */
@@ -337,10 +341,10 @@ nfs_sb_init(struct super_block *sb, rpc_return 0 ;/* Yargs. It didn't work out. */ out_no_root: -printk ("nfs_read_super: get root inode failed\n" ); +dprintk ("nfs_sb_init: get root inode failed: errno %d\n" , -no_root_error);if (!IS_ERR (root_inode))iput (root_inode); -return -EINVAL ; +return no_root_error; }/*