2 Unix SMB/CIFS implementation.
4 a pass-thru NTVFS module to record a NBENCH load file
6 Copyright (C) Andrew Tridgell 2004
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 "passthru" in this module refers to the next level of NTVFS being used
27 #include "ntvfs/ntvfs.h"
28 #include "system/filesys.h"
30 /* this is stored in ntvfs_private */
31 struct nbench_private
{
36 log one request to the nbench log
38 static void nbench_log(struct ntvfs_request
*req
,
39 const char *format
, ...) PRINTF_ATTRIBUTE(2, 3);
41 static void nbench_log(struct ntvfs_request
*req
,
42 const char *format
, ...)
44 struct nbench_private
*nprivates
= req
->async_states
->ntvfs
->private_data
;
49 vasprintf(&s
, format
, ap
);
52 write(nprivates
->log_fd
, s
, strlen(s
));
56 static char *nbench_ntvfs_handle_string(struct ntvfs_request
*req
, struct ntvfs_handle
*h
)
61 key
= ntvfs_handle_get_wire_key(h
, req
);
64 case 2: /* SMB fnum */
65 fnum
= SVAL(key
.data
, 0);
68 DEBUG(0,("%s: invalid wire handle size: %u\n",
69 __FUNCTION__
, (unsigned)key
.length
));
73 return talloc_asprintf(req
, "%u", fnum
);
77 this pass through macro operates on request contexts, and disables
80 async calls are a pain for the nbench module as it makes pulling the
81 status code and any result parameters much harder.
83 #define PASS_THRU_REQ_PRE_ASYNC(ntvfs, req, op, par1) do { \
84 status = ntvfs_async_state_push(ntvfs, req, par1, nbench_##op##_send); \
85 if (!NT_STATUS_IS_OK(status)) { \
90 #define PASS_THRU_REQ_POST_ASYNC(req) do { \
91 req->async_states->status = status; \
92 if (!(req->async_states->state & NTVFS_ASYNC_STATE_ASYNC)) { \
93 req->async_states->send_fn(req); \
97 #define PASS_THRU_REQ(ntvfs, req, op, par1, args) do { \
98 PASS_THRU_REQ_PRE_ASYNC(ntvfs, req, op, par1); \
99 status = ntvfs_next_##op args; \
100 PASS_THRU_REQ_POST_ASYNC(req); \
103 #define PASS_THRU_REP_POST(req) do { \
104 ntvfs_async_state_pop(req); \
105 if (req->async_states->state & NTVFS_ASYNC_STATE_ASYNC) { \
106 req->async_states->send_fn(req); \
111 connect to a share - used when a tree_connect operation comes in.
113 static NTSTATUS
nbench_connect(struct ntvfs_module_context
*ntvfs
,
114 struct ntvfs_request
*req
,
117 struct nbench_private
*nprivates
;
119 char *logname
= NULL
;
121 nprivates
= talloc(ntvfs
, struct nbench_private
);
123 return NT_STATUS_NO_MEMORY
;
126 logname
= talloc_asprintf(req
, "/tmp/nbenchlog%d.%u", ntvfs
->depth
,
128 NT_STATUS_HAVE_NO_MEMORY(logname
);
129 nprivates
->log_fd
= open(logname
, O_WRONLY
|O_CREAT
|O_APPEND
, 0644);
130 talloc_free(logname
);
132 if (nprivates
->log_fd
== -1) {
133 DEBUG(0,("Failed to open nbench log\n"));
134 return NT_STATUS_UNSUCCESSFUL
;
137 ntvfs
->private_data
= nprivates
;
139 status
= ntvfs_next_connect(ntvfs
, req
, con
);
145 disconnect from a share
147 static NTSTATUS
nbench_disconnect(struct ntvfs_module_context
*ntvfs
)
149 struct nbench_private
*nprivates
= ntvfs
->private_data
;
152 close(nprivates
->log_fd
);
154 status
= ntvfs_next_disconnect(ntvfs
);
160 delete a file - the dirtype specifies the file types to include in the search.
161 The name can contain CIFS wildcards, but rarely does (except with OS/2 clients)
163 static void nbench_unlink_send(struct ntvfs_request
*req
)
165 union smb_unlink
*unl
= req
->async_states
->private_data
;
167 nbench_log(req
, "Unlink \"%s\" 0x%x %s\n",
168 unl
->unlink
.in
.pattern
, unl
->unlink
.in
.attrib
,
169 get_nt_error_c_code(req
->async_states
->status
));
171 PASS_THRU_REP_POST(req
);
174 static NTSTATUS
nbench_unlink(struct ntvfs_module_context
*ntvfs
,
175 struct ntvfs_request
*req
,
176 union smb_unlink
*unl
)
180 PASS_THRU_REQ(ntvfs
, req
, unlink
, unl
, (ntvfs
, req
, unl
));
188 static void nbench_ioctl_send(struct ntvfs_request
*req
)
190 nbench_log(req
, "Ioctl - NOT HANDLED\n");
192 PASS_THRU_REP_POST(req
);
195 static NTSTATUS
nbench_ioctl(struct ntvfs_module_context
*ntvfs
,
196 struct ntvfs_request
*req
, union smb_ioctl
*io
)
200 PASS_THRU_REQ(ntvfs
, req
, ioctl
, io
, (ntvfs
, req
, io
));
206 check if a directory exists
208 static void nbench_chkpath_send(struct ntvfs_request
*req
)
210 union smb_chkpath
*cp
= req
->async_states
->private_data
;
212 nbench_log(req
, "Chkpath \"%s\" %s\n",
214 get_nt_error_c_code(req
->async_states
->status
));
216 PASS_THRU_REP_POST(req
);
219 static NTSTATUS
nbench_chkpath(struct ntvfs_module_context
*ntvfs
,
220 struct ntvfs_request
*req
,
221 union smb_chkpath
*cp
)
225 PASS_THRU_REQ(ntvfs
, req
, chkpath
, cp
, (ntvfs
, req
, cp
));
231 return info on a pathname
233 static void nbench_qpathinfo_send(struct ntvfs_request
*req
)
235 union smb_fileinfo
*info
= req
->async_states
->private_data
;
237 nbench_log(req
, "QUERY_PATH_INFORMATION \"%s\" %d %s\n",
238 info
->generic
.in
.file
.path
,
240 get_nt_error_c_code(req
->async_states
->status
));
242 PASS_THRU_REP_POST(req
);
245 static NTSTATUS
nbench_qpathinfo(struct ntvfs_module_context
*ntvfs
,
246 struct ntvfs_request
*req
, union smb_fileinfo
*info
)
250 PASS_THRU_REQ(ntvfs
, req
, qpathinfo
, info
, (ntvfs
, req
, info
));
256 query info on a open file
258 static void nbench_qfileinfo_send(struct ntvfs_request
*req
)
260 union smb_fileinfo
*info
= req
->async_states
->private_data
;
262 nbench_log(req
, "QUERY_FILE_INFORMATION %s %d %s\n",
263 nbench_ntvfs_handle_string(req
, info
->generic
.in
.file
.ntvfs
),
265 get_nt_error_c_code(req
->async_states
->status
));
267 PASS_THRU_REP_POST(req
);
270 static NTSTATUS
nbench_qfileinfo(struct ntvfs_module_context
*ntvfs
,
271 struct ntvfs_request
*req
, union smb_fileinfo
*info
)
275 PASS_THRU_REQ(ntvfs
, req
, qfileinfo
, info
, (ntvfs
, req
, info
));
281 set info on a pathname
283 static void nbench_setpathinfo_send(struct ntvfs_request
*req
)
285 union smb_setfileinfo
*st
= req
->async_states
->private_data
;
287 nbench_log(req
, "SET_PATH_INFORMATION \"%s\" %d %s\n",
288 st
->generic
.in
.file
.path
,
290 get_nt_error_c_code(req
->async_states
->status
));
292 PASS_THRU_REP_POST(req
);
295 static NTSTATUS
nbench_setpathinfo(struct ntvfs_module_context
*ntvfs
,
296 struct ntvfs_request
*req
, union smb_setfileinfo
*st
)
300 PASS_THRU_REQ(ntvfs
, req
, setpathinfo
, st
, (ntvfs
, req
, st
));
308 static void nbench_open_send(struct ntvfs_request
*req
)
310 union smb_open
*io
= req
->async_states
->private_data
;
312 switch (io
->generic
.level
) {
313 case RAW_OPEN_NTCREATEX
:
314 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
315 ZERO_STRUCT(io
->ntcreatex
.out
);
317 nbench_log(req
, "NTCreateX \"%s\" 0x%x 0x%x %s %s\n",
318 io
->ntcreatex
.in
.fname
,
319 io
->ntcreatex
.in
.create_options
,
320 io
->ntcreatex
.in
.open_disposition
,
321 nbench_ntvfs_handle_string(req
, io
->ntcreatex
.out
.file
.ntvfs
),
322 get_nt_error_c_code(req
->async_states
->status
));
326 nbench_log(req
, "Open-%d - NOT HANDLED\n",
331 PASS_THRU_REP_POST(req
);
334 static NTSTATUS
nbench_open(struct ntvfs_module_context
*ntvfs
,
335 struct ntvfs_request
*req
, union smb_open
*io
)
339 #undef open /* AIX defines open to be open64 */
340 PASS_THRU_REQ(ntvfs
, req
, open
, io
, (ntvfs
, req
, io
));
348 static void nbench_mkdir_send(struct ntvfs_request
*req
)
350 nbench_log(req
, "Mkdir - NOT HANDLED\n");
352 PASS_THRU_REP_POST(req
);
355 static NTSTATUS
nbench_mkdir(struct ntvfs_module_context
*ntvfs
,
356 struct ntvfs_request
*req
, union smb_mkdir
*md
)
360 PASS_THRU_REQ(ntvfs
, req
, mkdir
, md
, (ntvfs
, req
, md
));
368 static void nbench_rmdir_send(struct ntvfs_request
*req
)
370 struct smb_rmdir
*rd
= req
->async_states
->private_data
;
372 nbench_log(req
, "Rmdir \"%s\" %s\n",
374 get_nt_error_c_code(req
->async_states
->status
));
376 PASS_THRU_REP_POST(req
);
379 static NTSTATUS
nbench_rmdir(struct ntvfs_module_context
*ntvfs
,
380 struct ntvfs_request
*req
, struct smb_rmdir
*rd
)
384 PASS_THRU_REQ(ntvfs
, req
, rmdir
, rd
, (ntvfs
, req
, rd
));
390 rename a set of files
392 static void nbench_rename_send(struct ntvfs_request
*req
)
394 union smb_rename
*ren
= req
->async_states
->private_data
;
396 switch (ren
->generic
.level
) {
397 case RAW_RENAME_RENAME
:
398 nbench_log(req
, "Rename \"%s\" \"%s\" %s\n",
399 ren
->rename
.in
.pattern1
,
400 ren
->rename
.in
.pattern2
,
401 get_nt_error_c_code(req
->async_states
->status
));
405 nbench_log(req
, "Rename-%d - NOT HANDLED\n",
410 PASS_THRU_REP_POST(req
);
413 static NTSTATUS
nbench_rename(struct ntvfs_module_context
*ntvfs
,
414 struct ntvfs_request
*req
, union smb_rename
*ren
)
418 PASS_THRU_REQ(ntvfs
, req
, rename
, ren
, (ntvfs
, req
, ren
));
426 static void nbench_copy_send(struct ntvfs_request
*req
)
428 nbench_log(req
, "Copy - NOT HANDLED\n");
430 PASS_THRU_REP_POST(req
);
433 static NTSTATUS
nbench_copy(struct ntvfs_module_context
*ntvfs
,
434 struct ntvfs_request
*req
, struct smb_copy
*cp
)
438 PASS_THRU_REQ(ntvfs
, req
, copy
, cp
, (ntvfs
, req
, cp
));
446 static void nbench_read_send(struct ntvfs_request
*req
)
448 union smb_read
*rd
= req
->async_states
->private_data
;
450 switch (rd
->generic
.level
) {
452 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
453 ZERO_STRUCT(rd
->readx
.out
);
455 nbench_log(req
, "ReadX %s %d %d %d %s\n",
456 nbench_ntvfs_handle_string(req
, rd
->readx
.in
.file
.ntvfs
),
457 (int)rd
->readx
.in
.offset
,
460 get_nt_error_c_code(req
->async_states
->status
));
463 nbench_log(req
, "Read-%d - NOT HANDLED\n",
468 PASS_THRU_REP_POST(req
);
471 static NTSTATUS
nbench_read(struct ntvfs_module_context
*ntvfs
,
472 struct ntvfs_request
*req
, union smb_read
*rd
)
476 PASS_THRU_REQ(ntvfs
, req
, read
, rd
, (ntvfs
, req
, rd
));
484 static void nbench_write_send(struct ntvfs_request
*req
)
486 union smb_write
*wr
= req
->async_states
->private_data
;
488 switch (wr
->generic
.level
) {
489 case RAW_WRITE_WRITEX
:
490 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
491 ZERO_STRUCT(wr
->writex
.out
);
493 nbench_log(req
, "WriteX %s %d %d %d %s\n",
494 nbench_ntvfs_handle_string(req
, wr
->writex
.in
.file
.ntvfs
),
495 (int)wr
->writex
.in
.offset
,
497 wr
->writex
.out
.nwritten
,
498 get_nt_error_c_code(req
->async_states
->status
));
501 case RAW_WRITE_WRITE
:
502 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
503 ZERO_STRUCT(wr
->write
.out
);
505 nbench_log(req
, "Write %s %d %d %d %s\n",
506 nbench_ntvfs_handle_string(req
, wr
->write
.in
.file
.ntvfs
),
509 wr
->write
.out
.nwritten
,
510 get_nt_error_c_code(req
->async_states
->status
));
514 nbench_log(req
, "Write-%d - NOT HANDLED\n",
519 PASS_THRU_REP_POST(req
);
522 static NTSTATUS
nbench_write(struct ntvfs_module_context
*ntvfs
,
523 struct ntvfs_request
*req
, union smb_write
*wr
)
527 PASS_THRU_REQ(ntvfs
, req
, write
, wr
, (ntvfs
, req
, wr
));
535 static void nbench_seek_send(struct ntvfs_request
*req
)
537 nbench_log(req
, "Seek - NOT HANDLED\n");
539 PASS_THRU_REP_POST(req
);
542 static NTSTATUS
nbench_seek(struct ntvfs_module_context
*ntvfs
,
543 struct ntvfs_request
*req
,
548 PASS_THRU_REQ(ntvfs
, req
, seek
, io
, (ntvfs
, req
, io
));
556 static void nbench_flush_send(struct ntvfs_request
*req
)
558 union smb_flush
*io
= req
->async_states
->private_data
;
560 switch (io
->generic
.level
) {
561 case RAW_FLUSH_FLUSH
:
562 nbench_log(req
, "Flush %s %s\n",
563 nbench_ntvfs_handle_string(req
, io
->flush
.in
.file
.ntvfs
),
564 get_nt_error_c_code(req
->async_states
->status
));
567 nbench_log(req
, "Flush %d %s\n",
569 get_nt_error_c_code(req
->async_states
->status
));
572 nbench_log(req
, "Flush-%d - NOT HANDLED\n",
577 PASS_THRU_REP_POST(req
);
580 static NTSTATUS
nbench_flush(struct ntvfs_module_context
*ntvfs
,
581 struct ntvfs_request
*req
,
586 PASS_THRU_REQ(ntvfs
, req
, flush
, io
, (ntvfs
, req
, io
));
594 static void nbench_close_send(struct ntvfs_request
*req
)
596 union smb_close
*io
= req
->async_states
->private_data
;
598 switch (io
->generic
.level
) {
599 case RAW_CLOSE_CLOSE
:
600 nbench_log(req
, "Close %s %s\n",
601 nbench_ntvfs_handle_string(req
, io
->close
.in
.file
.ntvfs
),
602 get_nt_error_c_code(req
->async_states
->status
));
606 nbench_log(req
, "Close-%d - NOT HANDLED\n",
611 PASS_THRU_REP_POST(req
);
614 static NTSTATUS
nbench_close(struct ntvfs_module_context
*ntvfs
,
615 struct ntvfs_request
*req
, union smb_close
*io
)
619 PASS_THRU_REQ(ntvfs
, req
, close
, io
, (ntvfs
, req
, io
));
627 static void nbench_exit_send(struct ntvfs_request
*req
)
629 nbench_log(req
, "Exit - NOT HANDLED\n");
631 PASS_THRU_REP_POST(req
);
634 static NTSTATUS
nbench_exit(struct ntvfs_module_context
*ntvfs
,
635 struct ntvfs_request
*req
)
639 PASS_THRU_REQ(ntvfs
, req
, exit
, NULL
, (ntvfs
, req
));
645 logoff - closing files
647 static void nbench_logoff_send(struct ntvfs_request
*req
)
649 nbench_log(req
, "Logoff - NOT HANDLED\n");
651 PASS_THRU_REP_POST(req
);
654 static NTSTATUS
nbench_logoff(struct ntvfs_module_context
*ntvfs
,
655 struct ntvfs_request
*req
)
659 PASS_THRU_REQ(ntvfs
, req
, logoff
, NULL
, (ntvfs
, req
));
665 async_setup - send fn
667 static void nbench_async_setup_send(struct ntvfs_request
*req
)
669 PASS_THRU_REP_POST(req
);
675 static NTSTATUS
nbench_async_setup(struct ntvfs_module_context
*ntvfs
,
676 struct ntvfs_request
*req
,
681 PASS_THRU_REQ(ntvfs
, req
, async_setup
, NULL
, (ntvfs
, req
, private_data
));
687 static void nbench_cancel_send(struct ntvfs_request
*req
)
689 PASS_THRU_REP_POST(req
);
693 cancel an existing async request
695 static NTSTATUS
nbench_cancel(struct ntvfs_module_context
*ntvfs
,
696 struct ntvfs_request
*req
)
700 PASS_THRU_REQ(ntvfs
, req
, cancel
, NULL
, (ntvfs
, req
));
708 static void nbench_lock_send(struct ntvfs_request
*req
)
710 union smb_lock
*lck
= req
->async_states
->private_data
;
712 if (lck
->generic
.level
== RAW_LOCK_LOCKX
&&
713 lck
->lockx
.in
.lock_cnt
== 1 &&
714 lck
->lockx
.in
.ulock_cnt
== 0) {
715 nbench_log(req
, "LockX %s %d %d %s\n",
716 nbench_ntvfs_handle_string(req
, lck
->lockx
.in
.file
.ntvfs
),
717 (int)lck
->lockx
.in
.locks
[0].offset
,
718 (int)lck
->lockx
.in
.locks
[0].count
,
719 get_nt_error_c_code(req
->async_states
->status
));
720 } else if (lck
->generic
.level
== RAW_LOCK_LOCKX
&&
721 lck
->lockx
.in
.ulock_cnt
== 1) {
722 nbench_log(req
, "UnlockX %s %d %d %s\n",
723 nbench_ntvfs_handle_string(req
, lck
->lockx
.in
.file
.ntvfs
),
724 (int)lck
->lockx
.in
.locks
[0].offset
,
725 (int)lck
->lockx
.in
.locks
[0].count
,
726 get_nt_error_c_code(req
->async_states
->status
));
728 nbench_log(req
, "Lock-%d - NOT HANDLED\n", lck
->generic
.level
);
731 PASS_THRU_REP_POST(req
);
734 static NTSTATUS
nbench_lock(struct ntvfs_module_context
*ntvfs
,
735 struct ntvfs_request
*req
, union smb_lock
*lck
)
739 PASS_THRU_REQ(ntvfs
, req
, lock
, lck
, (ntvfs
, req
, lck
));
745 set info on a open file
747 static void nbench_setfileinfo_send(struct ntvfs_request
*req
)
749 union smb_setfileinfo
*info
= req
->async_states
->private_data
;
751 nbench_log(req
, "SET_FILE_INFORMATION %s %d %s\n",
752 nbench_ntvfs_handle_string(req
, info
->generic
.in
.file
.ntvfs
),
754 get_nt_error_c_code(req
->async_states
->status
));
756 PASS_THRU_REP_POST(req
);
759 static NTSTATUS
nbench_setfileinfo(struct ntvfs_module_context
*ntvfs
,
760 struct ntvfs_request
*req
,
761 union smb_setfileinfo
*info
)
765 PASS_THRU_REQ(ntvfs
, req
, setfileinfo
, info
, (ntvfs
, req
, info
));
771 return filesystem space info
773 static void nbench_fsinfo_send(struct ntvfs_request
*req
)
775 union smb_fsinfo
*fs
= req
->async_states
->private_data
;
777 nbench_log(req
, "QUERY_FS_INFORMATION %d %s\n",
779 get_nt_error_c_code(req
->async_states
->status
));
781 PASS_THRU_REP_POST(req
);
784 static NTSTATUS
nbench_fsinfo(struct ntvfs_module_context
*ntvfs
,
785 struct ntvfs_request
*req
, union smb_fsinfo
*fs
)
789 PASS_THRU_REQ(ntvfs
, req
, fsinfo
, fs
, (ntvfs
, req
, fs
));
795 return print queue info
797 static void nbench_lpq_send(struct ntvfs_request
*req
)
799 union smb_lpq
*lpq
= req
->async_states
->private_data
;
801 nbench_log(req
, "Lpq-%d - NOT HANDLED\n", lpq
->generic
.level
);
803 PASS_THRU_REP_POST(req
);
806 static NTSTATUS
nbench_lpq(struct ntvfs_module_context
*ntvfs
,
807 struct ntvfs_request
*req
, union smb_lpq
*lpq
)
811 PASS_THRU_REQ(ntvfs
, req
, lpq
, lpq
, (ntvfs
, req
, lpq
));
817 list files in a directory matching a wildcard pattern
819 static void nbench_search_first_send(struct ntvfs_request
*req
)
821 union smb_search_first
*io
= req
->async_states
->private_data
;
823 switch (io
->generic
.level
) {
824 case RAW_SEARCH_TRANS2
:
825 if (NT_STATUS_IS_ERR(req
->async_states
->status
)) {
826 ZERO_STRUCT(io
->t2ffirst
.out
);
828 nbench_log(req
, "FIND_FIRST \"%s\" %d %d %d %s\n",
829 io
->t2ffirst
.in
.pattern
,
830 io
->t2ffirst
.data_level
,
831 io
->t2ffirst
.in
.max_count
,
832 io
->t2ffirst
.out
.count
,
833 get_nt_error_c_code(req
->async_states
->status
));
837 nbench_log(req
, "Search-%d - NOT HANDLED\n", io
->generic
.level
);
841 PASS_THRU_REP_POST(req
);
844 static NTSTATUS
nbench_search_first(struct ntvfs_module_context
*ntvfs
,
845 struct ntvfs_request
*req
, union smb_search_first
*io
,
846 void *search_private
,
847 bool (*callback
)(void *, const union smb_search_data
*))
851 PASS_THRU_REQ(ntvfs
, req
, search_first
, io
, (ntvfs
, req
, io
, search_private
, callback
));
856 /* continue a search */
857 static void nbench_search_next_send(struct ntvfs_request
*req
)
859 union smb_search_next
*io
= req
->async_states
->private_data
;
861 nbench_log(req
, "Searchnext-%d - NOT HANDLED\n", io
->generic
.level
);
863 PASS_THRU_REP_POST(req
);
866 static NTSTATUS
nbench_search_next(struct ntvfs_module_context
*ntvfs
,
867 struct ntvfs_request
*req
, union smb_search_next
*io
,
868 void *search_private
,
869 bool (*callback
)(void *, const union smb_search_data
*))
873 PASS_THRU_REQ(ntvfs
, req
, search_next
, io
, (ntvfs
, req
, io
, search_private
, callback
));
879 static void nbench_search_close_send(struct ntvfs_request
*req
)
881 union smb_search_close
*io
= req
->async_states
->private_data
;
883 nbench_log(req
, "Searchclose-%d - NOT HANDLED\n", io
->generic
.level
);
885 PASS_THRU_REP_POST(req
);
888 static NTSTATUS
nbench_search_close(struct ntvfs_module_context
*ntvfs
,
889 struct ntvfs_request
*req
, union smb_search_close
*io
)
893 PASS_THRU_REQ(ntvfs
, req
, search_close
, io
, (ntvfs
, req
, io
));
898 /* SMBtrans - not used on file shares */
899 static void nbench_trans_send(struct ntvfs_request
*req
)
901 nbench_log(req
, "Trans - NOT HANDLED\n");
903 PASS_THRU_REP_POST(req
);
906 static NTSTATUS
nbench_trans(struct ntvfs_module_context
*ntvfs
,
907 struct ntvfs_request
*req
, struct smb_trans2
*trans2
)
911 PASS_THRU_REQ(ntvfs
, req
, trans
, trans2
, (ntvfs
, req
, trans2
));
917 initialise the nbench backend, registering ourselves with the ntvfs subsystem
919 NTSTATUS
ntvfs_nbench_init(void)
922 struct ntvfs_ops ops
;
923 NTVFS_CURRENT_CRITICAL_SIZES(vers
);
927 /* fill in the name and type */
929 ops
.type
= NTVFS_DISK
;
931 /* fill in all the operations */
932 ops
.connect
= nbench_connect
;
933 ops
.disconnect
= nbench_disconnect
;
934 ops
.unlink
= nbench_unlink
;
935 ops
.chkpath
= nbench_chkpath
;
936 ops
.qpathinfo
= nbench_qpathinfo
;
937 ops
.setpathinfo
= nbench_setpathinfo
;
938 ops
.open
= nbench_open
;
939 ops
.mkdir
= nbench_mkdir
;
940 ops
.rmdir
= nbench_rmdir
;
941 ops
.rename
= nbench_rename
;
942 ops
.copy
= nbench_copy
;
943 ops
.ioctl
= nbench_ioctl
;
944 ops
.read
= nbench_read
;
945 ops
.write
= nbench_write
;
946 ops
.seek
= nbench_seek
;
947 ops
.flush
= nbench_flush
;
948 ops
.close
= nbench_close
;
949 ops
.exit
= nbench_exit
;
950 ops
.lock
= nbench_lock
;
951 ops
.setfileinfo
= nbench_setfileinfo
;
952 ops
.qfileinfo
= nbench_qfileinfo
;
953 ops
.fsinfo
= nbench_fsinfo
;
954 ops
.lpq
= nbench_lpq
;
955 ops
.search_first
= nbench_search_first
;
956 ops
.search_next
= nbench_search_next
;
957 ops
.search_close
= nbench_search_close
;
958 ops
.trans
= nbench_trans
;
959 ops
.logoff
= nbench_logoff
;
960 ops
.async_setup
= nbench_async_setup
;
961 ops
.cancel
= nbench_cancel
;
963 /* we don't register a trans2 handler as we want to be able to
964 log individual trans2 requests */
967 /* register ourselves with the NTVFS subsystem. */
968 ret
= ntvfs_register(&ops
, &vers
);
970 if (!NT_STATUS_IS_OK(ret
)) {
971 DEBUG(0,("Failed to register nbench backend!\n"));