CIFS: Calculate the correct request length based on page offset and tail size
It's possible that the page offset is non-zero in the pages in a request, change the function to calculate the correct data buffer length. Signed-off-by: Long Li <longli@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
@@ -212,10 +212,24 @@ rqst_len(struct smb_rqst *rqst)
|
|||||||
for (i = 0; i < rqst->rq_nvec; i++)
|
for (i = 0; i < rqst->rq_nvec; i++)
|
||||||
buflen += iov[i].iov_len;
|
buflen += iov[i].iov_len;
|
||||||
|
|
||||||
/* add in the page array if there is one */
|
/*
|
||||||
|
* Add in the page array if there is one. The caller needs to make
|
||||||
|
* sure rq_offset and rq_tailsz are set correctly. If a buffer of
|
||||||
|
* multiple pages ends at page boundary, rq_tailsz needs to be set to
|
||||||
|
* PAGE_SIZE.
|
||||||
|
*/
|
||||||
if (rqst->rq_npages) {
|
if (rqst->rq_npages) {
|
||||||
buflen += rqst->rq_pagesz * (rqst->rq_npages - 1);
|
if (rqst->rq_npages == 1)
|
||||||
buflen += rqst->rq_tailsz;
|
buflen += rqst->rq_tailsz;
|
||||||
|
else {
|
||||||
|
/*
|
||||||
|
* If there is more than one page, calculate the
|
||||||
|
* buffer length based on rq_offset and rq_tailsz
|
||||||
|
*/
|
||||||
|
buflen += rqst->rq_pagesz * (rqst->rq_npages - 1) -
|
||||||
|
rqst->rq_offset;
|
||||||
|
buflen += rqst->rq_tailsz;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return buflen;
|
return buflen;
|
||||||
|
|||||||
Reference in New Issue
Block a user