* [PATCH] cifs: prepare SMB2_Flush to be usable in compounds
@ 2019-07-16 5:07 Ronnie Sahlberg
2019-07-17 18:48 ` Pavel Shilovsky
0 siblings, 1 reply; 3+ messages in thread
From: Ronnie Sahlberg @ 2019-07-16 5:07 UTC (permalink / raw)
To: linux-cifs; +Cc: Steve French, Ronnie Sahlberg
Create smb2_flush_init() and smb2_flush_free() so we can use the flush command
in compounds.
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
---
fs/cifs/smb2pdu.c | 58 ++++++++++++++++++++++++++++++++++++-----------------
fs/cifs/smb2proto.h | 4 ++++
2 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index f58e4dc3987b..b352f453a6d2 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -3262,44 +3262,64 @@ SMB2_echo(struct TCP_Server_Info *server)
return rc;
}
+void
+SMB2_flush_free(struct smb_rqst *rqst)
+{
+ if (rqst && rqst->rq_iov)
+ cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */
+}
+
int
-SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
- u64 volatile_fid)
+SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
+ struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid)
{
- struct smb_rqst rqst;
struct smb2_flush_req *req;
- struct cifs_ses *ses = tcon->ses;
- struct kvec iov[1];
- struct kvec rsp_iov;
- int resp_buftype;
- int rc = 0;
- int flags = 0;
+ struct kvec *iov = rqst->rq_iov;
unsigned int total_len;
-
- cifs_dbg(FYI, "Flush\n");
-
- if (!ses || !(ses->server))
- return -EIO;
+ int rc;
rc = smb2_plain_req_init(SMB2_FLUSH, tcon, (void **) &req, &total_len);
if (rc)
return rc;
- if (smb3_encryption_required(tcon))
- flags |= CIFS_TRANSFORM_REQ;
-
req->PersistentFileId = persistent_fid;
req->VolatileFileId = volatile_fid;
iov[0].iov_base = (char *)req;
iov[0].iov_len = total_len;
+ return 0;
+}
+
+int
+SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
+ u64 volatile_fid)
+{
+ struct cifs_ses *ses = tcon->ses;
+ struct smb_rqst rqst;
+ struct kvec iov[1];
+ struct kvec rsp_iov = {NULL, 0};
+ int resp_buftype = CIFS_NO_BUFFER;
+ int flags = 0;
+ int rc = 0;
+
+ cifs_dbg(FYI, "flush\n");
+ if (!ses || !(ses->server))
+ return -EIO;
+
+ if (smb3_encryption_required(tcon))
+ flags |= CIFS_TRANSFORM_REQ;
+
memset(&rqst, 0, sizeof(struct smb_rqst));
+ memset(&iov, 0, sizeof(iov));
rqst.rq_iov = iov;
rqst.rq_nvec = 1;
+ rc = SMB2_flush_init(xid, &rqst, tcon, persistent_fid, volatile_fid);
+ if (rc)
+ goto flush_exit;
+
rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
- cifs_small_buf_release(req);
if (rc != 0) {
cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE);
@@ -3307,6 +3327,8 @@ SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
rc);
}
+ flush_exit:
+ SMB2_flush_free(&rqst);
free_rsp_buf(resp_buftype, rsp_iov.iov_base);
return rc;
}
diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
index 52df125e9189..e4ca98cf3af3 100644
--- a/fs/cifs/smb2proto.h
+++ b/fs/cifs/smb2proto.h
@@ -158,6 +158,10 @@ extern int SMB2_close_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
extern void SMB2_close_free(struct smb_rqst *rqst);
extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,
u64 persistent_file_id, u64 volatile_file_id);
+extern int SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
+ struct cifs_tcon *tcon,
+ u64 persistent_file_id, u64 volatile_file_id);
+extern void SMB2_flush_free(struct smb_rqst *rqst);
extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
u64 persistent_file_id, u64 volatile_file_id,
struct smb2_file_all_info *data);
--
2.13.6
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] cifs: prepare SMB2_Flush to be usable in compounds
2019-07-16 5:07 [PATCH] cifs: prepare SMB2_Flush to be usable in compounds Ronnie Sahlberg
@ 2019-07-17 18:48 ` Pavel Shilovsky
2019-07-17 21:40 ` ronnie sahlberg
0 siblings, 1 reply; 3+ messages in thread
From: Pavel Shilovsky @ 2019-07-17 18:48 UTC (permalink / raw)
To: Ronnie Sahlberg; +Cc: linux-cifs, Steve French
пн, 15 июл. 2019 г. в 22:07, Ronnie Sahlberg <lsahlber@redhat.com>:
>
> Create smb2_flush_init() and smb2_flush_free() so we can use the flush command
> in compounds.
>
> Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
> ---
> fs/cifs/smb2pdu.c | 58 ++++++++++++++++++++++++++++++++++++-----------------
> fs/cifs/smb2proto.h | 4 ++++
> 2 files changed, 44 insertions(+), 18 deletions(-)
>
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index f58e4dc3987b..b352f453a6d2 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -3262,44 +3262,64 @@ SMB2_echo(struct TCP_Server_Info *server)
> return rc;
> }
>
> +void
> +SMB2_flush_free(struct smb_rqst *rqst)
> +{
> + if (rqst && rqst->rq_iov)
> + cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */
> +}
> +
> int
> -SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
> - u64 volatile_fid)
> +SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
> + struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid)
> {
> - struct smb_rqst rqst;
> struct smb2_flush_req *req;
> - struct cifs_ses *ses = tcon->ses;
> - struct kvec iov[1];
> - struct kvec rsp_iov;
> - int resp_buftype;
> - int rc = 0;
> - int flags = 0;
> + struct kvec *iov = rqst->rq_iov;
> unsigned int total_len;
> -
> - cifs_dbg(FYI, "Flush\n");
> -
> - if (!ses || !(ses->server))
> - return -EIO;
> + int rc;
>
> rc = smb2_plain_req_init(SMB2_FLUSH, tcon, (void **) &req, &total_len);
> if (rc)
> return rc;
>
> - if (smb3_encryption_required(tcon))
> - flags |= CIFS_TRANSFORM_REQ;
> -
> req->PersistentFileId = persistent_fid;
> req->VolatileFileId = volatile_fid;
>
> iov[0].iov_base = (char *)req;
> iov[0].iov_len = total_len;
>
> + return 0;
> +}
> +
> +int
> +SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
> + u64 volatile_fid)
> +{
> + struct cifs_ses *ses = tcon->ses;
> + struct smb_rqst rqst;
> + struct kvec iov[1];
> + struct kvec rsp_iov = {NULL, 0};
> + int resp_buftype = CIFS_NO_BUFFER;
> + int flags = 0;
> + int rc = 0;
> +
> + cifs_dbg(FYI, "flush\n");
> + if (!ses || !(ses->server))
> + return -EIO;
> +
> + if (smb3_encryption_required(tcon))
> + flags |= CIFS_TRANSFORM_REQ;
> +
> memset(&rqst, 0, sizeof(struct smb_rqst));
> + memset(&iov, 0, sizeof(iov));
> rqst.rq_iov = iov;
> rqst.rq_nvec = 1;
>
> + rc = SMB2_flush_init(xid, &rqst, tcon, persistent_fid, volatile_fid);
> + if (rc)
> + goto flush_exit;
> +
> rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
> - cifs_small_buf_release(req);
>
> if (rc != 0) {
> cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE);
> @@ -3307,6 +3327,8 @@ SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
> rc);
> }
>
> + flush_exit:
The extra space before the label is not needed.
> + SMB2_flush_free(&rqst);
> free_rsp_buf(resp_buftype, rsp_iov.iov_base);
> return rc;
> }
> diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
> index 52df125e9189..e4ca98cf3af3 100644
> --- a/fs/cifs/smb2proto.h
> +++ b/fs/cifs/smb2proto.h
> @@ -158,6 +158,10 @@ extern int SMB2_close_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
> extern void SMB2_close_free(struct smb_rqst *rqst);
> extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,
> u64 persistent_file_id, u64 volatile_file_id);
> +extern int SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
> + struct cifs_tcon *tcon,
> + u64 persistent_file_id, u64 volatile_file_id);
> +extern void SMB2_flush_free(struct smb_rqst *rqst);
> extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
> u64 persistent_file_id, u64 volatile_file_id,
> struct smb2_file_all_info *data);
> --
> 2.13.6
>
Just wondering how are you going to use this? Compound flush and
setattr to be sent together?
--
Best regards,
Pavel Shilovsky
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] cifs: prepare SMB2_Flush to be usable in compounds
2019-07-17 18:48 ` Pavel Shilovsky
@ 2019-07-17 21:40 ` ronnie sahlberg
0 siblings, 0 replies; 3+ messages in thread
From: ronnie sahlberg @ 2019-07-17 21:40 UTC (permalink / raw)
To: Pavel Shilovsky; +Cc: Ronnie Sahlberg, linux-cifs, Steve French
On Thu, Jul 18, 2019 at 4:48 AM Pavel Shilovsky <piastryyy@gmail.com> wrote:
>
> пн, 15 июл. 2019 г. в 22:07, Ronnie Sahlberg <lsahlber@redhat.com>:
> >
> > Create smb2_flush_init() and smb2_flush_free() so we can use the flush command
> > in compounds.
> >
> > Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
> > ---
> > fs/cifs/smb2pdu.c | 58 ++++++++++++++++++++++++++++++++++++-----------------
> > fs/cifs/smb2proto.h | 4 ++++
> > 2 files changed, 44 insertions(+), 18 deletions(-)
> >
> > diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> > index f58e4dc3987b..b352f453a6d2 100644
> > --- a/fs/cifs/smb2pdu.c
> > +++ b/fs/cifs/smb2pdu.c
> > @@ -3262,44 +3262,64 @@ SMB2_echo(struct TCP_Server_Info *server)
> > return rc;
> > }
> >
> > +void
> > +SMB2_flush_free(struct smb_rqst *rqst)
> > +{
> > + if (rqst && rqst->rq_iov)
> > + cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */
> > +}
> > +
> > int
> > -SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
> > - u64 volatile_fid)
> > +SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
> > + struct cifs_tcon *tcon, u64 persistent_fid, u64 volatile_fid)
> > {
> > - struct smb_rqst rqst;
> > struct smb2_flush_req *req;
> > - struct cifs_ses *ses = tcon->ses;
> > - struct kvec iov[1];
> > - struct kvec rsp_iov;
> > - int resp_buftype;
> > - int rc = 0;
> > - int flags = 0;
> > + struct kvec *iov = rqst->rq_iov;
> > unsigned int total_len;
> > -
> > - cifs_dbg(FYI, "Flush\n");
> > -
> > - if (!ses || !(ses->server))
> > - return -EIO;
> > + int rc;
> >
> > rc = smb2_plain_req_init(SMB2_FLUSH, tcon, (void **) &req, &total_len);
> > if (rc)
> > return rc;
> >
> > - if (smb3_encryption_required(tcon))
> > - flags |= CIFS_TRANSFORM_REQ;
> > -
> > req->PersistentFileId = persistent_fid;
> > req->VolatileFileId = volatile_fid;
> >
> > iov[0].iov_base = (char *)req;
> > iov[0].iov_len = total_len;
> >
> > + return 0;
> > +}
> > +
> > +int
> > +SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
> > + u64 volatile_fid)
> > +{
> > + struct cifs_ses *ses = tcon->ses;
> > + struct smb_rqst rqst;
> > + struct kvec iov[1];
> > + struct kvec rsp_iov = {NULL, 0};
> > + int resp_buftype = CIFS_NO_BUFFER;
> > + int flags = 0;
> > + int rc = 0;
> > +
> > + cifs_dbg(FYI, "flush\n");
> > + if (!ses || !(ses->server))
> > + return -EIO;
> > +
> > + if (smb3_encryption_required(tcon))
> > + flags |= CIFS_TRANSFORM_REQ;
> > +
> > memset(&rqst, 0, sizeof(struct smb_rqst));
> > + memset(&iov, 0, sizeof(iov));
> > rqst.rq_iov = iov;
> > rqst.rq_nvec = 1;
> >
> > + rc = SMB2_flush_init(xid, &rqst, tcon, persistent_fid, volatile_fid);
> > + if (rc)
> > + goto flush_exit;
> > +
> > rc = cifs_send_recv(xid, ses, &rqst, &resp_buftype, flags, &rsp_iov);
> > - cifs_small_buf_release(req);
> >
> > if (rc != 0) {
> > cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE);
> > @@ -3307,6 +3327,8 @@ SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
> > rc);
> > }
> >
> > + flush_exit:
>
> The extra space before the label is not needed.
>
> > + SMB2_flush_free(&rqst);
> > free_rsp_buf(resp_buftype, rsp_iov.iov_base);
> > return rc;
> > }
> > diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
> > index 52df125e9189..e4ca98cf3af3 100644
> > --- a/fs/cifs/smb2proto.h
> > +++ b/fs/cifs/smb2proto.h
> > @@ -158,6 +158,10 @@ extern int SMB2_close_init(struct cifs_tcon *tcon, struct smb_rqst *rqst,
> > extern void SMB2_close_free(struct smb_rqst *rqst);
> > extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,
> > u64 persistent_file_id, u64 volatile_file_id);
> > +extern int SMB2_flush_init(const unsigned int xid, struct smb_rqst *rqst,
> > + struct cifs_tcon *tcon,
> > + u64 persistent_file_id, u64 volatile_file_id);
> > +extern void SMB2_flush_free(struct smb_rqst *rqst);
> > extern int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon,
> > u64 persistent_file_id, u64 volatile_file_id,
> > struct smb2_file_all_info *data);
> > --
> > 2.13.6
> >
>
> Just wondering how are you going to use this? Compound flush and
> setattr to be sent together?
Yeah, I was thinking about expeprimenting in that direction.
>
> --
> Best regards,
> Pavel Shilovsky
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2019-07-17 21:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-16 5:07 [PATCH] cifs: prepare SMB2_Flush to be usable in compounds Ronnie Sahlberg
2019-07-17 18:48 ` Pavel Shilovsky
2019-07-17 21:40 ` ronnie sahlberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).