svn commit: samba r24765 - in branches/SAMBA_4_0/source/torture/raw: .

tridge at samba.org tridge at samba.org
Wed Aug 29 04:33:30 GMT 2007


Author: tridge
Date: 2007-08-29 04:33:26 +0000 (Wed, 29 Aug 2007)
New Revision: 24765

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

Log:

added a RAW-HOLD-OPLOCK test. This is a manual test, meant to be used
to test the interaction of oplocks with local filesystem or NFS
access. You start it, then manually access the 4 files via another
mechanism (such as a shell) and see what oplock breaks you get

Modified:
   branches/SAMBA_4_0/source/torture/raw/oplock.c
   branches/SAMBA_4_0/source/torture/raw/raw.c


Changeset:
Modified: branches/SAMBA_4_0/source/torture/raw/oplock.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/oplock.c	2007-08-29 04:06:09 UTC (rev 24764)
+++ branches/SAMBA_4_0/source/torture/raw/oplock.c	2007-08-29 04:33:26 UTC (rev 24765)
@@ -1388,3 +1388,112 @@
 	talloc_free(mem_ctx);
 	return ret;
 }
+
+
+static struct hold_oplock_info {
+	const char *fname;
+	bool close_on_break;
+	uint32_t share_access;
+	uint16_t fnum;
+} hold_info[] = {
+	{ BASEDIR "\\notshared_close", True,  
+	  NTCREATEX_SHARE_ACCESS_NONE, },
+	{ BASEDIR "\\notshared_noclose", False, 
+	  NTCREATEX_SHARE_ACCESS_NONE, },
+	{ BASEDIR "\\shared_close", True,  
+	  NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE, },
+	{ BASEDIR "\\shared_noclose", False,  
+	  NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE, },
+};
+
+static BOOL oplock_handler_hold(struct smbcli_transport *transport, uint16_t tid, 
+				uint16_t fnum, uint8_t level, void *private)
+{
+	struct smbcli_tree *tree = private;
+	struct hold_oplock_info *info;
+	int i;
+
+	for (i=0;i<ARRAY_SIZE(hold_info);i++) {
+		if (hold_info[i].fnum == fnum) break;
+	}
+
+	if (i == ARRAY_SIZE(hold_info)) {
+		printf("oplock break for unknown fnum %u\n", fnum);
+		return False;
+	}
+
+	info = &hold_info[i];
+
+	if (info->close_on_break) {
+		printf("oplock break on %s - closing\n",
+		       info->fname);
+		oplock_handler_close(transport, tid, fnum, level, private);
+		return True;
+	}
+
+	printf("oplock break on %s - acking break\n", info->fname);
+
+	return smbcli_oplock_ack(tree, fnum, OPLOCK_BREAK_TO_NONE);
+}
+
+
+/* 
+   used for manual testing of oplocks - especially interaction with
+   other filesystems (such as NFS and local access)
+*/
+BOOL torture_hold_oplock(struct torture_context *torture, 
+			 struct smbcli_state *cli)
+{
+	struct event_context *ev = cli->transport->socket->event.ctx;
+	int i;
+
+	printf("Setting up open files with oplocks in %s\n", BASEDIR);
+
+	if (!torture_setup_dir(cli, BASEDIR)) {
+		return False;
+	}
+
+	smbcli_oplock_handler(cli->transport, oplock_handler_hold, cli->tree);
+
+	/* setup the files */
+	for (i=0;i<ARRAY_SIZE(hold_info);i++) {
+		union smb_open io;
+		NTSTATUS status;
+
+		io.generic.level = RAW_OPEN_NTCREATEX;
+		io.ntcreatex.in.root_fid = 0;
+		io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
+		io.ntcreatex.in.alloc_size = 0;
+		io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+		io.ntcreatex.in.share_access = hold_info[i].share_access;
+		io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+		io.ntcreatex.in.create_options = 0;
+		io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+		io.ntcreatex.in.security_flags = 0;
+		io.ntcreatex.in.fname = hold_info[i].fname;
+		io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED | 
+			NTCREATEX_FLAGS_REQUEST_OPLOCK |
+			NTCREATEX_FLAGS_REQUEST_BATCH_OPLOCK;
+		printf("opening %s\n", hold_info[i].fname);
+
+		status = smb_raw_open(cli->tree, cli, &io);
+		if (!NT_STATUS_IS_OK(status)) {
+			printf("Failed to open %s - %s\n", 
+			       hold_info[i].fname, nt_errstr(status));
+			return False;
+		}
+
+		if (io.ntcreatex.out.oplock_level != BATCH_OPLOCK_RETURN) {
+			printf("Oplock not granted for %s - expected %d but got %d\n", 
+			       hold_info[i].fname, BATCH_OPLOCK_RETURN, 
+				io.ntcreatex.out.oplock_level);
+			return False;
+		}
+		hold_info[i].fnum = io.ntcreatex.out.file.fnum;
+	}
+
+	printf("Waiting for oplock events\n");
+	event_loop_wait(ev);
+
+	return True;
+}

Modified: branches/SAMBA_4_0/source/torture/raw/raw.c
===================================================================
--- branches/SAMBA_4_0/source/torture/raw/raw.c	2007-08-29 04:06:09 UTC (rev 24764)
+++ branches/SAMBA_4_0/source/torture/raw/raw.c	2007-08-29 04:33:26 UTC (rev 24765)
@@ -44,6 +44,7 @@
 	torture_suite_add_1smb_test(suite, "OPEN", torture_raw_open);
 	torture_suite_add_1smb_test(suite, "MKDIR", torture_raw_mkdir);
 	torture_suite_add_suite(suite, torture_raw_oplock(suite));
+	torture_suite_add_1smb_test(suite, "HOLD-OPLOCK", torture_hold_oplock);
 	torture_suite_add_2smb_test(suite, "NOTIFY", torture_raw_notify);
 	torture_suite_add_1smb_test(suite, "MUX", torture_raw_mux);
 	torture_suite_add_1smb_test(suite, "IOCTL", torture_raw_ioctl);



More information about the samba-cvs mailing list