]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
nfsd: fput rd_file from XDR encode context
authorChristoph Hellwig <hch@lst.de>
Thu, 18 Jun 2015 14:45:01 +0000 (16:45 +0200)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 22 Jun 2015 18:15:04 +0000 (14:15 -0400)
Remove the hack where we fput the read-specific file in generic code.
Instead we can do it in nfsd4_encode_read as that gets called for all
error cases as well.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4proc.c
fs/nfsd/nfs4xdr.c

index 5aa7c4e7fc8cd353b45957955c850be780da636a..90cfda75313c447cb8668141a624023ef509590d 100644 (file)
@@ -1723,10 +1723,6 @@ encode_op:
                        be32_to_cpu(status));
 
                nfsd4_cstate_clear_replay(cstate);
-               /* XXX Ugh, we need to get rid of this kind of special case: */
-               if (op->opnum == OP_READ && op->u.read.rd_filp)
-                       fput(op->u.read.rd_filp);
-
                nfsd4_increment_op_stats(op->opnum);
        }
 
index 3b3b3fbd9319fa0c6a21079a854e3e4bb308fe89..ca09fec7a4bf7a4fecaca3768bd2c9da459e323a 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>
@@ -3420,19 +3421,20 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
        int starting_len = xdr->buf->len;
        struct raparms *ra = NULL;
        __be32 *p;
-       __be32 err;
 
        if (nfserr)
-               return nfserr;
+               goto out;
 
        p = xdr_reserve_space(xdr, 8); /* eof flag and byte count */
        if (!p) {
                WARN_ON_ONCE(test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags));
-               return nfserr_resource;
+               nfserr = nfserr_resource;
+               goto out;
        }
        if (resp->xdr.buf->page_len && test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) {
                WARN_ON_ONCE(1);
-               return nfserr_resource;
+               nfserr = nfserr_resource;
+               goto out;
        }
        xdr_commit_encode(xdr);
 
@@ -3444,16 +3446,20 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
                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);
+               nfserr = nfsd4_encode_splice_read(resp, read, file, maxcount);
        else
-               err = nfsd4_encode_readv(resp, read, file, maxcount);
+               nfserr = nfsd4_encode_readv(resp, read, file, maxcount);
 
        if (ra)
                nfsd_put_raparams(file, ra);
 
-       if (err)
+       if (nfserr)
                xdr_truncate_encode(xdr, starting_len);
-       return err;
+
+out:
+       if (file)
+               fput(file);
+       return nfserr;
 }
 
 static __be32