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