svn commit: linux-cifs-client r40 - in
branches/SOC/linux-2.6bk-dnotify/fs/cifs: .
asser at samba.org
asser at samba.org
Sun Aug 28 14:59:18 GMT 2005
Author: asser
Date: 2005-08-28 14:59:17 +0000 (Sun, 28 Aug 2005)
New Revision: 40
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=linux-cifs-client&rev=40
Log:
fixed is_valid_dnotify_rsp not accepting STATUS_SUCCESS without
file_notify_information structs
Added a kmem_cache for the dir_notify_req structs
Modified:
branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsfs.c
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-26 16:35:18 UTC (rev 39)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifsfs.c 2005-08-28 14:59:17 UTC (rev 40)
@@ -83,6 +83,7 @@
extern mempool_t *cifs_mid_poolp;
extern kmem_cache_t *cifs_oplock_cachep;
+extern kmem_cache_t *cifs_dnotify_cachep;
static int
cifs_read_super(struct super_block *sb, void *data,
@@ -235,6 +236,7 @@
static kmem_cache_t *cifs_req_cachep;
static kmem_cache_t *cifs_mid_cachep;
kmem_cache_t *cifs_oplock_cachep;
+kmem_cache_t *cifs_dnotify_cachep;
static kmem_cache_t *cifs_sm_req_cachep;
mempool_t *cifs_sm_req_poolp;
mempool_t *cifs_req_poolp;
@@ -755,6 +757,16 @@
mempool_destroy(cifs_mid_poolp);
return -ENOMEM;
}
+
+ cifs_dnotify_cachep = kmem_cache_create("cifs_dir_notify_req_structs",
+ sizeof (struct dir_notify_req), 0,
+ SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if(cifs_dnotify_cachep == NULL) {
+ kmem_cache_destroy(cifs_oplock_cachep);
+ kmem_cache_destroy(cifs_mid_cachep);
+ mempool_destroy(cifs_mid_poolp);
+ return -ENOMEM;
+ }
return 0;
}
@@ -770,6 +782,10 @@
if (kmem_cache_destroy(cifs_oplock_cachep))
printk(KERN_WARNING
"error not all oplock structures were freed\n");
+
+ if (kmem_cache_destroy(cifs_dnotify_cachep))
+ printk(KERN_WARNING
+ "error not all dnotify structures were freed\n");
}
static int cifs_oplock_thread(void * dummyarg)
@@ -895,7 +911,7 @@
cERROR(1,("CIFSSMBClose failed in cifs_dnotify_thread rc = %d", rc));
}
}
- kfree(dnotify_req);
+ kmem_cache_free(cifs_dnotify_cachep, dnotify_req);
FreeXid(xid);
}
}
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c 2005-08-26 16:35:18 UTC (rev 39)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/cifssmb.c 2005-08-28 14:59:17 UTC (rev 40)
@@ -38,6 +38,8 @@
#include "cifs_unicode.h"
#include "cifs_debug.h"
+extern kmem_cache_t *cifs_dnotify_cachep;
+
#ifdef CONFIG_CIFS_POSIX
static struct {
int index;
@@ -3906,8 +3908,8 @@
cFYI(1, ("Error in Notify = %d", rc));
} else {
/* Add file to outstanding requests */
- dnotify_req = (struct dir_notify_req *) kmalloc(
- sizeof(struct dir_notify_req), GFP_KERNEL);
+ dnotify_req = (struct dir_notify_req*) kmem_cache_alloc(cifs_dnotify_cachep,
+ SLAB_KERNEL);
dnotify_req->Pid = pSMB->hdr.Pid;
dnotify_req->PidHigh = pSMB->hdr.PidHigh;
dnotify_req->Mid = pSMB->hdr.Mid;
@@ -3917,10 +3919,9 @@
dnotify_req->file = file;
dnotify_req->filter = filter;
dnotify_req->multishot = multishot;
- cFYI(1,("Locking GlobalMid_Lock"));
+
spin_lock(&GlobalMid_Lock);
list_add_tail(&dnotify_req->lhead, &GlobalDnotifyReqList);
- cFYI(1,("Unlocking GlobalMid_Lock"));
spin_unlock(&GlobalMid_Lock);
}
cifs_buf_release(pSMB);
Modified: branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c
===================================================================
--- branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c 2005-08-26 16:35:18 UTC (rev 39)
+++ branches/SOC/linux-2.6bk-dnotify/fs/cifs/misc.c 2005-08-28 14:59:17 UTC (rev 40)
@@ -30,6 +30,7 @@
#include "nterr.h"
#include "cifs_unicode.h"
+extern kmem_cache_t *cifs_dnotify_cachep;
extern mempool_t *cifs_sm_req_poolp;
extern mempool_t *cifs_req_poolp;
extern struct task_struct * oplockThread;
@@ -407,32 +408,33 @@
cFYI(1,("pSMBr ParameterOffset:%ld DataOffset:%ld", (unsigned long)pSMBr->ParameterOffset, (unsigned long)pSMBr->DataOffset));
pnotify = (struct file_notify_information *) (&pSMBr->hdr.Protocol) + pSMBr->DataOffset;
cFYI(1,("pnotify NextEntryOffset:%lx Action:%lx FileNameLength:%ld",(unsigned long)pnotify->NextEntryOffset,(unsigned long)pnotify->Action,(unsigned long)pnotify->FileNameLength));
- cFYI(1,("notify err 0x%x (cancelled == 0x%x)",pSMBr->hdr.Status.CifsError,(NT_STATUS_CANCELLED)));
- 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);
+ cFYI(1,("notify err 0x%x",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);
- if(dnotify_req->Mid == pSMBr->hdr.Mid &&
- dnotify_req->PidHigh == pSMBr->hdr.PidHigh &&
- dnotify_req->Pid == pSMBr->hdr.Pid)
- {
- list_del(tmp);
- if ((NT_STATUS_CANCELLED) ==
- le32_to_cpu(pSMBr->hdr.Status.CifsError)) {
- cFYI(1,("Request was cancelled (err %lx nt_status_cancelled %lx)", pSMBr->hdr.Status.CifsError,NT_STATUS_CANCELLED));
- kfree(dnotify_req);
- } else {
- list_add_tail(&dnotify_req->lhead, &GlobalDnotifyRsp_Q);
- }
+ if(dnotify_req->Mid == pSMBr->hdr.Mid &&
+ dnotify_req->PidHigh == pSMBr->hdr.PidHigh &&
+ dnotify_req->Pid == pSMBr->hdr.Pid)
+ {
+ list_del(tmp);
+ if ((NT_STATUS_CANCELLED) ==
+ le32_to_cpu(pSMBr->hdr.Status.CifsError)) {
+ cFYI(1,("Request was cancelled (err %lx)", pSMBr->hdr.Status.CifsError));
+ kfree(dnotify_req);
+ } else if(SUCCESS == le32_to_cpu(pSMBr->hdr.Status.CifsError) ||
+ STATUS_NOTIFY_ENUM_DIR == le32_to_cpu(pSMBr->hdr.Status.CifsError)) {
+ list_add_tail(&dnotify_req->lhead, &GlobalDnotifyRsp_Q);
+ } else {
+ cFYI(1,("Unknown NOTIFY response 0x%lx", pSMBr->hdr.Status.CifsError));
+ kmem_cache_free(cifs_dnotify_cachep, dnotify_req);
}
}
- spin_unlock(&GlobalMid_Lock);
- wake_up_process(dnotifyThread);
- return TRUE;
- } /* ASF TODO: file_notify_information */
+ }
+ spin_unlock(&GlobalMid_Lock);
+ wake_up_process(dnotifyThread);
+ return TRUE;
}
return FALSE;
}
More information about the samba-cvs
mailing list