diff options
-rw-r--r-- | selftest/skip | 2 | ||||
-rw-r--r-- | source4/torture/smb2/ioctl.c | 49 | ||||
-rw-r--r-- | source4/torture/smb2/smb2.c | 2 |
3 files changed, 53 insertions, 0 deletions
diff --git a/selftest/skip b/selftest/skip index 43f65c3f1bd..d9e615146fb 100644 --- a/selftest/skip +++ b/selftest/skip @@ -70,6 +70,7 @@ ^samba3.smb2.hold-oplock # Not a test, but a way to block other clients for a test ^samba3.smb2.hold-sharemode # Not a test, but a way to block other clients for a test ^samba3.smb2.check-sharemode # Not a test, but a way to test sharemodes outside of Samba +^samba3.smb2.set-sparse-ioctl # For manual testing, needs additional parameters. ^samba3.smb2.durable-open-disconnect # Not a test, but a way to create a disconnected durable ^samba3.smb2.scan # No tests ^samba3.smb2.oplock.levelii501 # No test yet @@ -83,6 +84,7 @@ ^samba4.smb2.hold-oplock # Not a test, but a way to block other clients for a test ^samba4.smb2.hold-sharemode # Not a test, but a way to block other clients for a test ^samba4.smb2.check-sharemode # Not a test, but a way to test sharemodes outside of Samba +^samba4.smb2.set-sparse-ioctl # For manual testing, needs additional parameters. ^samba4.raw.ping.pong # Needs second server to test ^samba4.rpc.samr.accessmask ^samba4.rpc.samr.passwords.*ncacn_np\(ad_dc_ntvfs\) # currently fails, possibly config issue diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c index 302ca4418f1..39aedba7cc8 100644 --- a/source4/torture/smb2/ioctl.c +++ b/source4/torture/smb2/ioctl.c @@ -3235,6 +3235,55 @@ static NTSTATUS test_sparse_get(struct torture_context *torture, return status; } +/* + * Manually test setting and clearing sparse flag. Intended for file system + * specifc tests to toggle the flag through SMB and check the status in the + * file system. + */ +bool test_ioctl_set_sparse(struct torture_context *tctx) +{ + bool set, ret = true; + const char *filename = NULL; + struct smb2_create create = { }; + struct smb2_tree *tree = NULL; + NTSTATUS status; + + set = torture_setting_bool(tctx, "set_sparse", true); + filename = torture_setting_string(tctx, "filename", NULL); + + if (filename == NULL) { + torture_fail(tctx, "Need to provide filename through " + "--option=torture:filename=testfile\n"); + return false; + } + + if (!torture_smb2_connection(tctx, &tree)) { + torture_comment(tctx, "Initializing smb2 connection failed.\n"); + return false; + } + + create.in.desired_access = SEC_RIGHTS_DIR_ALL; + create.in.create_options = 0; + create.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + create.in.share_access = NTCREATEX_SHARE_ACCESS_READ | + NTCREATEX_SHARE_ACCESS_WRITE | + NTCREATEX_SHARE_ACCESS_DELETE; + create.in.create_disposition = NTCREATEX_DISP_OPEN_IF; + create.in.fname = filename; + + status = smb2_create(tree, tctx, &create); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "CREATE failed.\n"); + + status = test_ioctl_sparse_req(tctx, tctx, tree, + create.out.file.handle, set); + torture_assert_ntstatus_ok_goto(tctx, status, ret, done, + "FSCTL_SET_SPARSE failed.\n"); +done: + + return ret; +} + static bool test_ioctl_sparse_file_flag(struct torture_context *torture, struct smb2_tree *tree) { diff --git a/source4/torture/smb2/smb2.c b/source4/torture/smb2/smb2.c index 2a465a55ba2..56df0ddaafe 100644 --- a/source4/torture/smb2/smb2.c +++ b/source4/torture/smb2/smb2.c @@ -175,6 +175,8 @@ NTSTATUS torture_smb2_init(TALLOC_CTX *ctx) torture_suite_add_suite(suite, torture_smb2_kernel_oplocks_init(suite)); torture_suite_add_suite(suite, torture_smb2_streams_init(suite)); torture_suite_add_suite(suite, torture_smb2_ioctl_init(suite)); + torture_suite_add_simple_test(suite, "set-sparse-ioctl", + test_ioctl_set_sparse); torture_suite_add_suite(suite, torture_smb2_rename_init(suite)); torture_suite_add_1smb2_test(suite, "bench-oplock", test_smb2_bench_oplock); torture_suite_add_suite(suite, torture_smb2_sharemode_init(suite)); |