Message ID | 1343231652-10459-7-git-send-email-jlayton@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
2012/7/25 Jeff Layton <jlayton@redhat.com>: > For now, none of the callers populate rq_pages. That will be done for > writes in a later patch. While we're at it, change the prototype of > setup_async_request not to need a return pointer argument. Just > return the pointer to the mid_q_entry or an ERR_PTR. > > Signed-off-by: Jeff Layton <jlayton@redhat.com> > --- > fs/cifs/cifsglob.h | 4 ++-- > fs/cifs/cifsproto.h | 12 ++++++------ > fs/cifs/cifssmb.c | 20 +++++++++++++------- > fs/cifs/smb2proto.h | 4 +--- > fs/cifs/smb2transport.c | 14 ++++++-------- > fs/cifs/transport.c | 30 ++++++++++++++---------------- > 6 files changed, 42 insertions(+), 42 deletions(-) > > diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h > index 2a7e4b8..a0bb713 100644 > --- a/fs/cifs/cifsglob.h > +++ b/fs/cifs/cifsglob.h > @@ -194,8 +194,8 @@ struct smb_version_operations { > int (*setup_request)(struct cifs_ses *, struct kvec *, unsigned int, > struct mid_q_entry **); > /* setup async request: allocate mid, sign message */ > - int (*setup_async_request)(struct TCP_Server_Info *, struct kvec *, > - unsigned int, struct mid_q_entry **); > + struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *, > + struct smb_rqst *); > /* check response: verify signature, map error */ > int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *, > bool); > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 3620bec..8075f23 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -69,10 +69,10 @@ extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer, > struct TCP_Server_Info *server); > extern void DeleteMidQEntry(struct mid_q_entry *midEntry); > extern void cifs_wake_up_task(struct mid_q_entry *mid); > -extern int cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, > - unsigned int nvec, mid_receive_t *receive, > - mid_callback_t *callback, void *cbdata, > - const int flags); > +extern int cifs_call_async(struct TCP_Server_Info *server, > + struct smb_rqst *rqst, > + mid_receive_t *receive, mid_callback_t *callback, > + void *cbdata, const int flags); > extern int SendReceive(const unsigned int /* xid */ , struct cifs_ses *, > struct smb_hdr * /* input */ , > struct smb_hdr * /* out */ , > @@ -81,8 +81,8 @@ extern int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses, > char *in_buf, int flags); > extern int cifs_setup_request(struct cifs_ses *, struct kvec *, unsigned int, > struct mid_q_entry **); > -extern int cifs_setup_async_request(struct TCP_Server_Info *, struct kvec *, > - unsigned int, struct mid_q_entry **); > +extern struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *, > + struct smb_rqst *); > extern int cifs_check_receive(struct mid_q_entry *mid, > struct TCP_Server_Info *server, bool log_error); > extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *, > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c > index ce5f75c..7365460 100644 > --- a/fs/cifs/cifssmb.c > +++ b/fs/cifs/cifssmb.c > @@ -751,6 +751,8 @@ CIFSSMBEcho(struct TCP_Server_Info *server) > ECHO_REQ *smb; > int rc = 0; > struct kvec iov; > + struct smb_rqst rqst = { .rq_iov = &iov, > + .rq_nvec = 1 }; > > cFYI(1, "In echo request"); > > @@ -768,7 +770,7 @@ CIFSSMBEcho(struct TCP_Server_Info *server) > iov.iov_base = smb; > iov.iov_len = be32_to_cpu(smb->hdr.smb_buf_length) + 4; > > - rc = cifs_call_async(server, &iov, 1, NULL, cifs_echo_callback, > + rc = cifs_call_async(server, &rqst, NULL, cifs_echo_callback, > server, CIFS_ASYNC_OP | CIFS_ECHO_OP); > if (rc) > cFYI(1, "Echo request failed: %d", rc); > @@ -1604,6 +1606,8 @@ cifs_async_readv(struct cifs_readdata *rdata) > READ_REQ *smb = NULL; > int wct; > struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); > + struct smb_rqst rqst = { .rq_iov = rdata->iov, > + .rq_nvec = 1 }; > > cFYI(1, "%s: offset=%llu bytes=%u", __func__, > rdata->offset, rdata->bytes); > @@ -1647,9 +1651,8 @@ cifs_async_readv(struct cifs_readdata *rdata) > rdata->iov[0].iov_len = be32_to_cpu(smb->hdr.smb_buf_length) + 4; > > kref_get(&rdata->refcount); > - rc = cifs_call_async(tcon->ses->server, rdata->iov, 1, > - cifs_readv_receive, cifs_readv_callback, > - rdata, 0); > + rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, > + cifs_readv_callback, rdata, 0); > > if (rc == 0) > cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); > @@ -2052,6 +2055,7 @@ cifs_async_writev(struct cifs_writedata *wdata) > int wct; > struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); > struct kvec *iov = NULL; > + struct smb_rqst rqst = { }; > > if (tcon->ses->capabilities & CAP_LARGE_FILES) { > wct = 14; > @@ -2068,11 +2072,13 @@ cifs_async_writev(struct cifs_writedata *wdata) > goto async_writev_out; > > /* 1 iov per page + 1 for header */ > - iov = kzalloc((wdata->nr_pages + 1) * sizeof(*iov), GFP_NOFS); > + rqst.rq_nvec = wdata->nr_pages + 1; > + iov = kzalloc((rqst.rq_nvec) * sizeof(*iov), GFP_NOFS); > if (iov == NULL) { > rc = -ENOMEM; > goto async_writev_out; > } > + rqst.rq_iov = iov; > > smb->hdr.Pid = cpu_to_le16((__u16)wdata->pid); > smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->pid >> 16)); > @@ -2121,8 +2127,8 @@ cifs_async_writev(struct cifs_writedata *wdata) > } > > kref_get(&wdata->refcount); > - rc = cifs_call_async(tcon->ses->server, iov, wdata->nr_pages + 1, > - NULL, cifs_writev_callback, wdata, 0); > + rc = cifs_call_async(tcon->ses->server, &rqst, NULL, > + cifs_writev_callback, wdata, 0); > > if (rc == 0) > cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); > diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h > index 902bbe2..dbb798c 100644 > --- a/fs/cifs/smb2proto.h > +++ b/fs/cifs/smb2proto.h > @@ -43,9 +43,7 @@ extern int smb2_check_receive(struct mid_q_entry *mid, > struct TCP_Server_Info *server, bool log_error); > extern int smb2_setup_request(struct cifs_ses *ses, struct kvec *iov, > unsigned int nvec, struct mid_q_entry **ret_mid); > -extern int smb2_setup_async_request(struct TCP_Server_Info *server, > - struct kvec *iov, unsigned int nvec, > - struct mid_q_entry **ret_mid); > +extern struct mid_q_entry *smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst); > extern void smb2_echo_request(struct work_struct *work); > > extern int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, > diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c > index 31f5d42..c0a7a42 100644 > --- a/fs/cifs/smb2transport.c > +++ b/fs/cifs/smb2transport.c > @@ -148,25 +148,23 @@ smb2_setup_request(struct cifs_ses *ses, struct kvec *iov, > return rc; > } > > -int > -smb2_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, > - unsigned int nvec, struct mid_q_entry **ret_mid) > +struct mid_q_entry * > +smb2_setup_async_request(struct TCP_Server_Info *server, > + struct smb_rqst *rqst) > { > - int rc = 0; > - struct smb2_hdr *hdr = (struct smb2_hdr *)iov[0].iov_base; > + struct smb2_hdr *hdr = (struct smb2_hdr *)smb_rqst->iov[0].iov_base; > struct mid_q_entry *mid; > > smb2_seq_num_into_buf(server, hdr); > > mid = smb2_mid_entry_alloc(hdr, server); > if (mid == NULL) > - return -ENOMEM; > + return ERR_PTR(-ENOMEM); > > /* rc = smb2_sign_smb2(iov, nvec, server); > if (rc) { > DeleteMidQEntry(mid); > return rc; > }*/ > - *ret_mid = mid; > - return rc; > + return mid; > } > diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c > index 5673ef1..73cfa6f 100644 > --- a/fs/cifs/transport.c > +++ b/fs/cifs/transport.c > @@ -454,12 +454,11 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ) > return 0; > } > > -int > -cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, > - unsigned int nvec, struct mid_q_entry **ret_mid) > +struct mid_q_entry * > +cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst) > { > int rc; > - struct smb_hdr *hdr = (struct smb_hdr *)iov[0].iov_base; > + struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; > struct mid_q_entry *mid; > > /* enable signing if server requires it */ > @@ -468,16 +467,15 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, > > mid = AllocMidQEntry(hdr, server); > if (mid == NULL) > - return -ENOMEM; > + return ERR_PTR(-ENOMEM); > > - rc = cifs_sign_smbv(iov, nvec, server, &mid->sequence_number); > + rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); > if (rc) { > DeleteMidQEntry(mid); > - return rc; > + return ERR_PTR(rc); > } > > - *ret_mid = mid; > - return 0; > + return mid; > } > > /* > @@ -485,9 +483,9 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, > * the result. Caller is responsible for dealing with timeouts. > */ > int > -cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, > - unsigned int nvec, mid_receive_t *receive, > - mid_callback_t *callback, void *cbdata, const int flags) > +cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst, > + mid_receive_t *receive, mid_callback_t *callback, > + void *cbdata, const int flags) > { > int rc, timeout, optype; > struct mid_q_entry *mid; > @@ -500,12 +498,12 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, > return rc; > > mutex_lock(&server->srv_mutex); > - rc = server->ops->setup_async_request(server, iov, nvec, &mid); > - if (rc) { > + mid = server->ops->setup_async_request(server, rqst); > + if (IS_ERR(mid)) { > mutex_unlock(&server->srv_mutex); > add_credits(server, 1, optype); > wake_up(&server->request_q); > - return rc; > + return PTR_ERR(mid); > } > > mid->receive = receive; > @@ -520,7 +518,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, > > > cifs_in_send_inc(server); > - rc = smb_sendv(server, iov, nvec); > + rc = smb_send_rqst(server, rqst); > cifs_in_send_dec(server); > cifs_save_when_sent(mid); > mutex_unlock(&server->srv_mutex); > -- > 1.7.11.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Like the idea of changing setup_async_request prototype. Reviewed-by: Pavel Shilovsky <pshilovsky@samba.org>
2012/7/25 Pavel Shilovsky <piastryyy@gmail.com>: > 2012/7/25 Jeff Layton <jlayton@redhat.com>: >> For now, none of the callers populate rq_pages. That will be done for >> writes in a later patch. While we're at it, change the prototype of >> setup_async_request not to need a return pointer argument. Just >> return the pointer to the mid_q_entry or an ERR_PTR. >> >> Signed-off-by: Jeff Layton <jlayton@redhat.com> >> --- >> fs/cifs/cifsglob.h | 4 ++-- >> fs/cifs/cifsproto.h | 12 ++++++------ >> fs/cifs/cifssmb.c | 20 +++++++++++++------- >> fs/cifs/smb2proto.h | 4 +--- >> fs/cifs/smb2transport.c | 14 ++++++-------- >> fs/cifs/transport.c | 30 ++++++++++++++---------------- >> 6 files changed, 42 insertions(+), 42 deletions(-) >> >> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h >> index 2a7e4b8..a0bb713 100644 >> --- a/fs/cifs/cifsglob.h >> +++ b/fs/cifs/cifsglob.h >> @@ -194,8 +194,8 @@ struct smb_version_operations { >> int (*setup_request)(struct cifs_ses *, struct kvec *, unsigned int, >> struct mid_q_entry **); >> /* setup async request: allocate mid, sign message */ >> - int (*setup_async_request)(struct TCP_Server_Info *, struct kvec *, >> - unsigned int, struct mid_q_entry **); >> + struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *, >> + struct smb_rqst *); >> /* check response: verify signature, map error */ >> int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *, >> bool); >> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h >> index 3620bec..8075f23 100644 >> --- a/fs/cifs/cifsproto.h >> +++ b/fs/cifs/cifsproto.h >> @@ -69,10 +69,10 @@ extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer, >> struct TCP_Server_Info *server); >> extern void DeleteMidQEntry(struct mid_q_entry *midEntry); >> extern void cifs_wake_up_task(struct mid_q_entry *mid); >> -extern int cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, >> - unsigned int nvec, mid_receive_t *receive, >> - mid_callback_t *callback, void *cbdata, >> - const int flags); >> +extern int cifs_call_async(struct TCP_Server_Info *server, >> + struct smb_rqst *rqst, >> + mid_receive_t *receive, mid_callback_t *callback, >> + void *cbdata, const int flags); >> extern int SendReceive(const unsigned int /* xid */ , struct cifs_ses *, >> struct smb_hdr * /* input */ , >> struct smb_hdr * /* out */ , >> @@ -81,8 +81,8 @@ extern int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses, >> char *in_buf, int flags); >> extern int cifs_setup_request(struct cifs_ses *, struct kvec *, unsigned int, >> struct mid_q_entry **); >> -extern int cifs_setup_async_request(struct TCP_Server_Info *, struct kvec *, >> - unsigned int, struct mid_q_entry **); >> +extern struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *, >> + struct smb_rqst *); >> extern int cifs_check_receive(struct mid_q_entry *mid, >> struct TCP_Server_Info *server, bool log_error); >> extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *, >> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c >> index ce5f75c..7365460 100644 >> --- a/fs/cifs/cifssmb.c >> +++ b/fs/cifs/cifssmb.c >> @@ -751,6 +751,8 @@ CIFSSMBEcho(struct TCP_Server_Info *server) >> ECHO_REQ *smb; >> int rc = 0; >> struct kvec iov; >> + struct smb_rqst rqst = { .rq_iov = &iov, >> + .rq_nvec = 1 }; >> >> cFYI(1, "In echo request"); >> >> @@ -768,7 +770,7 @@ CIFSSMBEcho(struct TCP_Server_Info *server) >> iov.iov_base = smb; >> iov.iov_len = be32_to_cpu(smb->hdr.smb_buf_length) + 4; >> >> - rc = cifs_call_async(server, &iov, 1, NULL, cifs_echo_callback, >> + rc = cifs_call_async(server, &rqst, NULL, cifs_echo_callback, >> server, CIFS_ASYNC_OP | CIFS_ECHO_OP); >> if (rc) >> cFYI(1, "Echo request failed: %d", rc); >> @@ -1604,6 +1606,8 @@ cifs_async_readv(struct cifs_readdata *rdata) >> READ_REQ *smb = NULL; >> int wct; >> struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); >> + struct smb_rqst rqst = { .rq_iov = rdata->iov, >> + .rq_nvec = 1 }; >> >> cFYI(1, "%s: offset=%llu bytes=%u", __func__, >> rdata->offset, rdata->bytes); >> @@ -1647,9 +1651,8 @@ cifs_async_readv(struct cifs_readdata *rdata) >> rdata->iov[0].iov_len = be32_to_cpu(smb->hdr.smb_buf_length) + 4; >> >> kref_get(&rdata->refcount); >> - rc = cifs_call_async(tcon->ses->server, rdata->iov, 1, >> - cifs_readv_receive, cifs_readv_callback, >> - rdata, 0); >> + rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, >> + cifs_readv_callback, rdata, 0); >> >> if (rc == 0) >> cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); >> @@ -2052,6 +2055,7 @@ cifs_async_writev(struct cifs_writedata *wdata) >> int wct; >> struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); >> struct kvec *iov = NULL; >> + struct smb_rqst rqst = { }; >> >> if (tcon->ses->capabilities & CAP_LARGE_FILES) { >> wct = 14; >> @@ -2068,11 +2072,13 @@ cifs_async_writev(struct cifs_writedata *wdata) >> goto async_writev_out; >> >> /* 1 iov per page + 1 for header */ >> - iov = kzalloc((wdata->nr_pages + 1) * sizeof(*iov), GFP_NOFS); >> + rqst.rq_nvec = wdata->nr_pages + 1; >> + iov = kzalloc((rqst.rq_nvec) * sizeof(*iov), GFP_NOFS); >> if (iov == NULL) { >> rc = -ENOMEM; >> goto async_writev_out; >> } >> + rqst.rq_iov = iov; >> >> smb->hdr.Pid = cpu_to_le16((__u16)wdata->pid); >> smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->pid >> 16)); >> @@ -2121,8 +2127,8 @@ cifs_async_writev(struct cifs_writedata *wdata) >> } >> >> kref_get(&wdata->refcount); >> - rc = cifs_call_async(tcon->ses->server, iov, wdata->nr_pages + 1, >> - NULL, cifs_writev_callback, wdata, 0); >> + rc = cifs_call_async(tcon->ses->server, &rqst, NULL, >> + cifs_writev_callback, wdata, 0); >> >> if (rc == 0) >> cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); >> diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h >> index 902bbe2..dbb798c 100644 >> --- a/fs/cifs/smb2proto.h >> +++ b/fs/cifs/smb2proto.h >> @@ -43,9 +43,7 @@ extern int smb2_check_receive(struct mid_q_entry *mid, >> struct TCP_Server_Info *server, bool log_error); >> extern int smb2_setup_request(struct cifs_ses *ses, struct kvec *iov, >> unsigned int nvec, struct mid_q_entry **ret_mid); >> -extern int smb2_setup_async_request(struct TCP_Server_Info *server, >> - struct kvec *iov, unsigned int nvec, >> - struct mid_q_entry **ret_mid); >> +extern struct mid_q_entry *smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst); This exceeds 80 length and causes checkpatch.pl warnings. >> extern void smb2_echo_request(struct work_struct *work); >> >> extern int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, >> diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c >> index 31f5d42..c0a7a42 100644 >> --- a/fs/cifs/smb2transport.c >> +++ b/fs/cifs/smb2transport.c >> @@ -148,25 +148,23 @@ smb2_setup_request(struct cifs_ses *ses, struct kvec *iov, >> return rc; >> } >> >> -int >> -smb2_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, >> - unsigned int nvec, struct mid_q_entry **ret_mid) >> +struct mid_q_entry * >> +smb2_setup_async_request(struct TCP_Server_Info *server, >> + struct smb_rqst *rqst) >> { >> - int rc = 0; >> - struct smb2_hdr *hdr = (struct smb2_hdr *)iov[0].iov_base; >> + struct smb2_hdr *hdr = (struct smb2_hdr *)smb_rqst->iov[0].iov_base; >> struct mid_q_entry *mid; >> >> smb2_seq_num_into_buf(server, hdr); >> >> mid = smb2_mid_entry_alloc(hdr, server); >> if (mid == NULL) >> - return -ENOMEM; >> + return ERR_PTR(-ENOMEM); >> >> /* rc = smb2_sign_smb2(iov, nvec, server); >> if (rc) { >> DeleteMidQEntry(mid); >> return rc; >> }*/ >> - *ret_mid = mid; >> - return rc; >> + return mid; >> } >> diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c >> index 5673ef1..73cfa6f 100644 >> --- a/fs/cifs/transport.c >> +++ b/fs/cifs/transport.c >> @@ -454,12 +454,11 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ) >> return 0; >> } >> >> -int >> -cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, >> - unsigned int nvec, struct mid_q_entry **ret_mid) >> +struct mid_q_entry * >> +cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst) >> { >> int rc; >> - struct smb_hdr *hdr = (struct smb_hdr *)iov[0].iov_base; >> + struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; >> struct mid_q_entry *mid; >> >> /* enable signing if server requires it */ >> @@ -468,16 +467,15 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, >> >> mid = AllocMidQEntry(hdr, server); >> if (mid == NULL) >> - return -ENOMEM; >> + return ERR_PTR(-ENOMEM); >> >> - rc = cifs_sign_smbv(iov, nvec, server, &mid->sequence_number); >> + rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); >> if (rc) { >> DeleteMidQEntry(mid); >> - return rc; >> + return ERR_PTR(rc); >> } >> >> - *ret_mid = mid; >> - return 0; >> + return mid; >> } >> >> /* >> @@ -485,9 +483,9 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, >> * the result. Caller is responsible for dealing with timeouts. >> */ >> int >> -cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, >> - unsigned int nvec, mid_receive_t *receive, >> - mid_callback_t *callback, void *cbdata, const int flags) >> +cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst, >> + mid_receive_t *receive, mid_callback_t *callback, >> + void *cbdata, const int flags) >> { >> int rc, timeout, optype; >> struct mid_q_entry *mid; >> @@ -500,12 +498,12 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, >> return rc; >> >> mutex_lock(&server->srv_mutex); >> - rc = server->ops->setup_async_request(server, iov, nvec, &mid); >> - if (rc) { >> + mid = server->ops->setup_async_request(server, rqst); >> + if (IS_ERR(mid)) { >> mutex_unlock(&server->srv_mutex); >> add_credits(server, 1, optype); >> wake_up(&server->request_q); >> - return rc; >> + return PTR_ERR(mid); >> } >> >> mid->receive = receive; >> @@ -520,7 +518,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, >> >> >> cifs_in_send_inc(server); >> - rc = smb_sendv(server, iov, nvec); >> + rc = smb_send_rqst(server, rqst); >> cifs_in_send_dec(server); >> cifs_save_when_sent(mid); >> mutex_unlock(&server->srv_mutex); >> -- >> 1.7.11.2 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > Like the idea of changing setup_async_request prototype. > > Reviewed-by: Pavel Shilovsky <pshilovsky@samba.org> > > -- > Best regards, > Pavel Shilovsky.
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 2a7e4b8..a0bb713 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -194,8 +194,8 @@ struct smb_version_operations { int (*setup_request)(struct cifs_ses *, struct kvec *, unsigned int, struct mid_q_entry **); /* setup async request: allocate mid, sign message */ - int (*setup_async_request)(struct TCP_Server_Info *, struct kvec *, - unsigned int, struct mid_q_entry **); + struct mid_q_entry *(*setup_async_request)(struct TCP_Server_Info *, + struct smb_rqst *); /* check response: verify signature, map error */ int (*check_receive)(struct mid_q_entry *, struct TCP_Server_Info *, bool); diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 3620bec..8075f23 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h @@ -69,10 +69,10 @@ extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server); extern void DeleteMidQEntry(struct mid_q_entry *midEntry); extern void cifs_wake_up_task(struct mid_q_entry *mid); -extern int cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, - unsigned int nvec, mid_receive_t *receive, - mid_callback_t *callback, void *cbdata, - const int flags); +extern int cifs_call_async(struct TCP_Server_Info *server, + struct smb_rqst *rqst, + mid_receive_t *receive, mid_callback_t *callback, + void *cbdata, const int flags); extern int SendReceive(const unsigned int /* xid */ , struct cifs_ses *, struct smb_hdr * /* input */ , struct smb_hdr * /* out */ , @@ -81,8 +81,8 @@ extern int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses, char *in_buf, int flags); extern int cifs_setup_request(struct cifs_ses *, struct kvec *, unsigned int, struct mid_q_entry **); -extern int cifs_setup_async_request(struct TCP_Server_Info *, struct kvec *, - unsigned int, struct mid_q_entry **); +extern struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *, + struct smb_rqst *); extern int cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, bool log_error); extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *, diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index ce5f75c..7365460 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c @@ -751,6 +751,8 @@ CIFSSMBEcho(struct TCP_Server_Info *server) ECHO_REQ *smb; int rc = 0; struct kvec iov; + struct smb_rqst rqst = { .rq_iov = &iov, + .rq_nvec = 1 }; cFYI(1, "In echo request"); @@ -768,7 +770,7 @@ CIFSSMBEcho(struct TCP_Server_Info *server) iov.iov_base = smb; iov.iov_len = be32_to_cpu(smb->hdr.smb_buf_length) + 4; - rc = cifs_call_async(server, &iov, 1, NULL, cifs_echo_callback, + rc = cifs_call_async(server, &rqst, NULL, cifs_echo_callback, server, CIFS_ASYNC_OP | CIFS_ECHO_OP); if (rc) cFYI(1, "Echo request failed: %d", rc); @@ -1604,6 +1606,8 @@ cifs_async_readv(struct cifs_readdata *rdata) READ_REQ *smb = NULL; int wct; struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); + struct smb_rqst rqst = { .rq_iov = rdata->iov, + .rq_nvec = 1 }; cFYI(1, "%s: offset=%llu bytes=%u", __func__, rdata->offset, rdata->bytes); @@ -1647,9 +1651,8 @@ cifs_async_readv(struct cifs_readdata *rdata) rdata->iov[0].iov_len = be32_to_cpu(smb->hdr.smb_buf_length) + 4; kref_get(&rdata->refcount); - rc = cifs_call_async(tcon->ses->server, rdata->iov, 1, - cifs_readv_receive, cifs_readv_callback, - rdata, 0); + rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, + cifs_readv_callback, rdata, 0); if (rc == 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); @@ -2052,6 +2055,7 @@ cifs_async_writev(struct cifs_writedata *wdata) int wct; struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); struct kvec *iov = NULL; + struct smb_rqst rqst = { }; if (tcon->ses->capabilities & CAP_LARGE_FILES) { wct = 14; @@ -2068,11 +2072,13 @@ cifs_async_writev(struct cifs_writedata *wdata) goto async_writev_out; /* 1 iov per page + 1 for header */ - iov = kzalloc((wdata->nr_pages + 1) * sizeof(*iov), GFP_NOFS); + rqst.rq_nvec = wdata->nr_pages + 1; + iov = kzalloc((rqst.rq_nvec) * sizeof(*iov), GFP_NOFS); if (iov == NULL) { rc = -ENOMEM; goto async_writev_out; } + rqst.rq_iov = iov; smb->hdr.Pid = cpu_to_le16((__u16)wdata->pid); smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->pid >> 16)); @@ -2121,8 +2127,8 @@ cifs_async_writev(struct cifs_writedata *wdata) } kref_get(&wdata->refcount); - rc = cifs_call_async(tcon->ses->server, iov, wdata->nr_pages + 1, - NULL, cifs_writev_callback, wdata, 0); + rc = cifs_call_async(tcon->ses->server, &rqst, NULL, + cifs_writev_callback, wdata, 0); if (rc == 0) cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h index 902bbe2..dbb798c 100644 --- a/fs/cifs/smb2proto.h +++ b/fs/cifs/smb2proto.h @@ -43,9 +43,7 @@ extern int smb2_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, bool log_error); extern int smb2_setup_request(struct cifs_ses *ses, struct kvec *iov, unsigned int nvec, struct mid_q_entry **ret_mid); -extern int smb2_setup_async_request(struct TCP_Server_Info *server, - struct kvec *iov, unsigned int nvec, - struct mid_q_entry **ret_mid); +extern struct mid_q_entry *smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst); extern void smb2_echo_request(struct work_struct *work); extern int smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c index 31f5d42..c0a7a42 100644 --- a/fs/cifs/smb2transport.c +++ b/fs/cifs/smb2transport.c @@ -148,25 +148,23 @@ smb2_setup_request(struct cifs_ses *ses, struct kvec *iov, return rc; } -int -smb2_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, - unsigned int nvec, struct mid_q_entry **ret_mid) +struct mid_q_entry * +smb2_setup_async_request(struct TCP_Server_Info *server, + struct smb_rqst *rqst) { - int rc = 0; - struct smb2_hdr *hdr = (struct smb2_hdr *)iov[0].iov_base; + struct smb2_hdr *hdr = (struct smb2_hdr *)smb_rqst->iov[0].iov_base; struct mid_q_entry *mid; smb2_seq_num_into_buf(server, hdr); mid = smb2_mid_entry_alloc(hdr, server); if (mid == NULL) - return -ENOMEM; + return ERR_PTR(-ENOMEM); /* rc = smb2_sign_smb2(iov, nvec, server); if (rc) { DeleteMidQEntry(mid); return rc; }*/ - *ret_mid = mid; - return rc; + return mid; } diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 5673ef1..73cfa6f 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c @@ -454,12 +454,11 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ) return 0; } -int -cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, - unsigned int nvec, struct mid_q_entry **ret_mid) +struct mid_q_entry * +cifs_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst) { int rc; - struct smb_hdr *hdr = (struct smb_hdr *)iov[0].iov_base; + struct smb_hdr *hdr = (struct smb_hdr *)rqst->rq_iov[0].iov_base; struct mid_q_entry *mid; /* enable signing if server requires it */ @@ -468,16 +467,15 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, mid = AllocMidQEntry(hdr, server); if (mid == NULL) - return -ENOMEM; + return ERR_PTR(-ENOMEM); - rc = cifs_sign_smbv(iov, nvec, server, &mid->sequence_number); + rc = cifs_sign_rqst(rqst, server, &mid->sequence_number); if (rc) { DeleteMidQEntry(mid); - return rc; + return ERR_PTR(rc); } - *ret_mid = mid; - return 0; + return mid; } /* @@ -485,9 +483,9 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov, * the result. Caller is responsible for dealing with timeouts. */ int -cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, - unsigned int nvec, mid_receive_t *receive, - mid_callback_t *callback, void *cbdata, const int flags) +cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst, + mid_receive_t *receive, mid_callback_t *callback, + void *cbdata, const int flags) { int rc, timeout, optype; struct mid_q_entry *mid; @@ -500,12 +498,12 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, return rc; mutex_lock(&server->srv_mutex); - rc = server->ops->setup_async_request(server, iov, nvec, &mid); - if (rc) { + mid = server->ops->setup_async_request(server, rqst); + if (IS_ERR(mid)) { mutex_unlock(&server->srv_mutex); add_credits(server, 1, optype); wake_up(&server->request_q); - return rc; + return PTR_ERR(mid); } mid->receive = receive; @@ -520,7 +518,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, cifs_in_send_inc(server); - rc = smb_sendv(server, iov, nvec); + rc = smb_send_rqst(server, rqst); cifs_in_send_dec(server); cifs_save_when_sent(mid); mutex_unlock(&server->srv_mutex);
For now, none of the callers populate rq_pages. That will be done for writes in a later patch. While we're at it, change the prototype of setup_async_request not to need a return pointer argument. Just return the pointer to the mid_q_entry or an ERR_PTR. Signed-off-by: Jeff Layton <jlayton@redhat.com> --- fs/cifs/cifsglob.h | 4 ++-- fs/cifs/cifsproto.h | 12 ++++++------ fs/cifs/cifssmb.c | 20 +++++++++++++------- fs/cifs/smb2proto.h | 4 +--- fs/cifs/smb2transport.c | 14 ++++++-------- fs/cifs/transport.c | 30 ++++++++++++++---------------- 6 files changed, 42 insertions(+), 42 deletions(-)