Skip to content

Commit

Permalink
CIFS: SMBD: Support page offset in RDMA recv
Browse files Browse the repository at this point in the history
RDMA recv function needs to place data to the correct place starting at
page offset.

Signed-off-by: Long Li <longli@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Long Li authored and Steve French committed Jun 5, 2018
1 parent b6903bc commit 6509f50
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions fs/cifs/smbdirect.c
Original file line number Diff line number Diff line change
Expand Up @@ -2004,27 +2004,30 @@ static int smbd_recv_buf(struct smbd_connection *info, char *buf,
* return value: actual data read
*/
static int smbd_recv_page(struct smbd_connection *info,
struct page *page, unsigned int to_read)
struct page *page, unsigned int page_offset,
unsigned int to_read)
{
int ret;
char *to_address;
void *page_address;

/* make sure we have the page ready for read */
ret = wait_event_interruptible(
info->wait_reassembly_queue,
info->reassembly_data_length >= to_read ||
info->transport_status != SMBD_CONNECTED);
if (ret)
return 0;
return ret;

/* now we can read from reassembly queue and not sleep */
to_address = kmap_atomic(page);
page_address = kmap_atomic(page);
to_address = (char *) page_address + page_offset;

log_read(INFO, "reading from page=%p address=%p to_read=%d\n",
page, to_address, to_read);

ret = smbd_recv_buf(info, to_address, to_read);
kunmap_atomic(to_address);
kunmap_atomic(page_address);

return ret;
}
Expand All @@ -2038,7 +2041,7 @@ int smbd_recv(struct smbd_connection *info, struct msghdr *msg)
{
char *buf;
struct page *page;
unsigned int to_read;
unsigned int to_read, page_offset;
int rc;

info->smbd_recv_pending++;
Expand All @@ -2052,15 +2055,16 @@ int smbd_recv(struct smbd_connection *info, struct msghdr *msg)

case READ | ITER_BVEC:
page = msg->msg_iter.bvec->bv_page;
page_offset = msg->msg_iter.bvec->bv_offset;
to_read = msg->msg_iter.bvec->bv_len;
rc = smbd_recv_page(info, page, to_read);
rc = smbd_recv_page(info, page, page_offset, to_read);
break;

default:
/* It's a bug in upper layer to get there */
cifs_dbg(VFS, "CIFS: invalid msg type %d\n",
msg->msg_iter.type);
rc = -EIO;
rc = -EINVAL;
}

info->smbd_recv_pending--;
Expand Down

0 comments on commit 6509f50

Please sign in to comment.