nfsd: clean up mnt_want_write calls
authorMiklos Szeredi <mszeredi@suse.cz>
Tue, 1 Jul 2008 13:38:35 +0000 (15:38 +0200)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 1 Jul 2008 19:22:03 +0000 (15:22 -0400)
Multiple mnt_want_write() calls in the switch statement looks really
ugly.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Acked-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/vfs.c

index 5e05ddda45609b6c677df08c788d0caf9ec096bb..0f4481e0502d132b624e952f3c2cbad50163c4ab 100644 (file)
@@ -1250,36 +1250,34 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
                iap->ia_mode = 0;
        iap->ia_mode = (iap->ia_mode & S_IALLUGO) | type;
 
+       err = nfserr_inval;
+       if (!S_ISREG(type) && !S_ISDIR(type) && !special_file(type)) {
+               printk(KERN_WARNING "nfsd: bad file type %o in nfsd_create\n",
+                      type);
+               goto out;
+       }
+
+       host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
+       if (host_err)
+               goto out_nfserr;
+
        /*
         * Get the dir op function pointer.
         */
        err = 0;
        switch (type) {
        case S_IFREG:
-               host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
-               if (host_err)
-                       goto out_nfserr;
                host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
                break;
        case S_IFDIR:
-               host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
-               if (host_err)
-                       goto out_nfserr;
                host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
                break;
        case S_IFCHR:
        case S_IFBLK:
        case S_IFIFO:
        case S_IFSOCK:
-               host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);
-               if (host_err)
-                       goto out_nfserr;
                host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
                break;
-       default:
-               printk("nfsd: bad file type %o in nfsd_create\n", type);
-               host_err = -EINVAL;
-               goto out_nfserr;
        }
        if (host_err < 0) {
                mnt_drop_write(fhp->fh_export->ex_path.mnt);
@@ -1291,7 +1289,6 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
                write_inode_now(dchild->d_inode, 1);
        }
 
-
        err2 = nfsd_create_setattr(rqstp, resfhp, iap);
        if (err2)
                err = err2;