opendb: add allow_level_II_oplock parameter to odb_open_file()
authorStefan Metzmacher <metze@samba.org>
Thu, 6 Mar 2008 14:47:27 +0000 (15:47 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 6 Mar 2008 16:19:12 +0000 (17:19 +0100)
Not all clients support a fallback to level II oplocks.

metze
(This used to be commit 146f1fe0b67ca0805f0e71358abc57da0c0579a9)

source4/cluster/ctdb/opendb_ctdb.c
source4/librpc/idl/opendb.idl
source4/ntvfs/common/opendb.c
source4/ntvfs/common/opendb.h
source4/ntvfs/common/opendb_tdb.c

index e84f2364d40f183791f8b3052688bee7a82a8481..fe48f987601f3a04cb37e16b4d4656efc598de09 100644 (file)
@@ -284,6 +284,7 @@ static NTSTATUS odb_ctdb_open_file(struct odb_lock *lck,
                                   uint32_t stream_id, uint32_t share_access,
                                   uint32_t access_mask, bool delete_on_close,
                                   uint32_t open_disposition, bool break_to_none,
+                                  bool allow_level_II_oplock,
                                   uint32_t oplock_level, uint32_t *oplock_granted)
 
 {
index eaa626e89dee44a2efb8b4d2466d1839864c8f47..e3bc2d0f1775d3c5afad87835ee55358c6d5dfe9 100644 (file)
@@ -23,6 +23,7 @@ interface opendb
                /* we need a per-entry delete on close, as well as a per-file
                   one, to cope with strange semantics on open */
                boolean8 delete_on_close;
+               boolean8 allow_level_II_oplock;
                uint32 oplock_level;
        } opendb_entry;
 
index 6c1a9c070ae82426afd6d946512d3ae10c149e2b..a7e5458aaf85d8c23702dff5b8660d5ade753f32 100644 (file)
@@ -98,11 +98,13 @@ _PUBLIC_ NTSTATUS odb_open_file(struct odb_lock *lck,
                                uint32_t stream_id, uint32_t share_access,
                                uint32_t access_mask, bool delete_on_close,
                                uint32_t open_disposition, bool break_to_none,
+                               bool allow_level_II_oplock,
                                uint32_t oplock_level, uint32_t *oplock_granted)
 {
        return ops->odb_open_file(lck, file_handle, path, stream_id, share_access,
                                  access_mask, delete_on_close, open_disposition,
-                                 break_to_none, oplock_level, oplock_granted);
+                                 break_to_none, allow_level_II_oplock,
+                                 oplock_level, oplock_granted);
 }
 
 
index 69a7f718ba6d4d14398fbfa415769696eabe71d0..1c7f815dea41420d42193b7f2cd911f7768f3b6e 100644 (file)
@@ -30,6 +30,7 @@ struct opendb_ops {
                                  uint32_t stream_id, uint32_t share_access,
                                  uint32_t access_mask, bool delete_on_close,
                                  uint32_t open_disposition, bool break_to_none,
+                                 bool allow_level_II_oplock,
                                  uint32_t oplock_level, uint32_t *oplock_granted);
        NTSTATUS (*odb_open_file_pending)(struct odb_lock *lck, void *private);
        NTSTATUS (*odb_close_file)(struct odb_lock *lck, void *file_handle,
index 47b35f594c61d24b4c9651b18c113dd251ba5d40..0736af3d1efdd5f28ab968e031a502b0c0672af9 100644 (file)
@@ -344,7 +344,8 @@ static NTSTATUS odb_tdb_open_can_internal(struct odb_context *odb,
                           break request and suspending this call
                           until the break is acknowledged or the file
                           is closed */
-                       if (break_to_none) {
+                       if (break_to_none ||
+                           !file->entries[i].allow_level_II_oplock) {
                                oplock_return = OPLOCK_BREAK_TO_NONE;
                        }
                        odb_oplock_break_send(odb, &file->entries[i],
@@ -391,7 +392,8 @@ static NTSTATUS odb_tdb_open_can_internal(struct odb_context *odb,
                         * send an oplock break to the holder of the
                         * oplock and tell caller to retry later
                         */
-                       if (break_to_none) {
+                       if (break_to_none ||
+                           !file->entries[i].allow_level_II_oplock) {
                                oplock_return = OPLOCK_BREAK_TO_NONE;
                        }
                        odb_oplock_break_send(odb, &file->entries[i],
@@ -418,6 +420,7 @@ static NTSTATUS odb_tdb_open_file(struct odb_lock *lck,
                                  uint32_t stream_id, uint32_t share_access,
                                  uint32_t access_mask, bool delete_on_close,
                                  uint32_t open_disposition, bool break_to_none,
+                                 bool allow_level_II_oplock,
                                  uint32_t oplock_level, uint32_t *oplock_granted)
 {
        struct odb_context *odb = lck->odb;
@@ -447,13 +450,14 @@ static NTSTATUS odb_tdb_open_file(struct odb_lock *lck,
        NT_STATUS_NOT_OK_RETURN(status);
 
        /* see if it conflicts */
-       e.server          = odb->ntvfs_ctx->server_id;
-       e.file_handle     = file_handle;
-       e.stream_id       = stream_id;
-       e.share_access    = share_access;
-       e.access_mask     = access_mask;
-       e.delete_on_close = delete_on_close;
-       e.oplock_level    = OPLOCK_NONE;
+       e.server                = odb->ntvfs_ctx->server_id;
+       e.file_handle           = file_handle;
+       e.stream_id             = stream_id;
+       e.share_access          = share_access;
+       e.access_mask           = access_mask;
+       e.delete_on_close       = delete_on_close;
+       e.allow_level_II_oplock = allow_level_II_oplock;
+       e.oplock_level          = OPLOCK_NONE;
 
        /*
          possibly grant an exclusive, batch or level2 oplock
@@ -466,17 +470,23 @@ static NTSTATUS odb_tdb_open_file(struct odb_lock *lck,
                        if (file.num_entries == 0) {
                                e.oplock_level  = OPLOCK_EXCLUSIVE;
                                *oplock_granted = EXCLUSIVE_OPLOCK_RETURN;
-                       } else {
+                       } else if (allow_level_II_oplock) {
                                e.oplock_level  = OPLOCK_LEVEL_II;
                                *oplock_granted = LEVEL_II_OPLOCK_RETURN;
+                       } else {
+                               e.oplock_level  = OPLOCK_NONE;
+                               *oplock_granted = NO_OPLOCK_RETURN;
                        }
                } else if (oplock_level == OPLOCK_BATCH) {
                        if (file.num_entries == 0) {
                                e.oplock_level  = OPLOCK_BATCH;
                                *oplock_granted = BATCH_OPLOCK_RETURN;
-                       } else {
+                       } else if (allow_level_II_oplock) {
                                e.oplock_level  = OPLOCK_LEVEL_II;
                                *oplock_granted = LEVEL_II_OPLOCK_RETURN;
+                       } else {
+                               e.oplock_level  = OPLOCK_NONE;
+                               *oplock_granted = NO_OPLOCK_RETURN;
                        }
                } else if (oplock_level == OPLOCK_LEVEL_II) {
                        e.oplock_level  = OPLOCK_LEVEL_II;