|
@@ -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
|