svn commit: samba r14827 - in trunk/source: locking smbd

jra at samba.org jra at samba.org
Thu Mar 30 18:55:48 GMT 2006


Author: jra
Date: 2006-03-30 18:55:46 +0000 (Thu, 30 Mar 2006)
New Revision: 14827

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

Log:
Fix lock tests 4 and 5 when underlying POSIX locks are enabled.
Fix crash bug in error case on blocking lock processing.
Jeremy.

Modified:
   trunk/source/locking/brlock.c
   trunk/source/smbd/blocking.c
   trunk/source/smbd/trans2.c


Changeset:
Modified: trunk/source/locking/brlock.c
===================================================================
--- trunk/source/locking/brlock.c	2006-03-30 15:47:41 UTC (rev 14826)
+++ trunk/source/locking/brlock.c	2006-03-30 18:55:46 UTC (rev 14827)
@@ -371,7 +371,7 @@
 	   lock type so it can cope with the difference between
 	   Windows "stacking" locks and POSIX "flat" ones. */
 
-	if (lp_posix_locking(SNUM(fsp->conn))) {
+	if ((plock->lock_type != PENDING_LOCK) && lp_posix_locking(SNUM(fsp->conn))) {
 		if (!set_posix_lock(fsp, plock->start, plock->size, plock->lock_type, WINDOWS_LOCK)) {
 			if (errno == EACCES || errno == EAGAIN) {
 				return NT_STATUS_FILE_LOCK_CONFLICT;
@@ -660,7 +660,7 @@
 	   lock type so it can cope with the difference between
 	   Windows "stacking" locks and POSIX "flat" ones. */
 
-	if (lp_posix_locking(SNUM(fsp->conn))) {
+	if ((plock->lock_type != PENDING_LOCK) && lp_posix_locking(SNUM(fsp->conn))) {
 		if (!set_posix_lock(fsp, plock->start, plock->size, plock->lock_type, POSIX_LOCK)) {
 			if (errno == EACCES || errno == EAGAIN) {
 				SAFE_FREE(tp);
@@ -800,6 +800,11 @@
 		return False;
 	}
 
+	/* Unlock any POSIX regions. */
+	if(lp_posix_locking(br_lck->fsp->conn->cnum)) {
+		release_posix_lock(br_lck->fsp, plock->start, plock->size);
+	}
+
 	/* Send unlock messages to any pending waiters that overlap. */
 	for (j=0; j < br_lck->num_locks; j++) {
 		struct lock_struct *pend_lock = &locks[j];
@@ -876,8 +881,8 @@
 		lock = &locks[i];
 
 		/* Only remove our own locks - ignore fnum. */
-		if (!brl_same_context(&lock->context, &plock->context) ||
-					lock->lock_type == PENDING_LOCK) {
+		if (lock->lock_type == PENDING_LOCK ||
+				!brl_same_context(&lock->context, &plock->context)) {
 			memcpy(&tp[count], lock, sizeof(struct lock_struct));
 			count++;
 			continue;
@@ -945,6 +950,11 @@
 		return True;
 	}
 
+	/* Unlock any POSIX regions. */
+	if(lp_posix_locking(br_lck->fsp->conn->cnum)) {
+		release_posix_lock(br_lck->fsp, plock->start, plock->size);
+	}
+
 	/* Realloc so we don't leak entries per unlock call. */
 	if (count) {
 		tp = (struct lock_struct *)SMB_REALLOC(tp, count * sizeof(*locks));

Modified: trunk/source/smbd/blocking.c
===================================================================
--- trunk/source/smbd/blocking.c	2006-03-30 15:47:41 UTC (rev 14826)
+++ trunk/source/smbd/blocking.c	2006-03-30 18:55:46 UTC (rev 14827)
@@ -100,6 +100,9 @@
 		return False;
 	}
 
+	blr->next = NULL;
+	blr->prev = NULL;
+
 	if((blr->inbuf = (char *)SMB_MALLOC(length)) == NULL) {
 		DEBUG(0,("push_blocking_lock_request: Malloc fail (2)!\n" ));
 		SAFE_FREE(blr);
@@ -281,19 +284,29 @@
 static void blocking_lock_reply_error(blocking_lock_record *blr, NTSTATUS status)
 {
 	switch(blr->com_type) {
+#if 0
+	/* We no longer push blocking lock requests for anything but lockingX and trans2. */
 	case SMBlock:
 	case SMBlockread:
 		generic_blocking_lock_error(blr, status);
 		break;
+#endif
 	case SMBlockingX:
 		reply_lockingX_error(blr, status);
 		break;
+	case SMBtrans2:
+	case SMBtranss2:
+		generic_blocking_lock_error(blr, status);
+		break;
 	default:
 		DEBUG(0,("blocking_lock_reply_error: PANIC - unknown type on blocking lock queue - exiting.!\n"));
 		exit_server("PANIC - unknown type on blocking lock queue");
 	}
 }
 
+#if 0
+/* We no longer push blocking lock requests for anything but lockingX and trans2. */
+
 /****************************************************************************
  Attempt to finish off getting all pending blocking locks for a lockread call.
  Returns True if we want to be removed from the list.
@@ -431,6 +444,7 @@
 	send_blocking_reply(outbuf,outsize);
 	return True;
 }
+#endif
 
 /****************************************************************************
  Attempt to finish off getting all pending blocking locks for a lockingX call.
@@ -524,12 +538,16 @@
 static BOOL blocking_lock_record_process(blocking_lock_record *blr)
 {
 	switch(blr->com_type) {
+#if 0
+		/* We no longer push blocking lock requests for anything but lockingX and trans2. */
 		case SMBlock:
 			return process_lock(blr);
 		case SMBlockread:
 			return process_lockread(blr);
+#endif
 		case SMBlockingX:
 			return process_lockingX(blr);
+		/* TODO - need to add POSIX SMBtrans and SMBtranss switch here. */
 		default:
 			DEBUG(0,("blocking_lock_record_process: PANIC - unknown type on blocking lock queue - exiting.!\n"));
 			exit_server("PANIC - unknown type on blocking lock queue");

Modified: trunk/source/smbd/trans2.c
===================================================================
--- trunk/source/smbd/trans2.c	2006-03-30 15:47:41 UTC (rev 14826)
+++ trunk/source/smbd/trans2.c	2006-03-30 18:55:46 UTC (rev 14827)
@@ -4521,6 +4521,24 @@
 						&my_lock_ctx);
 
 				/* TODO: Deal with rescheduling blocking lock fail here... */
+				if (lp_blocking_locks(SNUM(conn)) && ERROR_WAS_LOCK_DENIED(status)) {
+					/*
+					 * A blocking lock was requested. Package up
+					 * this smb into a queued request and push it
+					 * onto the blocking lock queue.
+					 */
+					if(push_blocking_lock_request(inbuf, length,
+								fsp,
+								-1, /* infinite timeout. */
+								0,
+								lock_pid,
+								lock_type,
+								POSIX_LOCK,
+								offset,
+								count)) {
+						return -1;
+					}
+				}
 			}
 
 			if (!NT_STATUS_IS_OK(status)) {



More information about the samba-cvs mailing list