These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / fs / nfsd / vfs.c
index 84d770b..994d66f 100644 (file)
@@ -302,42 +302,6 @@ commit_metadata(struct svc_fh *fhp)
 static void
 nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap)
 {
-       /*
-        * NFSv2 does not differentiate between "set-[ac]time-to-now"
-        * which only requires access, and "set-[ac]time-to-X" which
-        * requires ownership.
-        * So if it looks like it might be "set both to the same time which
-        * is close to now", and if inode_change_ok fails, then we
-        * convert to "set to now" instead of "set to explicit time"
-        *
-        * We only call inode_change_ok as the last test as technically
-        * it is not an interface that we should be using.
-        */
-#define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET)
-#define        MAX_TOUCH_TIME_ERROR (30*60)
-       if ((iap->ia_valid & BOTH_TIME_SET) == BOTH_TIME_SET &&
-           iap->ia_mtime.tv_sec == iap->ia_atime.tv_sec) {
-               /*
-                * Looks probable.
-                *
-                * Now just make sure time is in the right ballpark.
-                * Solaris, at least, doesn't seem to care what the time
-                * request is.  We require it be within 30 minutes of now.
-                */
-               time_t delta = iap->ia_atime.tv_sec - get_seconds();
-               if (delta < 0)
-                       delta = -delta;
-               if (delta < MAX_TOUCH_TIME_ERROR &&
-                   inode_change_ok(inode, iap) != 0) {
-                       /*
-                        * Turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME.
-                        * This will cause notify_change to set these times
-                        * to "now"
-                        */
-                       iap->ia_valid &= ~BOTH_TIME_SET;
-               }
-       }
-
        /* sanitize the mode change */
        if (iap->ia_valid & ATTR_MODE) {
                iap->ia_mode &= S_IALLUGO;
@@ -538,16 +502,11 @@ __be32 nfsd4_vfs_fallocate(struct svc_rqst *rqstp, struct svc_fh *fhp,
                           struct file *file, loff_t offset, loff_t len,
                           int flags)
 {
-       __be32 err;
        int error;
 
        if (!S_ISREG(file_inode(file)->i_mode))
                return nfserr_inval;
 
-       err = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry, NFSD_MAY_WRITE);
-       if (err)
-               return err;
-
        error = vfs_fallocate(file, flags, offset, len);
        if (!error)
                error = commit_metadata(fhp);
@@ -744,7 +703,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, umode_t type,
 
        host_err = ima_file_check(file, may_flags, 0);
        if (host_err) {
-               nfsd_close(file);
+               fput(file);
                goto out_nfserr;
        }
 
@@ -761,23 +720,12 @@ out:
        return err;
 }
 
-/*
- * Close a file.
- */
-void
-nfsd_close(struct file *filp)
-{
-       fput(filp);
-}
-
-/*
- * Obtain the readahead parameters for the file
- * specified by (dev, ino).
- */
-
-static inline struct raparms *
-nfsd_get_raparms(dev_t dev, ino_t ino)
+struct raparms *
+nfsd_init_raparms(struct file *file)
 {
+       struct inode *inode = file_inode(file);
+       dev_t dev = inode->i_sb->s_dev;
+       ino_t ino = inode->i_ino;
        struct raparms  *ra, **rap, **frap = NULL;
        int depth = 0;
        unsigned int hash;
@@ -814,9 +762,23 @@ found:
        ra->p_count++;
        nfsdstats.ra_depth[depth*10/nfsdstats.ra_size]++;
        spin_unlock(&rab->pb_lock);
+
+       if (ra->p_set)
+               file->f_ra = ra->p_ra;
        return ra;
 }
 
+void nfsd_put_raparams(struct file *file, struct raparms *ra)
+{
+       struct raparm_hbucket *rab = &raparm_hash[ra->p_hindex];
+
+       spin_lock(&rab->pb_lock);
+       ra->p_ra = file->f_ra;
+       ra->p_set = 1;
+       ra->p_count--;
+       spin_unlock(&rab->pb_lock);
+}
+
 /*
  * Grab and keep cached pages associated with a file in the svc_rqst
  * so that they can be passed to the network sendmsg/sendpage routines
@@ -945,7 +907,7 @@ static int wait_for_concurrent_writes(struct file *file)
        return err;
 }
 
-static __be32
+__be32
 nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
                                loff_t offset, struct kvec *vec, int vlen,
                                unsigned long *cnt, int *stablep)
@@ -1009,40 +971,6 @@ out_nfserr:
        return err;
 }
 
-__be32 nfsd_get_tmp_read_open(struct svc_rqst *rqstp, struct svc_fh *fhp,
-               struct file **file, struct raparms **ra)
-{
-       struct inode *inode;
-       __be32 err;
-
-       err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, file);
-       if (err)
-               return err;
-
-       inode = file_inode(*file);
-
-       /* Get readahead parameters */
-       *ra = nfsd_get_raparms(inode->i_sb->s_dev, inode->i_ino);
-
-       if (*ra && (*ra)->p_set)
-               (*file)->f_ra = (*ra)->p_ra;
-       return nfs_ok;
-}
-
-void nfsd_put_tmp_read_open(struct file *file, struct raparms *ra)
-{
-       /* Write back readahead params */
-       if (ra) {
-               struct raparm_hbucket *rab = &raparm_hash[ra->p_hindex];
-               spin_lock(&rab->pb_lock);
-               ra->p_ra = file->f_ra;
-               ra->p_set = 1;
-               ra->p_count--;
-               spin_unlock(&rab->pb_lock);
-       }
-       nfsd_close(file);
-}
-
 /*
  * Read data from a file. count must contain the requested read count
  * on entry. On return, *count contains the number of bytes actually read.
@@ -1055,13 +983,15 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp,
        struct raparms  *ra;
        __be32 err;
 
-       err = nfsd_get_tmp_read_open(rqstp, fhp, &file, &ra);
+       err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file);
        if (err)
                return err;
 
+       ra = nfsd_init_raparms(file);
        err = nfsd_vfs_read(rqstp, file, offset, vec, vlen, count);
-
-       nfsd_put_tmp_read_open(file, ra);
+       if (ra)
+               nfsd_put_raparams(file, ra);
+       fput(file);
 
        return err;
 }
@@ -1093,7 +1023,7 @@ nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
                if (cnt)
                        err = nfsd_vfs_write(rqstp, fhp, file, offset, vec, vlen,
                                             cnt, stablep);
-               nfsd_close(file);
+               fput(file);
        }
 out:
        return err;
@@ -1138,7 +1068,7 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp,
                        err = nfserr_notsupp;
        }
 
-       nfsd_close(file);
+       fput(file);
 out:
        return err;
 }
@@ -1319,12 +1249,6 @@ out_nfserr:
 
 #ifdef CONFIG_NFSD_V3
 
-static inline int nfsd_create_is_exclusive(int createmode)
-{
-       return createmode == NFS3_CREATE_EXCLUSIVE
-              || createmode == NFS4_CREATE_EXCLUSIVE4_1;
-}
-
 /*
  * NFSv3 and NFSv4 version of nfsd_create
  */
@@ -1707,7 +1631,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
        /* cannot use fh_lock as we need deadlock protective ordering
         * so do it by hand */
        trap = lock_rename(tdentry, fdentry);
-       ffhp->fh_locked = tfhp->fh_locked = 1;
+       ffhp->fh_locked = tfhp->fh_locked = true;
        fill_pre_wcc(ffhp);
        fill_pre_wcc(tfhp);
 
@@ -1757,7 +1681,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
        fill_post_wcc(ffhp);
        fill_post_wcc(tfhp);
        unlock_rename(tdentry, fdentry);
-       ffhp->fh_locked = tfhp->fh_locked = 0;
+       ffhp->fh_locked = tfhp->fh_locked = false;
        fh_drop_write(ffhp);
 
 out:
@@ -1977,7 +1901,7 @@ nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp,
        if (err == nfserr_eof || err == nfserr_toosmall)
                err = nfs_ok; /* can still be found in ->err */
 out_close:
-       nfsd_close(file);
+       fput(file);
 out:
        return err;
 }