A question about SQL-over-CIFS

Peter Chacko <[email protected]>
Newsgroups gmane.linux.file-systems.cifs
Message-ID <[email protected]>
Could any one share their experience with SQL server over a CIFS share
?  Assuming that i am not hosting transactional work load on the
database, does any one think that SQL-CIFS stack is not a good
solution ?  Here i use Database as a file level storage appliance
where i store write-once, read-mostly IO pattern is more common.  DBAs
are happy with MySQL or ORACLE over NFS. Does that hold true for
database-over-CIFS as well ?

Thanks a lot for your input/thoughts.
Peter chacko,


On Thu, Oct 15, 2009 at 11:10 PM,
<[email protected]> wrote:
> Send linux-cifs-client mailing list submissions to
>        [email protected]
>
> To subscribe or unsubscribe via the World Wide Web, visit
>        https://lists.samba.org/mailman/listinfo/linux-cifs-client
> or, via email, send a message with subject or body 'help' to
>        [email protected]
>
> You can reach the person managing the list at
>        [email protected]
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of linux-cifs-client digest..."
>
>
> Today's Topics:
>
>   1. TCP_NODELAY and CORK - should they be added for   network fs
>      case? (Steve French)
>   2. [patch][0/3] Add support infrastructure for       Named Pipe
>      (Shirish Pargaonkar)
>   3. [patch][1/3] Data structures and defines for      Named Pipes
>      (Shirish Pargaonkar)
>   4. [patch][2/3] SMBTrans functions for Named Pipes
>      (Shirish Pargaonkar)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Thu, 15 Oct 2009 12:32:28 -0500
> From: Steve French <[email protected]>
> To: [email protected]
> Cc: [email protected]
> Subject: [linux-cifs-client] TCP_NODELAY and CORK - should they be
>        added for       network fs case?
> Message-ID:
>        <[email protected]>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Looking at calls to kernel_sendmsg, and thinking about why I only see
> a few places that do TCP_NODELAY and TCP_CORK in kernel.
>
> Looking at the cifs example.  cifs is trying to send packets which
> vary from about 50-100 bytes for common calls (like lookup) to about
> 56K for file writes (can be larger if override wsize and max buffer
> size via insmod parameter), and cifs always uses kernel_sendmsg.   For
> the cifs case, sending individual SMB/CIFS requests to a particular
> server (socket) are serialized, protected by a mutex, even if many
> processes are writing to different remote files at one time.
> Usually one kernel_sendmsg is all that is needed to send an SMB
> request - does kernel_sendmsg implicitly "cork" the request so that
> the SMB is not unnecessarily fragmented?  If the socket is full, and
> only a few bytes are sent, multiple sendmsg's may be required to send
> one smb - should cifs be doing a cork before the loop which calls
> kernel_sendmsg in smb_sendv in fs/cifs/transport.c and uncork
> afterward (since the server can't do much processing without getting
> the whole SMB request except in one narrow case of receivefile on
> certain write requests)?    Especially if we add code to allow setting
> "TCP_NODELAY" ... to improve GigE performance
>
> Are there any cases where we should be setting LOWDELAY instead for
> this kind of socket?
>
> --
> Thanks,
>
> Steve
>
>
> ------------------------------
>
> Message: 2
> Date: Thu, 15 Oct 2009 12:36:23 -0500
> From: Shirish Pargaonkar <[email protected]>
> To: [email protected],  linux-fsdevel
>        <[email protected]>
> Subject: [linux-cifs-client] [patch][0/3] Add support infrastructure
>        for     Named Pipe
> Message-ID:
>        <[email protected]>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Add Named Pipe support in cifs client.
>
> Since there are no equivalent kernel APIs for transactions, most of the
> SMBTrans
> functions are implemented using ioctls which are handle based, like the
> APIs used for Named Pipes.
>
> A path based function, WaitNamedPipe is not implemented at this time.
> Also not implemented support for multiple fragments in TransactNmPipe
> function.
>
>
> Signed-off-by: Shirish Pargaonkar [email protected]
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://lists.samba.org/pipermail/linux-cifs-client/attachments/20091015/37c584b2/attachment-0001.html>
>
> ------------------------------
>
> Message: 3
> Date: Thu, 15 Oct 2009 12:40:00 -0500
> From: Shirish Pargaonkar <[email protected]>
> To: [email protected],  linux-fsdevel
>        <[email protected]>
> Subject: [linux-cifs-client] [patch][1/3] Data structures and defines
>        for     Named Pipes
> Message-ID:
>        <[email protected]>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Add data structures and defines (ioctl commands etc.) for Named Pipe
> support in cifs
>
> >From 02cc49c80d125beac34cf82d312f5f221311dd62 Mon Sep 17 00:00:00 2001
> From: Shirish Pargaonkar <[email protected]>
> Date: Thu, 15 Oct 2009 08:14:44 -0500
> Subject: [PATCH] Header file changes for Named Pipe support
>
> ---
>  fs/cifs/cifsglob.h  |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/cifs/cifspdu.h   |   45 +++++++++++++++++++++++++++++++++++++++++++++
>  fs/cifs/cifsproto.h |   15 +++++++++++++++
>  3 files changed, 108 insertions(+), 0 deletions(-)
>
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 5d0fde1..6ee9dae 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -612,6 +612,54 @@ require use of the stronger protocol */
>  *****************************************************************
>  */
>
> +/*
> + *****************************************************************
> + * Named Pipe data structures and ioctl commands
> + *****************************************************************
> + */
> +
> +#define MAXPIPENAMELEN 256
> +#define MAXPEEKNMBUFSIZE 8192
> +
> +struct qnmp_info {
> +       unsigned short outbuf;
> +       unsigned short inbuf;
> +       unsigned char maxinst;
> +       unsigned char curinst;
> +       unsigned char length;
> +       char pipename[MAXPIPENAMELEN];
> +};
> +
> +struct qnmp_hinfo {
> +       unsigned short mode;
> +};
> +
> +struct peeknmp_info {
> +       unsigned int size;
> +       unsigned short bavail;
> +       unsigned short bremain;
> +       unsigned short conntype;
> +       char buffer[MAXPEEKNMBUFSIZE];
> +};
> +
> +struct transnmp_info {
> +       unsigned int wsize;
> +       char sendbuf[MAXPEEKNMBUFSIZE];
> +       unsigned rsize;
> +       char recvbuf[MAXPEEKNMBUFSIZE];
> +};
> +
> +#define CIFS_QUERYNMPIPE _IOR(0xCF, 0x3, struct qnmp_info)
> +#define CIFS_PEEKNMPIPE _IOWR(0xCF, 0x4, struct peeknmp_info)
> +#define CIFS_GETNMPIPEHANDSTATE _IOR(0xCF, 0x5, struct qnmp_hinfo)
> +#define CIFS_SETNMPIPEHANDSTATE _IOW(0xCF, 0x6, struct qnmp_hinfo)
> +#define CIFS_TRANSACTNMPIPE _IOWR(0xCF, 0x7, struct qnmp_hinfo)
> +
> +#define NONBLOCKINGNMPIPE 0x0008
> +#define BLOCKINGNMPIPE 0x0004
> +#define MESSAGENMREAD 0x0002
> +#define BYTESTREAMNMREAD 0x0001
> +
>  #define UID_HASH (16)
>
>  /*
> diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h
> index 2d07f89..df922dc 100644
> --- a/fs/cifs/cifspdu.h
> +++ b/fs/cifs/cifspdu.h
> @@ -49,6 +49,7 @@
>  #define SMB_COM_QUERY_INFORMATION     0x08 /* aka getattr */
>  #define SMB_COM_SETATTR               0x09 /* trivial response */
>  #define SMB_COM_LOCKING_ANDX          0x24 /* trivial response */
> +#define SMB_COM_TRANSACTION           0x25
>  #define SMB_COM_COPY                  0x29 /* trivial rsp, fail
> filename ignrd*/
>  #define SMB_COM_OPEN_ANDX             0x2D /* Legacy open for old servers */
>  #define SMB_COM_READ_ANDX             0x2E
> @@ -1269,6 +1270,50 @@ typedef struct smb_com_ntransact_rsp {
>        /* parms and data follow */
>  } __attribute__((packed)) NTRANSACT_RSP;
>
> +typedef struct smb_com_transact_req {
> +       struct smb_hdr hdr; /* wct >= 19 */
> +       __le16 TotalParameterCount;
> +       __le16 TotalDataCount;
> +       __le16 MaxParameterCount;
> +       __le16 MaxDataCount;
> +       __u8 MaxSetupCount;
> +       __u8 Reserved;
> +       __u16 Flags;
> +       __le32 Timeout;
> +       __le16 Reserved1;
> +       __le16 ParameterCount;
> +       __le16 ParameterOffset;
> +       __le16 DataCount;
> +       __le16 DataOffset;
> +       __u8 SetupCount;
> +       __u8 Reserved2;
> +       __le16 Function;
> +       __le16 Fid;
> +       __le16 ByteCount;
> +       unsigned char pad[1];
> +       unsigned char Name[1];
> +       unsigned char Param[1];
> +       unsigned char Data[1];
> +} __attribute__((packed)) TRANS_REQ;
> +
> +typedef struct smb_com_transact_rsp {
> +       struct smb_hdr hdr;     /* wct = 18 */
> +       __u16 Reserved;
> +       __le16 TotalParameterCount;
> +       __le16 TotalDataCount;
> +       __le16 ParameterCount;
> +       __le16 ParameterOffset;
> +       __le16 ParameterDisplacement;
> +       __le16 DataCount;
> +       __le16 DataOffset;
> +       __le16 DataDisplacement;
> +       __u8 SetupCount;   /* 0 */
> +       __u16 ByteCount;
> +       __u8 Reserved1;
> +       /* __u8 Pad[3]; */
> +       /* parms and data follow */
> +} __attribute__((packed)) TRANS_RSP;
> +
>  typedef struct smb_com_transaction_ioctl_req {
>        struct smb_hdr hdr;     /* wct = 23 */
>        __u8 MaxSetupCount;
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 6928c24..21e553f 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -388,4 +388,19 @@ extern int CIFSSMBSetPosixACL(const int xid,
> struct cifsTconInfo *tcon,
>                const struct nls_table *nls_codepage, int remap_special_chars);
>  extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon,
>                        const int netfid, __u64 *pExtAttrBits, __u64 *pMask);
> +extern int CIFSSMBTransQNmPipe(const int, struct cifsTconInfo *,
> +                unsigned long, __u16, const struct nls_table *, int);
> +extern int CIFSSMBTransSetNmPHState(const int, struct cifsTconInfo *,
> +               unsigned long, __u16, const struct nls_table *, int);
> +extern int CIFSSMBTranWaitNmPipe(const int, struct cifsTconInfo *,
> +                const unsigned char *, unsigned char *,
> +               __u16, const struct nls_table *, int);
> +extern int CIFSSMBTransPeekNmPipe(const int, struct cifsTconInfo *,
> +                unsigned long, __u16, const struct nls_table *, int);
> +extern int CIFSSMBTransGetNmPHState(const int, struct cifsTconInfo *,
> +               unsigned long, __u16, const struct nls_table *, int);
> +extern int CIFSSMBTransNmPipe(const int, struct cifsTconInfo *,
> +               unsigned char *, __u16, const struct nls_table *, int);
> +extern int ChkNMPHmode(unsigned short);
> +extern unsigned short SetNMPHmode(unsigned short, unsigned short);
>  #endif                 /* _CIFSPROTO_H */
> --
> 1.5.2
>
>
> ------------------------------
>
> Message: 4
> Date: Thu, 15 Oct 2009 12:41:51 -0500
> From: Shirish Pargaonkar <[email protected]>
> To: [email protected],  linux-fsdevel
>        <[email protected]>
> Subject: [linux-cifs-client] [patch][2/3] SMBTrans functions for Named
>        Pipes
> Message-ID:
>        <[email protected]>
> Content-Type: text/plain; charset=ISO-8859-1
>
> SMB Trans commands (except WaitNamedPipe)
>
> >From d11c8d19f9e1bf5d3ed615a38ce99e97dfe0b7dd Mon Sep 17 00:00:00 2001
> From: Shirish Pargaonkar <[email protected]>
> Date: Thu, 15 Oct 2009 08:16:26 -0500
> Subject: [PATCH] SMB Trans functions for Named Pipe support
>
> ---
>  fs/cifs/cifssmb.c |  488 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 488 insertions(+), 0 deletions(-)
>
> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
> index 941441d..9d6b77b 100644
> --- a/fs/cifs/cifssmb.c
> +++ b/fs/cifs/cifssmb.c
> @@ -5675,4 +5675,492 @@ SetEARetry:
>        return rc;
>  }
>
> +int
> +CIFSSMBTransQNmPipe(const int xid, struct cifsTconInfo *tcon,
> +               unsigned long arg, __u16 netfid,
> +               const struct nls_table *nls_codepage, int remap)
> +{
> +       TRANS_REQ *pSMB = NULL;
> +       TRANS_RSP *pSMBr = NULL;
> +       int rc = 0;
> +       int name_len, param_len;
> +       int pad;
> +       int bytes_returned = 0;
> +       __u16 offset;
> +       __u16 byte_count = 0;
> +       char *fileName = "\\PIPE\\";
> +       char *bcc_ptr;
> +       struct qnmp_info qnmpipeinfo;
> +
> +       cFYI(1, ("In CIFSSMBTransQNmPipe"));
> +qnmpiperetry:
> +       rc = smb_init(SMB_COM_TRANSACTION, 16, tcon, (void **) &pSMB,
> +                     (void **) &pSMBr);
> +       if (rc)
> +               return rc;
> +
> +       offset = offsetof(TRANS_REQ, Name) - 4;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
> +               name_len =
> +                   cifsConvertToUCS((__le16 *) bcc_ptr, fileName,
> +                                    PATH_MAX, nls_codepage, remap);
> +               name_len++;     /* trailing null */
> +               name_len *= 2;
> +       } else {        /* BB improve the check for buffer overruns BB */
> +               name_len = strnlen(fileName, PATH_MAX);
> +               name_len++;     /* trailing null */
> +               strncpy(bcc_ptr, fileName, name_len);
> +       }
> +       byte_count += (1 + pad + name_len);
> +
> +       offset += name_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->ParameterCount = 2;
> +       pSMB->TotalParameterCount = 2;
> +       pSMB->ParameterOffset = offset;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       *bcc_ptr++ = 0x1;
> +       *bcc_ptr = 0x0;
> +       param_len = 2;
> +       byte_count += (pad + param_len);
> +
> +       offset += param_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->DataOffset = 0;
> +       pSMB->DataCount = 0;
> +       pSMB->TotalDataCount = 0;
> +
> +       pSMB->MaxParameterCount = 0;
> +       /* BB find max SMB PDU from sess */
> +       pSMB->MaxDataCount = cpu_to_le16(4280);
> +       pSMB->MaxSetupCount = 0;
> +
> +       pSMB->Flags = 0;
> +       pSMB->Timeout = 0;
> +
> +       pSMB->SetupCount = 2;
> +       pSMB->Function = cpu_to_le16(TRANS_QUERY_NMPIPE_INFO);
> +       pSMB->Fid = cpu_to_le16(netfid);
> +
> +       pSMB->ByteCount = cpu_to_le16(byte_count);
> +
> +       pSMB->hdr.smb_buf_length += byte_count;
> +       rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
> +                        (struct smb_hdr *) pSMBr, &bytes_returned, 0);
> +       if (rc) {
> +               cFYI(1, ("CIFSSMBTransQNmPipe returned %d", rc));
> +       } else {
> +               offset = le16_to_cpu(pSMBr->DataOffset);
> +               bcc_ptr = (char *)pSMBr + offset + 4;
> +               qnmpipeinfo.outbuf = le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               bcc_ptr += 2;
> +               qnmpipeinfo.inbuf = le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               bcc_ptr += 2;
> +               qnmpipeinfo.maxinst = le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               bcc_ptr += 2;
> +               qnmpipeinfo.curinst = *bcc_ptr;
> +               bcc_ptr += 2;
> +               qnmpipeinfo.length = *bcc_ptr;
> +               bcc_ptr += 2;
> +               if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) {
> +                       rc = cifs_from_ucs2(qnmpipeinfo.pipename,
> +                               (__le16 *)bcc_ptr,
> +                               (int)qnmpipeinfo.length,
> +                               (int)(qnmpipeinfo.length - 2),
> +                               nls_codepage, 0);
> +               } else
> +                       strncpy(qnmpipeinfo.pipename, bcc_ptr,
> +                               qnmpipeinfo.length);
> +               memcpy((char *)arg, &qnmpipeinfo, sizeof(struct qnmp_info));
> +       }
> +
> +       cifs_buf_release(pSMB);
> +
> +       if (rc == -EAGAIN)
> +               goto qnmpiperetry;
> +
> +       return rc;
> +}
> +
> +int
> +CIFSSMBTransSetNmPHState(const int xid, struct cifsTconInfo *tcon,
> +               unsigned long arg, __u16 netfid,
> +               const struct nls_table *nls_codepage, int remap)
> +{
> +       TRANS_REQ *pSMB = NULL;
> +       TRANS_RSP *pSMBr = NULL;
> +       int rc = 0;
> +       int name_len, param_len;
> +       int pad;
> +       int bytes_returned = 0;
> +       __u16 offset;
> +       __u16 byte_count = 0;
> +       char *fileName = "\\PIPE\\";
> +       char *bcc_ptr;
> +       unsigned short mode;
> +
> +       cFYI(1, ("In CIFSSMBTransSetNmPHandState"));
> +setnmaphandstateretry:
> +       rc = smb_init(SMB_COM_TRANSACTION, 16, tcon, (void **) &pSMB,
> +                     (void **) &pSMBr);
> +       if (rc)
> +               return rc;
> +
> +       offset = offsetof(TRANS_REQ, Name) - 4;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
> +               name_len =
> +                   cifsConvertToUCS((__le16 *) bcc_ptr, fileName,
> +                                    PATH_MAX, nls_codepage, remap);
> +               name_len++;     /* trailing null */
> +               name_len *= 2;
> +       } else {        /* BB improve the check for buffer overruns BB */
> +               name_len = strnlen(fileName, PATH_MAX);
> +               name_len++;     /* trailing null */
> +               strncpy(bcc_ptr, fileName, name_len);
> +       }
> +       byte_count += (1 + pad + name_len);
> +
> +       offset += name_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->ParameterCount = 2;
> +       pSMB->TotalParameterCount = 2;
> +       pSMB->ParameterOffset = offset;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       mode = (*(unsigned short *)(arg));
> +       *(unsigned short *)bcc_ptr = cpu_to_le16(mode);
> +       bcc_ptr += 2;
> +       param_len = 2;
> +       byte_count += (pad + param_len);
> +
> +       offset += param_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->DataOffset = 0;
> +       pSMB->DataCount = 0;
> +       pSMB->TotalDataCount = 0;
> +
> +       pSMB->MaxParameterCount = 0;
> +       pSMB->MaxDataCount = 0;
> +       pSMB->MaxSetupCount = 0;
> +
> +       pSMB->Flags = 0;
> +       pSMB->Timeout = 0;
> +
> +       pSMB->SetupCount = 2;
> +       pSMB->Function = cpu_to_le16(TRANS_SET_NMPIPE_STATE);
> +       pSMB->Fid = cpu_to_le16(netfid);
> +
> +       pSMB->ByteCount = cpu_to_le16(byte_count);
> +
> +       pSMB->hdr.smb_buf_length += byte_count;
> +       rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
> +                        (struct smb_hdr *) pSMBr, &bytes_returned, 0);
> +       if (rc)
> +               cFYI(1, ("CIFSSMBTranSetNmPHandState returned %d", rc));
> +
> +       cifs_buf_release(pSMB);
> +
> +       if (rc == -EAGAIN)
> +               goto setnmaphandstateretry;
> +
> +       return rc;
> +}
> +
> +int
> +CIFSSMBTransPeekNmPipe(const int xid, struct cifsTconInfo *tcon,
> +               unsigned long arg, __u16 netfid,
> +               const struct nls_table *nls_codepage, int remap)
> +{
> +       TRANS_REQ *pSMB = NULL;
> +       TRANS_RSP *pSMBr = NULL;
> +       int rc = 0;
> +       int name_len;
> +       int pad;
> +       int bytes_returned = 0;
> +       int size;
> +       __u16 offset;
> +       __u16 byte_count = 0;
> +       char *fileName = "\\PIPE\\";
> +       char *bcc_ptr;
> +
> +       cFYI(1, ("In CIFSSMBTransPeekNmPipe"));
> +peeknmpiperetry:
> +       rc = smb_init(SMB_COM_TRANSACTION, 16, tcon, (void **) &pSMB,
> +                     (void **) &pSMBr);
> +       if (rc)
> +               return rc;
> +
> +       offset = offsetof(TRANS_REQ, Name) - 4;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
> +               name_len =
> +                   cifsConvertToUCS((__le16 *) bcc_ptr, fileName,
> +                                    PATH_MAX, nls_codepage, remap);
> +               name_len++;     /* trailing null */
> +               name_len *= 2;
> +       } else {        /* BB improve the check for buffer overruns BB */
> +               name_len = strnlen(fileName, PATH_MAX);
> +               name_len++;     /* trailing null */
> +               strncpy(bcc_ptr, fileName, name_len);
> +       }
> +       byte_count += (1 + pad + name_len);
> +
> +       offset += name_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->ParameterCount = 0;
> +       pSMB->TotalParameterCount = 0;
> +       pSMB->ParameterOffset = offset;
> +       byte_count += pad;
> +
> +       pSMB->DataOffset = 0;
> +       pSMB->DataCount = 0;
> +       pSMB->TotalDataCount = 0;
> +
> +       pSMB->MaxParameterCount = 6;
> +       /* BB find max SMB PDU from sess */
> +       pSMB->MaxDataCount = cpu_to_le16(4280);
> +       pSMB->MaxSetupCount = 0;
> +
> +       pSMB->Flags = 0;
> +       pSMB->Timeout = 0;
> +
> +       pSMB->SetupCount = 2;
> +       pSMB->Function = cpu_to_le16(TRANS_PEEK_NMPIPE);
> +       pSMB->Fid = cpu_to_le16(netfid);
> +
> +       pSMB->ByteCount = cpu_to_le16(byte_count);
> +
> +       pSMB->hdr.smb_buf_length += byte_count;
> +       rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
> +                        (struct smb_hdr *) pSMBr, &bytes_returned, 0);
> +       if (rc) {
> +               cFYI(1, ("CIFSSMBTranPeekNmPipe returned %d", rc));
> +       } else {
> +               offset = le16_to_cpu(pSMBr->ParameterOffset);
> +               bcc_ptr = (char *)pSMBr + offset + 4;
> +               ((struct peeknmp_info *)arg)->bavail =
> +                               le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               bcc_ptr += 2;
> +               ((struct peeknmp_info *)arg)->bremain =
> +                       le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               bcc_ptr += 2;
> +               ((struct peeknmp_info *)arg)->conntype =
> +                       le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               bcc_ptr += 2;
> +               if (((struct peeknmp_info *)arg)->size >
> +                               ((struct peeknmp_info *)arg)->bavail)
> +                       size = ((struct peeknmp_info *)arg)->bavail;
> +               else
> +                       size = ((struct peeknmp_info *)arg)->size;
> +               memcpy(((struct peeknmp_info *)arg)->buffer, bcc_ptr, size);
> +       }
> +
> +       cifs_buf_release(pSMB);
> +
> +       if (rc == -EAGAIN)
> +               goto peeknmpiperetry;
> +
> +       return rc;
> +}
> +
> +int
> +CIFSSMBTransGetNmPHState(const int xid, struct cifsTconInfo *tcon,
> +               unsigned long arg, __u16 netfid,
> +               const struct nls_table *nls_codepage, int remap)
> +{
> +       TRANS_REQ *pSMB = NULL;
> +       TRANS_RSP *pSMBr = NULL;
> +       int rc = 0;
> +       int name_len;
> +       int pad;
> +       int bytes_returned = 0;
> +       __u16 offset;
> +       __u16 byte_count = 0;
> +       char *fileName = "\\PIPE\\";
> +       char *bcc_ptr;
> +       struct qnmp_hinfo qnmpipehinfo;
> +
> +       cFYI(1, ("In CIFSSMBTransSetNmPHandState"));
> +getnmaphandstateretry:
> +       rc = smb_init(SMB_COM_TRANSACTION, 16, tcon, (void **) &pSMB,
> +                     (void **) &pSMBr);
> +       if (rc)
> +               return rc;
> +
> +       offset = offsetof(TRANS_REQ, Name) - 4;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
> +               name_len =
> +                   cifsConvertToUCS((__le16 *) bcc_ptr, fileName,
> +                                    PATH_MAX, nls_codepage, remap);
> +               name_len++;     /* trailing null */
> +               name_len *= 2;
> +       } else {        /* BB improve the check for buffer overruns BB */
> +               name_len = strnlen(fileName, PATH_MAX);
> +               name_len++;     /* trailing null */
> +               strncpy(bcc_ptr, fileName, name_len);
> +       }
> +       byte_count += (1 + pad + name_len);
> +
> +       offset += name_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->ParameterCount = 0;
> +       pSMB->TotalParameterCount = 0;
> +       pSMB->ParameterOffset = offset;
> +
> +       pSMB->DataCount = 0;
> +       pSMB->TotalDataCount = 0;
> +       pSMB->DataOffset = offset;
> +
> +       pSMB->MaxParameterCount = 2;
> +       pSMB->MaxDataCount = 0;
> +       pSMB->MaxSetupCount = 0;
> +
> +       pSMB->Flags = 0;
> +       pSMB->Timeout = 0;
> +
> +       pSMB->SetupCount = 2;
> +       pSMB->Function = cpu_to_le16(TRANS_QUERY_NMPIPE_STATE);
> +       pSMB->Fid = cpu_to_le16(netfid);
> +
> +       byte_count += pad;
> +       pSMB->ByteCount = cpu_to_le16(byte_count);
> +
> +       pSMB->hdr.smb_buf_length += byte_count;
> +       rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
> +                        (struct smb_hdr *) pSMBr, &bytes_returned, 0);
> +       if (rc) {
> +               cFYI(1, ("CIFSSMBTranGetNmPHandState returned %d", rc));
> +       } else {
> +               offset = le16_to_cpu(pSMBr->ParameterOffset);
> +               bcc_ptr = (char *)pSMBr + offset + 4;
> +               qnmpipehinfo.mode = le16_to_cpu(*(unsigned short *)bcc_ptr);
> +               memcpy((char *)arg, &qnmpipehinfo, sizeof(struct qnmp_hinfo));
> +       }
> +
> +       cifs_buf_release(pSMB);
> +
> +       if (rc == -EAGAIN)
> +               goto getnmaphandstateretry;
> +
> +       return rc;
> +}
> +
> +int
> +CIFSSMBTransNmPipe(const int xid, struct cifsTconInfo *tcon,
> +               unsigned char *arg, __u16 netfid,
> +               const struct nls_table *nls_codepage, int remap)
> +{
> +       TRANS_REQ *pSMB = NULL;
> +       TRANS_RSP *pSMBr = NULL;
> +       int rc = 0;
> +       int name_len;
> +       int pad;
> +       int bytes_returned = 0;
> +       __u16 offset;
> +       __u16 byte_count = 0;
> +       char *fileName = "\\PIPE\\";
> +       char *bcc_ptr;
> +
> +       cFYI(1, ("In CIFSSMBTransNmPipe"));
> +transnmpiperetry:
> +       rc = smb_init(SMB_COM_TRANSACTION, 16, tcon, (void **) &pSMB,
> +                     (void **) &pSMBr);
> +       if (rc)
> +               return rc;
> +
> +       offset = offsetof(TRANS_REQ, Name) - 4;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
> +               name_len =
> +                   cifsConvertToUCS((__le16 *) bcc_ptr, fileName,
> +                                    PATH_MAX, nls_codepage, remap);
> +               name_len++;     /* trailing null */
> +               name_len *= 2;
> +       } else {        /* BB improve the check for buffer overruns BB */
> +               name_len = strnlen(fileName, PATH_MAX);
> +               name_len++;     /* trailing null */
> +               strncpy(bcc_ptr, fileName, name_len);
> +       }
> +       byte_count += (1 + pad + name_len);
> +
> +       offset += name_len;
> +       pad = offset % 4;
> +       if (pad)
> +               offset += pad;
> +       pSMB->ParameterOffset = offset;
> +       pSMB->ParameterCount = 0;
> +       pSMB->TotalParameterCount = 0;
> +
> +       pSMB->DataOffset = offset;
> +       pSMB->DataCount = ((struct transnmp_info *)arg)->wsize;
> +       pSMB->TotalDataCount = pSMB->DataCount;
> +       bcc_ptr = (char *)pSMB + offset + 4;
> +       memcpy(bcc_ptr, ((struct transnmp_info *)arg)->sendbuf,
> +                                       pSMB->DataCount);
> +       byte_count += (pad + pSMB->DataCount);
> +
> +       pSMB->MaxParameterCount = 0;
> +       /* BB find max SMB PDU from sess */
> +       pSMB->MaxDataCount = cpu_to_le16(4280);
> +       pSMB->MaxSetupCount = 0;
> +
> +       pSMB->Flags = 0;
> +       pSMB->Timeout = 0;
> +
> +       pSMB->SetupCount = 2;
> +       pSMB->Function = cpu_to_le16(TRANS_TRANSACT_NMPIPE);
> +       pSMB->Fid = cpu_to_le16(netfid);
> +
> +       pSMB->ByteCount = cpu_to_le16(byte_count);
> +
> +       pSMB->hdr.smb_buf_length += byte_count;
> +       rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
> +                        (struct smb_hdr *) pSMBr, &bytes_returned, 0);
> +       if (rc) {
> +               cFYI(1, ("CIFSSMBTransQNmPipe returned %d", rc));
> +       } else {
> +               offset = le16_to_cpu(pSMBr->DataOffset);
> +               bcc_ptr = ((char *)pSMBr + offset + 4);
> +               byte_count = le16_to_cpu(pSMBr->DataCount);
> +               ((struct transnmp_info *)arg)->rsize = byte_count;
> +               memcpy(((struct transnmp_info *)arg)->recvbuf, bcc_ptr,
> +                               byte_count);
> +       }
> +
> +       cifs_buf_release(pSMB);
> +
> +       if (rc == -EAGAIN)
> +               goto transnmpiperetry;
> +
> +       return rc;
> +}
>  #endif
> --
> 1.5.2
>
>
> ------------------------------
>
> _______________________________________________
> linux-cifs-client mailing list
> [email protected]
> https://lists.samba.org/mailman/listinfo/linux-cifs-client
>
>
> End of linux-cifs-client Digest, Vol 71, Issue 3
> ************************************************
>



-- 
Best regards,
Peter Chacko

NetDiox computing systems,
Network storage & OS  training and research.
Bangalore, India.
www.netdiox.com
080 2664 0708
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.