svn commit: samba r20525 - in branches: SAMBA_3_0/source/smbd
SAMBA_4_0/source/torture/basic
vlendec at samba.org
vlendec at samba.org
Thu Jan 4 16:26:15 GMT 2007
Author: vlendec
Date: 2007-01-04 16:26:15 +0000 (Thu, 04 Jan 2007)
New Revision: 20525
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20525
Log:
Closing a dir with del-on-close set requires the same as files: Don't actually
unlink/rmdir if another process still has it open.
Jeremy, this is a potential merger to 3.0.24.
Volker
Modified:
branches/SAMBA_3_0/source/smbd/close.c
branches/SAMBA_4_0/source/torture/basic/delete.c
Changeset:
Modified: branches/SAMBA_3_0/source/smbd/close.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/close.c 2007-01-04 15:12:22 UTC (rev 20524)
+++ branches/SAMBA_3_0/source/smbd/close.c 2007-01-04 16:26:15 UTC (rev 20525)
@@ -392,6 +392,18 @@
delete_dir = (lck->delete_on_close | lck->initial_delete_on_close);
+ if (delete_dir) {
+ int i;
+ /* See if others still have the dir open. If this is the
+ * case, then don't delete */
+ for (i=0; i<lck->num_share_modes; i++) {
+ if (is_valid_share_mode_entry(&lck->share_modes[i])) {
+ delete_dir = False;
+ break;
+ }
+ }
+ }
+
if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
delete_dir &&
lck->delete_token) {
Modified: branches/SAMBA_4_0/source/torture/basic/delete.c
===================================================================
--- branches/SAMBA_4_0/source/torture/basic/delete.c 2007-01-04 15:12:22 UTC (rev 20524)
+++ branches/SAMBA_4_0/source/torture/basic/delete.c 2007-01-04 16:26:15 UTC (rev 20525)
@@ -1254,6 +1254,85 @@
return correct;
}
+
+/* Test 22 ... */
+
+/*
+ * Test whether a second *directory* handle inhibits delete if the first has
+ * del-on-close set and is closed
+ */
+static bool deltest22(struct torture_context *tctx)
+{
+ int dnum1 = -1;
+ int dnum2 = -1;
+ struct smbcli_state *cli1;
+ bool correct = True;
+
+ if (!torture_open_connection(&cli1, 0))
+ return False;
+
+ smbcli_deltree(cli1->tree, dname);
+
+ torture_assert_ntstatus_ok(
+ tctx, smbcli_mkdir(cli1->tree, dname),
+ talloc_asprintf(tctx, "smbcli_mdir failed: (%s)\n",
+ smbcli_errstr(cli1->tree)));
+
+ dnum1 = smbcli_nt_create_full(cli1->tree, dname, 0,
+ SEC_FILE_READ_DATA|
+ SEC_FILE_WRITE_DATA|
+ SEC_STD_DELETE,
+ FILE_ATTRIBUTE_DIRECTORY,
+ NTCREATEX_SHARE_ACCESS_READ|
+ NTCREATEX_SHARE_ACCESS_WRITE|
+ NTCREATEX_SHARE_ACCESS_DELETE,
+ NTCREATEX_DISP_OPEN,
+ NTCREATEX_OPTIONS_DIRECTORY, 0);
+
+ torture_assert(tctx, dnum1 != -1,
+ talloc_asprintf(tctx, "open of %s failed: %s!",
+ dname, smbcli_errstr(cli1->tree)));
+
+ dnum2 = smbcli_nt_create_full(cli1->tree, dname, 0,
+ SEC_FILE_READ_DATA|
+ SEC_FILE_WRITE_DATA,
+ FILE_ATTRIBUTE_DIRECTORY,
+ NTCREATEX_SHARE_ACCESS_READ|
+ NTCREATEX_SHARE_ACCESS_WRITE|
+ NTCREATEX_SHARE_ACCESS_DELETE,
+ NTCREATEX_DISP_OPEN,
+ NTCREATEX_OPTIONS_DIRECTORY, 0);
+
+ torture_assert(tctx, dnum2 != -1,
+ talloc_asprintf(tctx, "open of %s failed: %s!",
+ dname, smbcli_errstr(cli1->tree)));
+
+ torture_assert_ntstatus_ok(
+ tctx, smbcli_nt_delete_on_close(cli1->tree, dnum1, True),
+ talloc_asprintf(tctx, "setting delete_on_close failed (%s)",
+ smbcli_errstr(cli1->tree)));
+
+ smbcli_close(cli1->tree, dnum1);
+
+ dnum1 = smbcli_nt_create_full(cli1->tree, dname, 0,
+ SEC_FILE_READ_DATA|
+ SEC_FILE_WRITE_DATA|
+ SEC_STD_DELETE,
+ FILE_ATTRIBUTE_DIRECTORY,
+ NTCREATEX_SHARE_ACCESS_READ|
+ NTCREATEX_SHARE_ACCESS_WRITE|
+ NTCREATEX_SHARE_ACCESS_DELETE,
+ NTCREATEX_DISP_OPEN,
+ NTCREATEX_OPTIONS_DIRECTORY, 0);
+
+ torture_assert(tctx, dnum1 == -1,
+ talloc_asprintf(tctx, "open of %s succeeded!\n",
+ dname));
+
+ CHECK_STATUS(cli1, NT_STATUS_DELETE_PENDING);
+
+ return correct;
+}
/*
Test delete on close semantics.
@@ -1285,6 +1364,7 @@
torture_suite_add_2smb_test(suite, "deltest19", deltest19);
torture_suite_add_2smb_test(suite, "deltest20", deltest20);
torture_suite_add_simple_test(suite, "deltest21", deltest21);
+ torture_suite_add_simple_test(suite, "deltest22", deltest22);
return suite;
}
More information about the samba-cvs
mailing list