svn commit: samba r9542 - in trunk/source/smbd: .

vlendec at samba.org vlendec at samba.org
Tue Aug 23 20:46:11 GMT 2005


Author: vlendec
Date: 2005-08-23 20:46:10 +0000 (Tue, 23 Aug 2005)
New Revision: 9542

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

Log:
If someone writes to a file with level2 opens around, these are notified. At
the same time this notification is written down in the share mode db. This
leads to an accepted discrapency between fsp->oplock_type and locking.tdb. Fix
validate_my_share_entries accordingly. release_level_2_oplocks_on_change does
not need to send around messages either if this has happened.

Volker

Modified:
   trunk/source/smbd/open.c
   trunk/source/smbd/oplock.c


Changeset:
Modified: trunk/source/smbd/open.c
===================================================================
--- trunk/source/smbd/open.c	2005-08-23 20:23:43 UTC (rev 9541)
+++ trunk/source/smbd/open.c	2005-08-23 20:46:10 UTC (rev 9542)
@@ -492,6 +492,13 @@
 			  "share entry with an open file\n");
 	}
 
+	if ((share_entry->op_type == NO_OPLOCK) &&
+	    (fsp->oplock_type == FAKE_LEVEL_II_OPLOCK)) {
+		/* Someone has already written to it, but I haven't yet
+		 * noticed */
+		return;
+	}
+
 	if (((uint16)fsp->oplock_type) != share_entry->op_type) {
 		pstring str;
 		DEBUG(0,("validate_my_share_entries: PANIC : %s\n",

Modified: trunk/source/smbd/oplock.c
===================================================================
--- trunk/source/smbd/oplock.c	2005-08-23 20:23:43 UTC (rev 9541)
+++ trunk/source/smbd/oplock.c	2005-08-23 20:46:10 UTC (rev 9542)
@@ -633,6 +633,24 @@
 	DEBUG(10,("release_level_2_oplocks_on_change: num_share_modes = %d\n", 
 			num_share_modes ));
 
+	if (fsp->oplock_type == FAKE_LEVEL_II_OPLOCK) {
+		/* See if someone else has already downgraded us, then we
+		   don't have to do anything */
+		for (i=0; i<num_share_modes; i++) {
+			if ((share_list[i].op_type == NO_OPLOCK) &&
+			    (share_list[i].share_file_id == fsp->file_id) &&
+			    (share_list[i].dev == fsp->dev) &&
+			    (share_list[i].inode == fsp->inode) &&
+			    (share_list[i].pid == sys_getpid())) {
+				/* We're done */
+				fsp->oplock_type = NO_OPLOCK;
+				SAFE_FREE(share_list);
+				unlock_share_entry_fsp(fsp);
+				return;
+			}
+		}
+	}
+
 	for(i = 0; i < num_share_modes; i++) {
 		share_mode_entry *share_entry = &share_list[i];
 



More information about the samba-cvs mailing list