2012/7/26 Pavel Shilovsky <[email protected]>:
> 2012/7/25 Pavel Shilovsky <[email protected]>:
>> 2012/7/25 Jeff Layton <[email protected]>:
>>> 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 <[email protected]>
>>> ---
>>> 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 [email protected]
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>> Like the idea of changing setup_async_request prototype.
>>
>> Reviewed-by: Pavel Shilovsky <[email protected]>
>>
>> --
>> Best regards,
>> Pavel Shilovsky.
>
>
>
> --
> Best regards,
> Pavel Shilovsky.
Also it doesn't build - needs smth like this:
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 62b3f17..a525db4 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -1102,6 +1102,8 @@ SMB2_echo(struct TCP_Server_Info *server)
struct smb2_echo_req *req;
int rc = 0;
struct kvec iov;
+ struct smb_rqst rqst = { .rq_iov = &iov,
+ .rq_nvec = 1 };
cFYI(1, "In echo request");
@@ -1115,7 +1117,7 @@ SMB2_echo(struct TCP_Server_Info *server)
/* 4 for rfc1002 length field */
iov.iov_len = get_rfc1002_length(req) + 4;
- rc = cifs_call_async(server, &iov, 1, NULL, smb2_echo_callback, server,
+ rc = cifs_call_async(server, &rqst, NULL, smb2_echo_callback, server,
CIFS_ECHO_OP);
if (rc)
cFYI(1, "Echo request failed: %d", rc);
diff --git a/fs/cifs/smb2transport.c b/fs/cifs/smb2transport.c
index c0a7a42..ee20740 100644
--- a/fs/cifs/smb2transport.c
+++ b/fs/cifs/smb2transport.c
@@ -152,7 +152,7 @@ struct mid_q_entry *
smb2_setup_async_request(struct TCP_Server_Info *server,
struct smb_rqst *rqst)
{
- struct smb2_hdr *hdr = (struct smb2_hdr *)smb_rqst->iov[0].iov_base;
+ struct smb2_hdr *hdr = (struct smb2_hdr *)rqst->rq_iov[0].iov_base;
struct mid_q_entry *mid;
smb2_seq_num_into_buf(server, hdr);
--
Best regards,
Pavel Shilovsky.
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html