mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
Merge tag 'nfsd-4.19-1' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "Chuck Lever fixed a problem with NFSv4.0 callbacks over GSS from multi-homed servers. The only new feature is a minor bit of protocol (change_attr_type) which the client doesn't even use yet. Other than that, various bugfixes and cleanup" * tag 'nfsd-4.19-1' of git://linux-nfs.org/~bfields/linux: (27 commits) sunrpc: Add comment defining gssd upcall API keywords nfsd: Remove callback_cred nfsd: Use correct credential for NFSv4.0 callback with GSS sunrpc: Extract target name into svc_cred sunrpc: Enable the kernel to specify the hostname part of service principals sunrpc: Don't use stack buffer with scatterlist rpc: remove unneeded variable 'ret' in rdma_listen_handler nfsd: use true and false for boolean values nfsd: constify write_op[] fs/nfsd: Delete invalid assignment statements in nfsd4_decode_exchange_id NFSD: Handle full-length symlinks NFSD: Refactor the generic write vector fill helper svcrdma: Clean up Read chunk path svcrdma: Avoid releasing a page in svc_xprt_release() nfsd: Mark expected switch fall-through sunrpc: remove redundant variables 'checksumlen','blocksize' and 'data' nfsd: fix leaked file lock with nfs exported overlayfs nfsd: don't advertise a SCSI layout for an unsupported request_queue nfsd: fix corrupted reply to badly ordered compound nfsd: clarify check_op_ordering ...
This commit is contained in:
@@ -680,6 +680,7 @@ static int svc_rdma_build_read_chunk(struct svc_rqst *rqstp,
|
||||
struct svc_rdma_read_info *info,
|
||||
__be32 *p)
|
||||
{
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
ret = -EINVAL;
|
||||
@@ -702,6 +703,12 @@ static int svc_rdma_build_read_chunk(struct svc_rqst *rqstp,
|
||||
info->ri_chunklen += rs_length;
|
||||
}
|
||||
|
||||
/* Pages under I/O have been copied to head->rc_pages.
|
||||
* Prevent their premature release by svc_xprt_release() .
|
||||
*/
|
||||
for (i = 0; i < info->ri_readctxt->rc_page_count; i++)
|
||||
rqstp->rq_pages[i] = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -817,7 +824,6 @@ int svc_rdma_recv_read_chunk(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp,
|
||||
struct svc_rdma_recv_ctxt *head, __be32 *p)
|
||||
{
|
||||
struct svc_rdma_read_info *info;
|
||||
struct page **page;
|
||||
int ret;
|
||||
|
||||
/* The request (with page list) is constructed in
|
||||
@@ -844,27 +850,15 @@ int svc_rdma_recv_read_chunk(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp,
|
||||
ret = svc_rdma_build_normal_read_chunk(rqstp, info, p);
|
||||
else
|
||||
ret = svc_rdma_build_pz_read_chunk(rqstp, info, p);
|
||||
|
||||
/* Mark the start of the pages that can be used for the reply */
|
||||
if (info->ri_pageoff > 0)
|
||||
info->ri_pageno++;
|
||||
rqstp->rq_respages = &rqstp->rq_pages[info->ri_pageno];
|
||||
rqstp->rq_next_page = rqstp->rq_respages + 1;
|
||||
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
goto out_err;
|
||||
|
||||
ret = svc_rdma_post_chunk_ctxt(&info->ri_cc);
|
||||
|
||||
out:
|
||||
/* Read sink pages have been moved from rqstp->rq_pages to
|
||||
* head->rc_arg.pages. Force svc_recv to refill those slots
|
||||
* in rq_pages.
|
||||
*/
|
||||
for (page = rqstp->rq_pages; page < rqstp->rq_respages; page++)
|
||||
*page = NULL;
|
||||
|
||||
if (ret < 0)
|
||||
svc_rdma_read_info_free(info);
|
||||
goto out_err;
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
svc_rdma_read_info_free(info);
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user