|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
A question about SQL-over-CIFSCould 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, <linux-cifs-client-request@...> wrote: > Send linux-cifs-client mailing list submissions to > linux-cifs-client@... > > 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 > linux-cifs-client-request@... > > You can reach the person managing the list at > linux-cifs-client-owner@... > > 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 <smfrench@...> > To: linux-net@... > Cc: linux-cifs-client@... > Subject: [linux-cifs-client] TCP_NODELAY and CORK - should they be > added for network fs case? > Message-ID: > <524f69650910151032q3a5e9ee0k18415f5c8212890e@...> > 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 <shirishpargaonkar@...> > To: linux-cifs-client@..., linux-fsdevel > <linux-fsdevel@...> > Subject: [linux-cifs-client] [patch][0/3] Add support infrastructure > for Named Pipe > Message-ID: > <4a4634330910151036m7ba50246ld70f2800bc4afc6b@...> > 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 shirishpargaonkar@... > -------------- 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 <shirishpargaonkar@...> > To: linux-cifs-client@..., linux-fsdevel > <linux-fsdevel@...> > Subject: [linux-cifs-client] [patch][1/3] Data structures and defines > for Named Pipes > Message-ID: > <4a4634330910151040r3a61019m66b6ddcb648111cd@...> > 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 <shirishpargaonkar@...> > 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 <shirishpargaonkar@...> > To: linux-cifs-client@..., linux-fsdevel > <linux-fsdevel@...> > Subject: [linux-cifs-client] [patch][2/3] SMBTrans functions for Named > Pipes > Message-ID: > <4a4634330910151041i33a3036ft8d7f729b5ec77618@...> > 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 <shirishpargaonkar@...> > 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 > linux-cifs-client@... > 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 _______________________________________________ linux-cifs-client mailing list linux-cifs-client@... https://lists.samba.org/mailman/listinfo/linux-cifs-client |
|
|
Re: A question about SQL-over-CIFSOn Thu, Oct 15, 2009 at 11:26:37PM +0530, Peter Chacko wrote:
> 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 ? Should work (at least to a Samba server :-). Try it and see (with a good backup of your db of course :-). If it doesn't work it's a bug and we'll fix it. Jeremy. _______________________________________________ linux-cifs-client mailing list linux-cifs-client@... https://lists.samba.org/mailman/listinfo/linux-cifs-client |
| Free embeddable forum powered by Nabble | Forum Help |