The Samba-Bugzilla – Attachment 6150 Details for
Bug 7815
sparse bit handling needs to be more windows-like
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
incomplete torture tests
tmp.diff (text/plain), 12.48 KB, created by
Stefan Metzmacher
on 2010-12-18 01:59:10 UTC
(
hide
)
Description:
incomplete torture tests
Filename:
MIME Type:
Creator:
Stefan Metzmacher
Created:
2010-12-18 01:59:10 UTC
Size:
12.48 KB
patch
obsolete
>From 6edb10d6793e270315d3cfe6a8f1c7ae35fe5f31 Mon Sep 17 00:00:00 2001 >From: Stefan Metzmacher <metze@samba.org> >Date: Mon, 22 Nov 2010 12:55:17 +0100 >Subject: [PATCH 1/2] RAW-SFILEINFO: add "SPARSE" subtest > >This should demonstrate the behavior of the FILE_ATTRIBUTE_SPARSE. > >metze >--- > source4/torture/raw/setfileinfo.c | 138 ++++++++++++++++++++++++++++++++++++- > 1 files changed, 136 insertions(+), 2 deletions(-) > >diff --git a/source4/torture/raw/setfileinfo.c b/source4/torture/raw/setfileinfo.c >index f3abf5b..d5b3d42 100644 >--- a/source4/torture/raw/setfileinfo.c >+++ b/source4/torture/raw/setfileinfo.c >@@ -1141,6 +1141,140 @@ done: > return ret; > } > >+static bool >+torture_raw_sfileinfo_sparse(struct torture_context *tctx, >+ struct smbcli_state *cli) >+{ >+ const char *fname = BASEDIR "\\test_sparse.dat"; >+ NTSTATUS status; >+ bool ret = true; >+ union smb_open io; >+ union smb_setfileinfo sfinfo; >+ union smb_fileinfo finfo; >+ union smb_write wr; >+ uint16_t fnum=0; >+ uint8_t buf[8192]; >+ >+ if (!torture_setup_dir(cli, BASEDIR)) { >+ return false; >+ } >+ >+ /* cleanup */ >+ smbcli_unlink(cli->tree, fname); >+ >+ memset(buf, 0xAB, sizeof(buf)); >+ >+ /* >+ * create a normal file, verify archive bit >+ */ >+ io.generic.level = RAW_OPEN_NTCREATEX; >+ io.ntcreatex.in.root_fid.fnum = 0; >+ io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; >+ io.ntcreatex.in.alloc_size = sizeof(buf); >+ io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; >+ io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE; >+ io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; >+ io.ntcreatex.in.create_options = 0; >+ io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; >+ io.ntcreatex.in.security_flags = 0; >+ io.ntcreatex.in.fname = fname; >+ io.ntcreatex.in.flags = 0; >+ status = smb_raw_open(cli->tree, tctx, &io); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "open failed"); >+ fnum = io.ntcreatex.out.file.fnum; >+ >+ torture_assert_int_equal_goto(tctx, >+ io.ntcreatex.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >+ FILE_ATTRIBUTE_ARCHIVE, >+ ret, done, "sparse bit not set"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.alloc_size, >+ io.ntcreatex.in.alloc_size, >+ ret, done, "alloc_size mismatch"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.size, >+ 0, >+ ret, done, "end of file mismatch"); >+ >+ /* >+ * try to turn on sparse bit >+ */ >+ ZERO_STRUCT(sfinfo); >+ sfinfo.generic.level = RAW_SFILEINFO_BASIC_INFO; >+ sfinfo.generic.in.file.fnum = fnum; >+ sfinfo.basic_info.in.attrib = FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_SPARSE; >+ status = smb_raw_setfileinfo(cli->tree, &sfinfo); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "setfileinfo failed"); >+ >+ finfo.generic.level = RAW_FILEINFO_ALL_INFO; >+ finfo.generic.in.file.fnum = fnum; >+ status = smb_raw_fileinfo(cli->tree, tctx, &finfo); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "fileinfo failed"); >+ >+ torture_assert_int_equal_goto(tctx, >+ finfo.all_info.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >+ FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SPARSE, >+ ret, done, "sparse bit set"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.alloc_size, >+ io.ntcreatex.in.alloc_size, >+ ret, done, "alloc_size mismatch"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.size, >+ 0, >+ ret, done, "end of file mismatch"); >+ >+ wr.write.in.file.fnum = fnum; >+ wr.write.in.count = sizeof(buf); >+ wr.write.in.offset = 0; >+ wr.write.in.data = buf; >+ >+ status = smb_raw_write(cli->tree, &wr); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "write failed"); >+ >+ finfo.generic.level = RAW_FILEINFO_ALL_INFO; >+ finfo.generic.in.file.fnum = fnum; >+ status = smb_raw_fileinfo(cli->tree, tctx, &finfo); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "fileinfo failed"); >+ >+ torture_assert_int_equal_goto(tctx, >+ finfo.all_info.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >+ FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SPARSE, >+ ret, done, "sparse bit set"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.alloc_size, >+ io.ntcreatex.in.alloc_size, >+ ret, done, "alloc_size mismatch"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.size, >+ wr.write.in.count, >+ ret, done, "end of file mismatch"); >+ >+ status = smbcli_close(cli->tree, fnum); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "close failed"); >+ >+ status = smbcli_unlink(cli->tree, fname); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "unlink failed"); >+ >+done: >+ smbcli_close(cli->tree, fnum); >+ smbcli_deltree(cli->tree, BASEDIR); >+ return ret; >+} >+ > struct torture_suite *torture_raw_sfileinfo(TALLOC_CTX *mem_ctx) > { > struct torture_suite *suite = torture_suite_create(mem_ctx, "sfileinfo"); >@@ -1152,8 +1286,8 @@ struct torture_suite *torture_raw_sfileinfo(TALLOC_CTX *mem_ctx) > torture_raw_sfileinfo_eof); > torture_suite_add_2smb_test(suite, "end-of-file-access", > torture_raw_sfileinfo_eof_access); >- torture_suite_add_1smb_test(suite, "archive", >- torture_raw_sfileinfo_archive); >+ torture_suite_add_1smb_test(suite, "archive", torture_raw_sfileinfo_archive); >+ torture_suite_add_1smb_test(suite, "sparse", torture_raw_sfileinfo_sparse); > > return suite; > } >-- >1.7.0.4 > > >From 26b618bd40e7fb43320f6ad4f3d6ee99b5c6317a Mon Sep 17 00:00:00 2001 >From: Stefan Metzmacher <metze@samba.org> >Date: Mon, 29 Nov 2010 10:47:42 +0100 >Subject: [PATCH 2/2] SPARSE tests... > >--- > source4/torture/raw/setfileinfo.c | 154 +++++++++++++++++++++++++++++++++--- > 1 files changed, 141 insertions(+), 13 deletions(-) > >diff --git a/source4/torture/raw/setfileinfo.c b/source4/torture/raw/setfileinfo.c >index d5b3d42..2e9247e 100644 >--- a/source4/torture/raw/setfileinfo.c >+++ b/source4/torture/raw/setfileinfo.c >@@ -19,7 +19,9 @@ > > #include "includes.h" > #include "system/time.h" >+#include "libcli/raw/ioctl.h" > #include "libcli/raw/libcliraw.h" >+#include "libcli/raw/raw_proto.h" > #include "libcli/libcli.h" > #include "torture/util.h" > >@@ -1151,9 +1153,12 @@ torture_raw_sfileinfo_sparse(struct torture_context *tctx, > union smb_open io; > union smb_setfileinfo sfinfo; > union smb_fileinfo finfo; >+ union smb_ioctl nt; > union smb_write wr; > uint16_t fnum=0; > uint8_t buf[8192]; >+ uint64_t offset; >+ uint8_t sparse = 0; > > if (!torture_setup_dir(cli, BASEDIR)) { > return false; >@@ -1190,17 +1195,19 @@ torture_raw_sfileinfo_sparse(struct torture_context *tctx, > ret, done, "sparse bit not set"); > > torture_assert_u64_equal_goto(tctx, >- finfo.all_info.out.alloc_size, >+ io.ntcreatex.out.alloc_size, > io.ntcreatex.in.alloc_size, > ret, done, "alloc_size mismatch"); > > torture_assert_u64_equal_goto(tctx, >- finfo.all_info.out.size, >+ io.ntcreatex.out.size, > 0, > ret, done, "end of file mismatch"); > > /* >- * try to turn on sparse bit >+ * try to turn on sparse bit using set file info >+ * this shows that the FILE_ATTRIBUTE_SPARSE is >+ * ignored. > */ > ZERO_STRUCT(sfinfo); > sfinfo.generic.level = RAW_SFILEINFO_BASIC_INFO; >@@ -1218,8 +1225,8 @@ torture_raw_sfileinfo_sparse(struct torture_context *tctx, > > torture_assert_int_equal_goto(tctx, > finfo.all_info.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >- FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SPARSE, >- ret, done, "sparse bit set"); >+ FILE_ATTRIBUTE_NORMAL, >+ ret, done, "sparse bit not set"); > > torture_assert_u64_equal_goto(tctx, > finfo.all_info.out.alloc_size, >@@ -1231,14 +1238,135 @@ torture_raw_sfileinfo_sparse(struct torture_context *tctx, > 0, > ret, done, "end of file mismatch"); > >- wr.write.in.file.fnum = fnum; >- wr.write.in.count = sizeof(buf); >- wr.write.in.offset = 0; >- wr.write.in.data = buf; >+ /* >+ * Set the current stream to sparse >+ */ >+ nt.ioctl.level = RAW_IOCTL_NTIOCTL; >+ nt.ntioctl.in.function = FSCTL_SET_SPARSE; >+ nt.ntioctl.in.file.fnum = fnum; >+ nt.ntioctl.in.fsctl = true; >+ nt.ntioctl.in.filter = 0; >+ nt.ntioctl.in.max_data = 0; >+ nt.ntioctl.in.blob = data_blob_const(NULL, 0); >+ >+ status = smb_raw_ioctl(cli->tree, tctx, &nt); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "FSCTL_SET_SPARSE failed"); >+ >+ finfo.generic.level = RAW_FILEINFO_ALL_INFO; >+ finfo.generic.in.file.fnum = fnum; >+ status = smb_raw_fileinfo(cli->tree, tctx, &finfo); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "fileinfo failed"); > >- status = smb_raw_write(cli->tree, &wr); >+ /* >+ * clear the sparse bit again >+ */ >+ nt.ioctl.level = RAW_IOCTL_NTIOCTL; >+ nt.ntioctl.in.function = FSCTL_SET_SPARSE; >+ nt.ntioctl.in.file.fnum = fnum; >+ nt.ntioctl.in.fsctl = true; >+ nt.ntioctl.in.filter = 0; >+ nt.ntioctl.in.max_data = 0; >+ sparse = 0x00; >+ nt.ntioctl.in.blob = data_blob_const(&sparse, 1); >+ >+ status = smb_raw_ioctl(cli->tree, tctx, &nt); > torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >- ret, done, "write failed"); >+ ret, done, "FSCTL_SET_SPARSE failed"); >+ >+ finfo.generic.level = RAW_FILEINFO_ALL_INFO; >+ finfo.generic.in.file.fnum = fnum; >+ status = smb_raw_fileinfo(cli->tree, tctx, &finfo); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "fileinfo failed"); >+ >+ /* >+ * set the sparse bit again, this resets the allocation size to 0 >+ */ >+ nt.ioctl.level = RAW_IOCTL_NTIOCTL; >+ nt.ntioctl.in.function = FSCTL_SET_SPARSE; >+ nt.ntioctl.in.file.fnum = fnum; >+ nt.ntioctl.in.fsctl = true; >+ nt.ntioctl.in.filter = 0; >+ nt.ntioctl.in.max_data = 0; >+ sparse = 0x01; >+ nt.ntioctl.in.blob = data_blob_const(&sparse, 1); >+ >+ status = smb_raw_ioctl(cli->tree, tctx, &nt); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "FSCTL_SET_SPARSE failed"); >+ >+ finfo.generic.level = RAW_FILEINFO_ALL_INFO; >+ finfo.generic.in.file.fnum = fnum; >+ status = smb_raw_fileinfo(cli->tree, tctx, &finfo); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "fileinfo failed"); >+ >+ /* >+ * now the FILE_ATTRIBUTE_SPARSE flags is set, >+ * that means that at least one stream of the >+ * file is sparse. This >+ */ >+ torture_assert_int_equal_goto(tctx, >+ finfo.all_info.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >+ FILE_ATTRIBUTE_SPARSE, >+ ret, done, "sparse bit set"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.alloc_size, >+ 0, >+ ret, done, "alloc_size mismatch"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.size, >+ 0, >+ ret, done, "end of file mismatch"); >+ >+ /* >+ * now the FILE_ATTRIBUTE_SPARSE flags is set, >+ * that means that at least one stream of the >+ * file is sparse. >+ */ >+ torture_assert_int_equal_goto(tctx, >+ finfo.all_info.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >+ FILE_ATTRIBUTE_SPARSE, >+ ret, done, "sparse bit set"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.alloc_size, >+ 0, >+ ret, done, "alloc_size mismatch"); >+ >+ torture_assert_u64_equal_goto(tctx, >+ finfo.all_info.out.size, >+ 0, >+ ret, done, "end of file mismatch"); >+ >+ io.ntcreatex.in.alloc_size = 0x10000; >+ io.ntcreatex.in.alloc_size = 2*0x10000; >+ offset = 0; >+ ZERO_STRUCT(wr); >+ while (offset < io.ntcreatex.in.alloc_size) { >+ ZERO_STRUCT(wr); >+ wr.writex.level = RAW_WRITE_WRITEX; >+ wr.writex.in.file.fnum = fnum; >+ wr.writex.in.offset = offset; >+ wr.writex.in.wmode = 0; >+ wr.writex.in.count = sizeof(buf); >+ wr.writex.in.data = buf; >+ >+ status = smb_raw_write(cli->tree, &wr); >+ torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, >+ ret, done, "write failed"); >+ >+ torture_assert_int_equal_goto(tctx, >+ wr.writex.out.nwritten, >+ wr.writex.in.count, >+ ret, done, "nwritten"); >+ >+ offset += wr.writex.in.count; >+ } > > finfo.generic.level = RAW_FILEINFO_ALL_INFO; > finfo.generic.in.file.fnum = fnum; >@@ -1248,7 +1376,7 @@ torture_raw_sfileinfo_sparse(struct torture_context *tctx, > > torture_assert_int_equal_goto(tctx, > finfo.all_info.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, >- FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_SPARSE, >+ FILE_ATTRIBUTE_SPARSE, > ret, done, "sparse bit set"); > > torture_assert_u64_equal_goto(tctx, >@@ -1258,7 +1386,7 @@ torture_raw_sfileinfo_sparse(struct torture_context *tctx, > > torture_assert_u64_equal_goto(tctx, > finfo.all_info.out.size, >- wr.write.in.count, >+ io.ntcreatex.in.alloc_size, > ret, done, "end of file mismatch"); > > status = smbcli_close(cli->tree, fnum); >-- >1.7.0.4 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 7815
:
6139
|
6140
|
6141
|
6142
|
6143
|
6144
|
6145
|
6146
|
6147
|
6148
|
6149
| 6150 |
6155