nfsd: clean up raparams handling
[deliverable/linux.git] / fs / nfsd / nfs4xdr.c
index 5c7eab9c12ba272a99af4c7ccf6f1e9a8753dfde..5286206169bc5c5ec2ac56045851c4ee3ee2b442 100644 (file)
@@ -33,6 +33,7 @@
  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <linux/file.h>
 #include <linux/slab.h>
 #include <linux/namei.h>
 #include <linux/statfs.h>
@@ -3419,7 +3420,7 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
        struct file *file = read->rd_filp;
        struct svc_fh *fhp = read->rd_fhp;
        int starting_len = xdr->buf->len;
-       struct raparms *ra;
+       struct raparms *ra = NULL;
        __be32 *p;
        __be32 err;
 
@@ -3441,23 +3442,30 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
        maxcount = min_t(unsigned long, maxcount, (xdr->buf->buflen - xdr->buf->len));
        maxcount = min_t(unsigned long, maxcount, read->rd_length);
 
-       if (read->rd_filp)
+       if (read->rd_filp) {
                err = nfsd_permission(resp->rqstp, fhp->fh_export,
                                fhp->fh_dentry,
                                NFSD_MAY_READ|NFSD_MAY_OWNER_OVERRIDE);
-       else
-               err = nfsd_get_tmp_read_open(resp->rqstp, read->rd_fhp,
-                                               &file, &ra);
-       if (err)
-               goto err_truncate;
+               if (err)
+                       goto err_truncate;
+       } else {
+               err = nfsd_open(resp->rqstp, fhp, S_IFREG, NFSD_MAY_READ,
+                               &file);
+               if (err)
+                       goto err_truncate;
+
+               ra = nfsd_init_raparms(file);
+       }
 
        if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags))
                err = nfsd4_encode_splice_read(resp, read, file, maxcount);
        else
                err = nfsd4_encode_readv(resp, read, file, maxcount);
 
+       if (ra)
+               nfsd_put_raparams(file, ra);
        if (!read->rd_filp)
-               nfsd_put_tmp_read_open(file, ra);
+               fput(file);
 
 err_truncate:
        if (err)
This page took 0.024147 seconds and 5 git commands to generate.