Re: [PATCH 09/13] cifs: add cifs_call_async

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2010/12/10 Jeff Layton <jlayton@xxxxxxxxxx>:
> Add a function that will send a request, and set up the mid for an
> async reply.
>
> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> ---
>  fs/cifs/cifsproto.h |    5 ++++
>  fs/cifs/transport.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 57 insertions(+), 1 deletions(-)
>
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index a8fc606..6131c1b 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -61,7 +61,12 @@ extern char *cifs_compose_mount_options(const char *sb_mountdata,
>                const char *fullpath, const struct dfs_info3_param *ref,
>                char **devname);
>  /* extern void renew_parental_timestamps(struct dentry *direntry);*/
> +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 int cifs_call_async(struct TCP_Server_Info *server,
> +                          struct smb_hdr *in_buf, mid_callback_t *callback,
> +                          void *cbdata);
>  extern int SendReceive(const unsigned int /* xid */ , struct cifsSesInfo *,
>                        struct smb_hdr * /* input */ ,
>                        struct smb_hdr * /* out */ ,
> diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
> index 97a1170..2a0b14d 100644
> --- a/fs/cifs/transport.c
> +++ b/fs/cifs/transport.c
> @@ -42,7 +42,7 @@ wake_up_task(struct mid_q_entry *mid)
>        wake_up_process(mid->callback_data);
>  }
>
> -static struct mid_q_entry *
> +struct mid_q_entry *
>  AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
>  {
>        struct mid_q_entry *temp;
> @@ -338,6 +338,57 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ)
>
>
>  /*
> + * Send a SMB request and set the callback function in the mid to handle
> + * the result. Caller is responsible for dealing with timeouts.
> + */
> +int
> +cifs_call_async(struct TCP_Server_Info *server, struct smb_hdr *in_buf,
> +               mid_callback_t *callback, void *cbdata)
> +{
> +       int rc;
> +       struct mid_q_entry *mid;
> +
> +       rc = wait_for_free_request(server, CIFS_ASYNC_OP);
> +       if (rc)
> +               return rc;
> +
> +       mutex_lock(&server->srv_mutex);
> +       mid = AllocMidQEntry(in_buf, server);
> +       if (mid == NULL) {
> +               mutex_unlock(&server->srv_mutex);
> +               return -ENOMEM;
> +       }
> +
> +       rc = cifs_sign_smb(in_buf, server, &mid->sequence_number);
> +       if (rc) {
> +               mutex_unlock(&server->srv_mutex);
> +               goto out_err;
> +       }
> +
> +       mid->callback = callback;
> +       mid->callback_data = cbdata;
> +       mid->midState = MID_REQUEST_SUBMITTED;
> +#ifdef CONFIG_CIFS_STATS2
> +       atomic_inc(&server->inSend);
> +#endif
> +       rc = smb_send(server, in_buf, in_buf->smb_buf_length);
> +#ifdef CONFIG_CIFS_STATS2
> +       atomic_dec(&server->inSend);
> +       mid->when_sent = jiffies;
> +#endif
> +       mutex_unlock(&server->srv_mutex);
> +       if (rc)
> +               goto out_err;
> +
> +       return rc;
> +out_err:
> +       DeleteMidQEntry(mid);
> +       atomic_dec(&server->inFlight);
> +       wake_up(&server->request_q);
> +       return rc;
> +}
> +
> +/*
>  *
>  * Send an SMB Request.  No response info (other than return code)
>  * needs to be parsed.
> --
> 1.7.3.2
>


Reviewed-by: Pavel Shilovsky <piastryyy@xxxxxxxxx>

-- 
Best regards,
Pavel Shilovsky.
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux