svn commit: samba r17128 - in branches/SAMBA_3_0/source/smbd: .

jra at samba.org jra at samba.org
Wed Jul 19 01:30:32 GMT 2006


Author: jra
Date: 2006-07-19 01:30:30 +0000 (Wed, 19 Jul 2006)
New Revision: 17128

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17128

Log:
Missed a logic error in my last patch. Ensure we deal with any
oplocks that were granted when we had released the lock. Fix
strange case where stat open grants a batch oplock on file
create, but grants no oplock on file open.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/smbd/open.c


Changeset:
Modified: branches/SAMBA_3_0/source/smbd/open.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/open.c	2006-07-19 01:30:21 UTC (rev 17127)
+++ branches/SAMBA_3_0/source/smbd/open.c	2006-07-19 01:30:30 UTC (rev 17128)
@@ -623,8 +623,11 @@
 	BOOL delay_it = False;
 	BOOL have_level2 = False;
 
+	if (oplock_request & INTERNAL_OPEN_ONLY) {
+		fsp->oplock_type = NO_OPLOCK;
+	}
+
 	if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
-		fsp->oplock_type = NO_OPLOCK;
 		return False;
 	}
 
@@ -1582,10 +1585,43 @@
 		return NT_STATUS_SHARING_VIOLATION;
 	}
 
+	/*
+	 * The share entry is again *locked*.....
+	 */
+
+	/* First pass - send break only on batch oplocks. */
+	if (delay_for_oplocks(lck, fsp, 1, oplock_request)) {
+		schedule_defer_open(lck, request_time);
+		fd_close(conn, fsp);
+		file_free(fsp);
+		TALLOC_FREE(lck);
+		return NT_STATUS_SHARING_VIOLATION;
+	}
+
 	status = open_mode_check(conn, fname, lck,
 				 access_mask, share_access,
 				 create_options, &file_existed);
 
+	if (NT_STATUS_IS_OK(status)) {
+		/* We might be going to allow this open. Check oplock status again. */
+		/* Second pass - send break for both batch or exclusive oplocks. */
+		if (delay_for_oplocks(lck, fsp, 2, oplock_request)) {
+			schedule_defer_open(lck, request_time);
+			fd_close(conn, fsp);
+			file_free(fsp);
+			TALLOC_FREE(lck);
+			return NT_STATUS_SHARING_VIOLATION;
+		}
+	}
+
+	if (NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
+		/* DELETE_PENDING is not deferred for a second */
+		fd_close(conn, fsp);
+		file_free(fsp);
+		TALLOC_FREE(lck);
+		return status;
+	}
+
 	if (!NT_STATUS_IS_OK(status)) {
 		struct deferred_open_record state;
 
@@ -1609,10 +1645,6 @@
 		return status;
 	}
 
-	/*
-	 * The share entry is again *locked*.....
-	 */
-
 	/* note that we ignore failure for the following. It is
            basically a hack for NFS, and NFS will never set one of
            these only read them. Nobody but Samba can ever set a deny
@@ -1653,6 +1685,11 @@
 	fsp->access_mask = access_mask;
 
 	if (file_existed) {
+		/* stat opens on existing files don't get oplocks. */
+		if (is_stat_open(fsp->access_mask)) {
+			fsp->oplock_type = NO_OPLOCK;
+		}
+
 		if (!(flags2 & O_TRUNC)) {
 			info = FILE_WAS_OPENED;
 		} else {



More information about the samba-cvs mailing list