svn commit: linux-cifs-client r35 - in
branches/SOC/linux-2.6bk-dnotify/fs/cifs: .
asser at samba.org
asser at samba.org
Wed Aug 17 14:15:54 GMT 2005
Author: asser
Date: 2005-08-17 14:15:53 +0000 (Wed, 17 Aug 2005)
New Revision: 35
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=linux-cifs-client&rev=35
Log:
Started NT_CANCEL implementation and added locking of GlobalMid_Lock when doing
list operations in is_valid_dnotify_rsp, CIFSSMBNotify and cifs_dnotify_thread.
Modified:
branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsfs.c
branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsglob.h
branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifspdu.h
branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c
branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c
Changeset:
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsfs.c
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsfs.c 2005-08-13 16:15:58 UTC (rev 34)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsfs.c 2005-08-17 14:15:53 UTC (rev 35)
@@ -858,7 +858,9 @@
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1*HZ);
+ spin_lock(&GlobalMid_Lock);
if(list_empty(&GlobalDnotifyRsp_Q)) {
+ spin_unlock(&GlobalMid_Lock);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(39*HZ);
} else {
@@ -866,6 +868,7 @@
if(dnotify_req) {
list_del(&dnotify_req->lhead);
+ spin_unlock(&GlobalMid_Lock);
inode = dnotify_req->dentry->d_inode;
cFYI(1,("Notifying file %s mask %lx", build_path_from_dentry(dnotify_req->dentry), inode->i_dnotify_mask));
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsglob.h
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsglob.h 2005-08-13 16:15:58 UTC (rev 34)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsglob.h 2005-08-17 14:15:53 UTC (rev 35)
@@ -334,8 +334,10 @@
/* for pending dnotify requests */
struct dir_notify_req {
struct list_head lhead;
- __u16 Pid;
+ __le16 Pid;
__u16 Mid;
+ __u16 Tid;
+ __u16 Uid;
__u16 netfid;
__u32 filter; /* CompletionFilter (for multishot) */
int multishot;
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifspdu.h
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifspdu.h 2005-08-13 16:15:58 UTC (rev 34)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifspdu.h 2005-08-17 14:15:53 UTC (rev 35)
@@ -52,6 +52,7 @@
#define SMB_COM_NT_TRANSACT 0xA0
#define SMB_COM_NT_TRANSACT_SECONDARY 0xA1
#define SMB_COM_NT_CREATE_ANDX 0xA2
+#define SMB_COM_NT_CANCEL 0xA4 /* no response, but might trigger response of cancelled request */
#define SMB_COM_NT_RENAME 0xA5 /* trivial response */
/* Transact2 subcommand codes */
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c 2005-08-13 16:15:58 UTC (rev 34)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c 2005-08-17 14:15:53 UTC (rev 35)
@@ -3831,6 +3831,37 @@
return rc;
}
+int CIFSSMBCancel(const int xid, struct cifsTconInfo *tcon,
+ const int Sid, const int Uid, const int Pid,
+ const int Tid, const int Mid)
+{
+ int rc = 0;
+ struct smb_hdr *pSMB = NULL;
+ struct smb_hdr *pSMBr = NULL;
+
+ int bytes_returned;
+
+ cFYI(1,("In CIFSSMBCancel"));
+ rc = smb_init(SMB_COM_NT_CANCEL, 0, tcon, (void **) &pSMB,
+ (void **) &pSMBr);
+
+ if(rc)
+ return rc;
+
+ pSMB->Uid = Uid;
+ pSMB->Pid = Pid;
+ pSMB->Tid = Tid;
+ pSMB->Mid = Mid;
+
+ rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB,
+ (struct smb_hdr *) pSMBr, &bytes_returned, -1);
+
+ if(rc)
+ cFYI(1,("Error in Cancel = %d", rc));
+ cifs_buf_release(pSMB);
+ return rc;
+}
+
int CIFSSMBNotify(const int xid, struct cifsTconInfo *tcon,
const int notify_subdirs, const __u16 netfid,
__u32 filter, const struct nls_table *nls_codepage,
@@ -3878,11 +3909,15 @@
sizeof(struct dir_notify_req), GFP_KERNEL);
dnotify_req->Pid = pSMB->hdr.Pid;
dnotify_req->Mid = pSMB->hdr.Mid;
+ dnotify_req->Tid = pSMB->hdr.Tid;
+ dnotify_req->Uid = pSMB->hdr.Uid;
dnotify_req->netfid = netfid;
dnotify_req->dentry = dentry;
dnotify_req->filter = filter;
dnotify_req->multishot = multishot;
+ spin_lock(&GlobalMid_Lock);
list_add_tail(&dnotify_req->lhead, &GlobalDnotifyReqList);
+ spin_unlock(&GlobalMid_Lock);
}
cifs_buf_release(pSMB);
return rc;
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c 2005-08-13 16:15:58 UTC (rev 34)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c 2005-08-17 14:15:53 UTC (rev 35)
@@ -411,6 +411,7 @@
if((pSMBr->ByteCount > sizeof(struct file_notify_information)) ||
(pSMBr->hdr.Status.CifsError)) {
/* Find the request on the req list */
+ spin_lock(&GlobalMid_Lock);
list_for_each_safe(tmp, tmp1, &GlobalDnotifyReqList) {
dnotify_req = list_entry(tmp, struct dir_notify_req, lhead);
@@ -421,6 +422,7 @@
list_add_tail(&dnotify_req->lhead, &GlobalDnotifyRsp_Q);
}
}
+ spin_unlock(&GlobalMid_Lock);
wake_up_process(dnotifyThread);
return TRUE;
}
More information about the samba-cvs
mailing list