pvfs_open: call pvfs_setup_oplock() if an oplock was granted
authorStefan Metzmacher <metze@samba.org>
Mon, 25 Feb 2008 07:39:13 +0000 (08:39 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 26 Feb 2008 08:32:57 +0000 (09:32 +0100)
This is needed to receive oplock breaks from other "processes"

metze

source/ntvfs/posix/pvfs_open.c
source/ntvfs/posix/vfs_posix.h

index 8e1870fa703fb679124d4934661d7be08cf87035..8429c14d1ba6f9693097cefb6e2af5b1d9eec75c 100644 (file)
@@ -268,6 +268,7 @@ static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
        f->handle->seek_offset       = 0;
        f->handle->position          = 0;
        f->handle->mode              = 0;
+       f->handle->oplock            = NULL;
        f->handle->sticky_write_time = false;
        f->handle->open_completed    = false;
 
@@ -684,9 +685,6 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
                return status;
        }
 
-       if (pvfs->flags & PVFS_FLAG_FAKE_OPLOCKS) {
-               oplock_granted = OPLOCK_BATCH;
-       }
 
        f->ntvfs             = h;
        f->pvfs              = pvfs;
@@ -705,12 +703,23 @@ static NTSTATUS pvfs_create_file(struct pvfs_state *pvfs,
        f->handle->seek_offset       = 0;
        f->handle->position          = 0;
        f->handle->mode              = 0;
+       f->handle->oplock            = NULL;
        f->handle->have_opendb_entry = true;
        f->handle->sticky_write_time = false;
        f->handle->open_completed    = false;
 
        DLIST_ADD(pvfs->files.list, f);
 
+       if (pvfs->flags & PVFS_FLAG_FAKE_OPLOCKS) {
+               oplock_granted = OPLOCK_BATCH;
+       } else if (oplock_granted != OPLOCK_NONE) {
+               status = pvfs_setup_oplock(f, oplock_granted);
+               if (!NT_STATUS_IS_OK(status)) {
+                       talloc_free(lck);
+                       return status;
+               }
+       }
+
        /* setup a destructor to avoid file descriptor leaks on
           abnormal termination */
        talloc_set_destructor(f, pvfs_fnum_destructor);
@@ -1185,6 +1194,7 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
        f->handle->seek_offset       = 0;
        f->handle->position          = 0;
        f->handle->mode              = 0;
+       f->handle->oplock            = NULL;
        f->handle->have_opendb_entry = false;
        f->handle->sticky_write_time = false;
        f->handle->open_completed    = false;
@@ -1257,6 +1267,12 @@ NTSTATUS pvfs_open(struct ntvfs_module_context *ntvfs,
 
        if (pvfs->flags & PVFS_FLAG_FAKE_OPLOCKS) {
                oplock_granted = OPLOCK_BATCH;
+       } else if (oplock_granted != OPLOCK_NONE) {
+               status = pvfs_setup_oplock(f, oplock_granted);
+               if (!NT_STATUS_IS_OK(status)) {
+                       talloc_free(lck);
+                       return status;
+               }
        }
 
        f->handle->have_opendb_entry = true;
index 50875c3f9b634de9686f876fe82bad56f6df43e9..72469505ccc192cc955b53fdc3e16f3239eb243c 100644 (file)
@@ -29,6 +29,7 @@
 #include "dsdb/samdb/samdb.h"
 
 struct pvfs_wait;
+struct pvfs_oplock;
 
 /* this is the private structure for the posix vfs backend. It is used
    to hold per-connection (per tree connect) state information */
@@ -154,6 +155,13 @@ struct pvfs_file_handle {
 
        bool have_opendb_entry;
 
+       /*
+        * we need to wait for oplock break requests from other processes,
+        * and we need to remember the pvfs_file so we can correctly
+        * forward the oplock break to the client
+        */
+       struct pvfs_oplock *oplock;
+
        /* we need this hook back to our parent for lock destruction */
        struct pvfs_state *pvfs;