Pass only internal oplock request values to create_file
authorVolker Lendecke <vl@sernet.de>
Fri, 7 Dec 2007 11:57:11 +0000 (12:57 +0100)
committerVolker Lendecke <vl@sernet.de>
Fri, 7 Dec 2007 13:05:06 +0000 (14:05 +0100)
Other callers (e.g. reply_open_and_X) might have other ideas of the bit
shuffling

source/smbd/nttrans.c
source/smbd/open.c

index a8afd580b349c0702064510927a28571b88d16af..716f682c1a5cc27f025c677d1c1f6f704e7413f7 100644 (file)
@@ -433,6 +433,7 @@ void reply_ntcreate_and_X(connection_struct *conn, struct smb_request *req)
        struct timespec a_timespec;
        struct timespec m_timespec;
        NTSTATUS status;
+       int oplock_request;
        uint8_t oplock_granted = NO_OPLOCK_RETURN;
        TALLOC_CTX *ctx = talloc_tos();
 
@@ -497,11 +498,16 @@ void reply_ntcreate_and_X(connection_struct *conn, struct smb_request *req)
                }
        }
 
+       oplock_request = (flags & REQUEST_OPLOCK) ? EXCLUSIVE_OPLOCK : 0;
+       if (oplock_request) {
+               oplock_request |= (flags & REQUEST_BATCH_OPLOCK)
+                       ? BATCH_OPLOCK : 0;
+       }
+
        status = create_file(conn, req, root_dir_fid, fname,
                             access_mask, share_access, create_disposition,
                             create_options, file_attributes, flags,
-                            allocation_size, NULL, NULL,
-                            &fsp, &info, &oplock_granted, &sbuf);
+                            allocation_size, NULL, NULL, &fsp, &info, &sbuf);
 
        if (!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(req->mid)) {
@@ -519,6 +525,31 @@ void reply_ntcreate_and_X(connection_struct *conn, struct smb_request *req)
                return;
        }
 
+       /*
+        * If the caller set the extended oplock request bit
+        * and we granted one (by whatever means) - set the
+        * correct bit for extended oplock reply.
+        */
+
+       if (oplock_request &&
+           (lp_fake_oplocks(SNUM(conn))
+            || EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))) {
+
+               /*
+                * Exclusive oplock granted
+                */
+
+               if (flags & REQUEST_BATCH_OPLOCK) {
+                       oplock_granted = BATCH_OPLOCK_RETURN;
+               } else {
+                       oplock_granted = EXCLUSIVE_OPLOCK_RETURN;
+               }
+       } else if (fsp->oplock_type == LEVEL_II_OPLOCK) {
+               oplock_granted = LEVEL_II_OPLOCK_RETURN;
+       } else {
+               oplock_granted = NO_OPLOCK_RETURN;
+       }
+
        file_len = sbuf.st_size;
        fattr = dos_mode(conn,fname,&sbuf);
        if (fattr == 0) {
@@ -834,6 +865,7 @@ static void call_nt_transact_create(connection_struct *conn,
        NTSTATUS status;
        size_t param_len;
        SMB_BIG_UINT allocation_size;
+       int oplock_request;
        uint8_t oplock_granted;
        TALLOC_CTX *ctx = talloc_tos();
 
@@ -941,11 +973,16 @@ static void call_nt_transact_create(connection_struct *conn,
                return;
        }
 
+       oplock_request = (flags & REQUEST_OPLOCK) ? EXCLUSIVE_OPLOCK : 0;
+       if (oplock_request) {
+               oplock_request |= (flags & REQUEST_BATCH_OPLOCK)
+                       ? BATCH_OPLOCK : 0;
+       }
+
        status = create_file(conn, req, root_dir_fid, fname,
                             access_mask, share_access, create_disposition,
                             create_options, file_attributes, flags,
-                            allocation_size, sd, ea_list,
-                            &fsp, &info, &oplock_granted, &sbuf);
+                            allocation_size, sd, ea_list, &fsp, &info, &sbuf);
 
        if(!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(req->mid)) {
@@ -961,6 +998,31 @@ static void call_nt_transact_create(connection_struct *conn,
                return;
        }
 
+       /*
+        * If the caller set the extended oplock request bit
+        * and we granted one (by whatever means) - set the
+        * correct bit for extended oplock reply.
+        */
+
+       if (oplock_request &&
+           (lp_fake_oplocks(SNUM(conn))
+            || EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))) {
+
+               /*
+                * Exclusive oplock granted
+                */
+
+               if (flags & REQUEST_BATCH_OPLOCK) {
+                       oplock_granted = BATCH_OPLOCK_RETURN;
+               } else {
+                       oplock_granted = EXCLUSIVE_OPLOCK_RETURN;
+               }
+       } else if (fsp->oplock_type == LEVEL_II_OPLOCK) {
+               oplock_granted = LEVEL_II_OPLOCK_RETURN;
+       } else {
+               oplock_granted = NO_OPLOCK_RETURN;
+       }
+
        file_len = sbuf.st_size;
        fattr = dos_mode(conn,fname,&sbuf);
        if (fattr == 0) {
index 11dff4dfe5e388f0d1a7b2bf82711e49b408650d..b156dbbce1aaa3ba02cb5f14cf70a410627a20bd 100644 (file)
@@ -2453,14 +2453,13 @@ NTSTATUS create_file(connection_struct *conn,
                     uint32_t create_disposition,
                     uint32_t create_options,
                     uint32_t file_attributes,
-                    uint32_t flags,
+                    uint32_t oplock_request,
                     SMB_BIG_UINT allocation_size,
                     struct security_descriptor *sd,
                     struct ea_list *ea_list,
 
                     files_struct **result,
                     int *pinfo,
-                    uint8_t *poplock_granted,
                     SMB_STRUCT_STAT *psbuf)
 {
        TALLOC_CTX *frame = talloc_stackframe();
@@ -2468,21 +2467,20 @@ NTSTATUS create_file(connection_struct *conn,
        SMB_STRUCT_STAT sbuf;
        int info = FILE_WAS_OPENED;
        files_struct *fsp = NULL;
-       uint8_t oplock_granted = NO_OPLOCK_RETURN;
-       int oplock_request;
        NTSTATUS status;
 
-       DEBUG(10,("create_file: flags = 0x%x, access_mask = 0x%x "
+       DEBUG(10,("create_file: access_mask = 0x%x "
                  "file_attributes = 0x%x, share_access = 0x%x, "
                  "create_disposition = 0x%x create_options = 0x%x "
+                 "oplock_request = 0x%x "
                  "root_dir_fid = 0x%x, ea_list = 0x%p, sd = 0x%p, "
                  "fname = %s\n",
-                 (unsigned int)flags,
                  (unsigned int)access_mask,
                  (unsigned int)file_attributes,
                  (unsigned int)share_access,
                  (unsigned int)create_disposition,
                  (unsigned int)create_options,
+                 (unsigned int)oplock_request,
                  (unsigned int)root_dir_fid,
                  ea_list, sd, fname));
 
@@ -2613,12 +2611,6 @@ NTSTATUS create_file(connection_struct *conn,
                }
        }
 
-       oplock_request = (flags & REQUEST_OPLOCK) ? EXCLUSIVE_OPLOCK : 0;
-       if (oplock_request) {
-               oplock_request |= (flags & REQUEST_BATCH_OPLOCK)
-                       ? BATCH_OPLOCK : 0;
-       }
-
        if (req == NULL) {
                oplock_request |= INTERNAL_OPEN_ONLY;
        }
@@ -2835,42 +2827,13 @@ NTSTATUS create_file(connection_struct *conn,
                }
        }
 
-       /*
-        * If the caller set the extended oplock request bit
-        * and we granted one (by whatever means) - set the
-        * correct bit for extended oplock reply.
-        */
-
-       if (oplock_request &&
-           (lp_fake_oplocks(SNUM(conn))
-            || EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))) {
-
-               /*
-                * Exclusive oplock granted
-                */
-
-               if (flags & REQUEST_BATCH_OPLOCK) {
-                       oplock_granted = BATCH_OPLOCK_RETURN;
-               } else {
-                       oplock_granted = EXCLUSIVE_OPLOCK_RETURN;
-               }
-       } else if (fsp->oplock_type == LEVEL_II_OPLOCK) {
-               oplock_granted = LEVEL_II_OPLOCK_RETURN;
-       } else {
-               oplock_granted = NO_OPLOCK_RETURN;
-       }
-
  done:
-       DEBUG(10, ("create_file: info=%d, oplock_granted=%d\n",
-                  info, (int)oplock_granted));
+       DEBUG(10, ("create_file: info=%d\n", info));
 
        *result = fsp;
        if (pinfo != NULL) {
                *pinfo = info;
        }
-       if (poplock_granted != NULL) {
-               *poplock_granted = oplock_granted;
-       }
        if (psbuf != NULL) {
                *psbuf = sbuf;
        }