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
, const char *sharename
)
116 struct nbench_private
*nprivates
;
118 char *logname
= NULL
;
120 nprivates
= talloc(ntvfs
, struct nbench_private
);
122 return NT_STATUS_NO_MEMORY
;
125 asprintf(&logname
, "/tmp/nbenchlog%d.%u", ntvfs
->depth
, getpid());
126 nprivates
->log_fd
= open(logname
, O_WRONLY
|O_CREAT
|O_APPEND
, 0644);
129 if (nprivates
->log_fd
== -1) {
130 DEBUG(0,("Failed to open nbench log\n"));
131 return NT_STATUS_UNSUCCESSFUL
;
134 ntvfs
->private_data
= nprivates
;
136 status
= ntvfs_next_connect(ntvfs
, req
, sharename
);
142 disconnect from a share
144 static NTSTATUS
nbench_disconnect(struct ntvfs_module_context
*ntvfs
)
146 struct nbench_private
*nprivates
= ntvfs
->private_data
;
149 close(nprivates
->log_fd
);
151 status
= ntvfs_next_disconnect(ntvfs
);
157 delete a file - the dirtype specifies the file types to include in the search.
158 The name can contain CIFS wildcards, but rarely does (except with OS/2 clients)
160 static void nbench_unlink_send(struct ntvfs_request
*req
)
162 union smb_unlink
*unl
= req
->async_states
->private_data
;
164 nbench_log(req
, "Unlink \"%s\" 0x%x %s\n",
165 unl
->unlink
.in
.pattern
, unl
->unlink
.in
.attrib
,
166 get_nt_error_c_code(req
->async_states
->status
));
168 PASS_THRU_REP_POST(req
);
171 static NTSTATUS
nbench_unlink(struct ntvfs_module_context
*ntvfs
,
172 struct ntvfs_request
*req
,
173 union smb_unlink
*unl
)
177 PASS_THRU_REQ(ntvfs
, req
, unlink
, unl
, (ntvfs
, req
, unl
));
185 static void nbench_ioctl_send(struct ntvfs_request
*req
)
187 nbench_log(req
, "Ioctl - NOT HANDLED\n");
189 PASS_THRU_REP_POST(req
);
192 static NTSTATUS
nbench_ioctl(struct ntvfs_module_context
*ntvfs
,
193 struct ntvfs_request
*req
, union smb_ioctl
*io
)
197 PASS_THRU_REQ(ntvfs
, req
, ioctl
, io
, (ntvfs
, req
, io
));
203 check if a directory exists
205 static void nbench_chkpath_send(struct ntvfs_request
*req
)
207 union smb_chkpath
*cp
= req
->async_states
->private_data
;
209 nbench_log(req
, "Chkpath \"%s\" %s\n",
211 get_nt_error_c_code(req
->async_states
->status
));
213 PASS_THRU_REP_POST(req
);
216 static NTSTATUS
nbench_chkpath(struct ntvfs_module_context
*ntvfs
,
217 struct ntvfs_request
*req
,
218 union smb_chkpath
*cp
)
222 PASS_THRU_REQ(ntvfs
, req
, chkpath
, cp
, (ntvfs
, req
, cp
));
228 return info on a pathname
230 static void nbench_qpathinfo_send(struct ntvfs_request
*req
)
232 union smb_fileinfo
*info
= req
->async_states
->private_data
;
234 nbench_log(req
, "QUERY_PATH_INFORMATION \"%s\" %d %s\n",
235 info
->generic
.in
.file
.path
,
237 get_nt_error_c_code(req
->async_states
->status
));
239 PASS_THRU_REP_POST(req
);
242 static NTSTATUS
nbench_qpathinfo(struct ntvfs_module_context
*ntvfs
,
243 struct ntvfs_request
*req
, union smb_fileinfo
*info
)
247 PASS_THRU_REQ(ntvfs
, req
, qpathinfo
, info
, (ntvfs
, req
, info
));
253 query info on a open file
255 static void nbench_qfileinfo_send(struct ntvfs_request
*req
)
257 union smb_fileinfo
*info
= req
->async_states
->private_data
;
259 nbench_log(req
, "QUERY_FILE_INFORMATION %s %d %s\n",
260 nbench_ntvfs_handle_string(req
, info
->generic
.in
.file
.ntvfs
),
262 get_nt_error_c_code(req
->async_states
->status
));
264 PASS_THRU_REP_POST(req
);
267 static NTSTATUS
nbench_qfileinfo(struct ntvfs_module_context
*ntvfs
,
268 struct ntvfs_request
*req
, union smb_fileinfo
*info
)
272 PASS_THRU_REQ(ntvfs
, req
, qfileinfo
, info
, (ntvfs
, req
, info
));
278 set info on a pathname
280 static void nbench_setpathinfo_send(struct ntvfs_request
*req
)
282 union smb_setfileinfo
*st
= req
->async_states
->private_data
;
284 nbench_log(req
, "SET_PATH_INFORMATION \"%s\" %d %s\n",
285 st
->generic
.in
.file
.path
,
287 get_nt_error_c_code(req
->async_states
->status
));
289 PASS_THRU_REP_POST(req
);
292 static NTSTATUS
nbench_setpathinfo(struct ntvfs_module_context
*ntvfs
,
293 struct ntvfs_request
*req
, union smb_setfileinfo
*st
)
297 PASS_THRU_REQ(ntvfs
, req
, setpathinfo
, st
, (ntvfs
, req
, st
));
305 static void nbench_open_send(struct ntvfs_request
*req
)
307 union smb_open
*io
= req
->async_states
->private_data
;
309 switch (io
->generic
.level
) {
310 case RAW_OPEN_NTCREATEX
:
311 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
312 ZERO_STRUCT(io
->ntcreatex
.out
);
314 nbench_log(req
, "NTCreateX \"%s\" 0x%x 0x%x %s %s\n",
315 io
->ntcreatex
.in
.fname
,
316 io
->ntcreatex
.in
.create_options
,
317 io
->ntcreatex
.in
.open_disposition
,
318 nbench_ntvfs_handle_string(req
, io
->ntcreatex
.out
.file
.ntvfs
),
319 get_nt_error_c_code(req
->async_states
->status
));
323 nbench_log(req
, "Open-%d - NOT HANDLED\n",
328 PASS_THRU_REP_POST(req
);
331 static NTSTATUS
nbench_open(struct ntvfs_module_context
*ntvfs
,
332 struct ntvfs_request
*req
, union smb_open
*io
)
336 #undef open /* AIX defines open to be open64 */
337 PASS_THRU_REQ(ntvfs
, req
, open
, io
, (ntvfs
, req
, io
));
345 static void nbench_mkdir_send(struct ntvfs_request
*req
)
347 nbench_log(req
, "Mkdir - NOT HANDLED\n");
349 PASS_THRU_REP_POST(req
);
352 static NTSTATUS
nbench_mkdir(struct ntvfs_module_context
*ntvfs
,
353 struct ntvfs_request
*req
, union smb_mkdir
*md
)
357 PASS_THRU_REQ(ntvfs
, req
, mkdir
, md
, (ntvfs
, req
, md
));
365 static void nbench_rmdir_send(struct ntvfs_request
*req
)
367 struct smb_rmdir
*rd
= req
->async_states
->private_data
;
369 nbench_log(req
, "Rmdir \"%s\" %s\n",
371 get_nt_error_c_code(req
->async_states
->status
));
373 PASS_THRU_REP_POST(req
);
376 static NTSTATUS
nbench_rmdir(struct ntvfs_module_context
*ntvfs
,
377 struct ntvfs_request
*req
, struct smb_rmdir
*rd
)
381 PASS_THRU_REQ(ntvfs
, req
, rmdir
, rd
, (ntvfs
, req
, rd
));
387 rename a set of files
389 static void nbench_rename_send(struct ntvfs_request
*req
)
391 union smb_rename
*ren
= req
->async_states
->private_data
;
393 switch (ren
->generic
.level
) {
394 case RAW_RENAME_RENAME
:
395 nbench_log(req
, "Rename \"%s\" \"%s\" %s\n",
396 ren
->rename
.in
.pattern1
,
397 ren
->rename
.in
.pattern2
,
398 get_nt_error_c_code(req
->async_states
->status
));
402 nbench_log(req
, "Rename-%d - NOT HANDLED\n",
407 PASS_THRU_REP_POST(req
);
410 static NTSTATUS
nbench_rename(struct ntvfs_module_context
*ntvfs
,
411 struct ntvfs_request
*req
, union smb_rename
*ren
)
415 PASS_THRU_REQ(ntvfs
, req
, rename
, ren
, (ntvfs
, req
, ren
));
423 static void nbench_copy_send(struct ntvfs_request
*req
)
425 nbench_log(req
, "Copy - NOT HANDLED\n");
427 PASS_THRU_REP_POST(req
);
430 static NTSTATUS
nbench_copy(struct ntvfs_module_context
*ntvfs
,
431 struct ntvfs_request
*req
, struct smb_copy
*cp
)
435 PASS_THRU_REQ(ntvfs
, req
, copy
, cp
, (ntvfs
, req
, cp
));
443 static void nbench_read_send(struct ntvfs_request
*req
)
445 union smb_read
*rd
= req
->async_states
->private_data
;
447 switch (rd
->generic
.level
) {
449 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
450 ZERO_STRUCT(rd
->readx
.out
);
452 nbench_log(req
, "ReadX %s %d %d %d %s\n",
453 nbench_ntvfs_handle_string(req
, rd
->readx
.in
.file
.ntvfs
),
454 (int)rd
->readx
.in
.offset
,
457 get_nt_error_c_code(req
->async_states
->status
));
460 nbench_log(req
, "Read-%d - NOT HANDLED\n",
465 PASS_THRU_REP_POST(req
);
468 static NTSTATUS
nbench_read(struct ntvfs_module_context
*ntvfs
,
469 struct ntvfs_request
*req
, union smb_read
*rd
)
473 PASS_THRU_REQ(ntvfs
, req
, read
, rd
, (ntvfs
, req
, rd
));
481 static void nbench_write_send(struct ntvfs_request
*req
)
483 union smb_write
*wr
= req
->async_states
->private_data
;
485 switch (wr
->generic
.level
) {
486 case RAW_WRITE_WRITEX
:
487 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
488 ZERO_STRUCT(wr
->writex
.out
);
490 nbench_log(req
, "WriteX %s %d %d %d %s\n",
491 nbench_ntvfs_handle_string(req
, wr
->writex
.in
.file
.ntvfs
),
492 (int)wr
->writex
.in
.offset
,
494 wr
->writex
.out
.nwritten
,
495 get_nt_error_c_code(req
->async_states
->status
));
498 case RAW_WRITE_WRITE
:
499 if (!NT_STATUS_IS_OK(req
->async_states
->status
)) {
500 ZERO_STRUCT(wr
->write
.out
);
502 nbench_log(req
, "Write %s %d %d %d %s\n",
503 nbench_ntvfs_handle_string(req
, wr
->write
.in
.file
.ntvfs
),
506 wr
->write
.out
.nwritten
,
507 get_nt_error_c_code(req
->async_states
->status
));
511 nbench_log(req
, "Write-%d - NOT HANDLED\n",
516 PASS_THRU_REP_POST(req
);
519 static NTSTATUS
nbench_write(struct ntvfs_module_context
*ntvfs
,
520 struct ntvfs_request
*req
, union smb_write
*wr
)
524 PASS_THRU_REQ(ntvfs
, req
, write
, wr
, (ntvfs
, req
, wr
));
532 static void nbench_seek_send(struct ntvfs_request
*req
)
534 nbench_log(req
, "Seek - NOT HANDLED\n");
536 PASS_THRU_REP_POST(req
);
539 static NTSTATUS
nbench_seek(struct ntvfs_module_context
*ntvfs
,
540 struct ntvfs_request
*req
,
545 PASS_THRU_REQ(ntvfs
, req
, seek
, io
, (ntvfs
, req
, io
));
553 static void nbench_flush_send(struct ntvfs_request
*req
)
555 union smb_flush
*io
= req
->async_states
->private_data
;
557 switch (io
->generic
.level
) {
558 case RAW_FLUSH_FLUSH
:
559 nbench_log(req
, "Flush %s %s\n",
560 nbench_ntvfs_handle_string(req
, io
->flush
.in
.file
.ntvfs
),
561 get_nt_error_c_code(req
->async_states
->status
));
564 nbench_log(req
, "Flush %d %s\n",
566 get_nt_error_c_code(req
->async_states
->status
));
569 nbench_log(req
, "Flush-%d - NOT HANDLED\n",
574 PASS_THRU_REP_POST(req
);
577 static NTSTATUS
nbench_flush(struct ntvfs_module_context
*ntvfs
,
578 struct ntvfs_request
*req
,
583 PASS_THRU_REQ(ntvfs
, req
, flush
, io
, (ntvfs
, req
, io
));
591 static void nbench_close_send(struct ntvfs_request
*req
)
593 union smb_close
*io
= req
->async_states
->private_data
;
595 switch (io
->generic
.level
) {
596 case RAW_CLOSE_CLOSE
:
597 nbench_log(req
, "Close %s %s\n",
598 nbench_ntvfs_handle_string(req
, io
->close
.in
.file
.ntvfs
),
599 get_nt_error_c_code(req
->async_states
->status
));
603 nbench_log(req
, "Close-%d - NOT HANDLED\n",
608 PASS_THRU_REP_POST(req
);
611 static NTSTATUS
nbench_close(struct ntvfs_module_context
*ntvfs
,
612 struct ntvfs_request
*req
, union smb_close
*io
)
616 PASS_THRU_REQ(ntvfs
, req
, close
, io
, (ntvfs
, req
, io
));
624 static void nbench_exit_send(struct ntvfs_request
*req
)
626 nbench_log(req
, "Exit - NOT HANDLED\n");
628 PASS_THRU_REP_POST(req
);
631 static NTSTATUS
nbench_exit(struct ntvfs_module_context
*ntvfs
,
632 struct ntvfs_request
*req
)
636 PASS_THRU_REQ(ntvfs
, req
, exit
, NULL
, (ntvfs
, req
));
642 logoff - closing files
644 static void nbench_logoff_send(struct ntvfs_request
*req
)
646 nbench_log(req
, "Logoff - NOT HANDLED\n");
648 PASS_THRU_REP_POST(req
);
651 static NTSTATUS
nbench_logoff(struct ntvfs_module_context
*ntvfs
,
652 struct ntvfs_request
*req
)
656 PASS_THRU_REQ(ntvfs
, req
, logoff
, NULL
, (ntvfs
, req
));
662 async_setup - send fn
664 static void nbench_async_setup_send(struct ntvfs_request
*req
)
666 PASS_THRU_REP_POST(req
);
672 static NTSTATUS
nbench_async_setup(struct ntvfs_module_context
*ntvfs
,
673 struct ntvfs_request
*req
,
678 PASS_THRU_REQ(ntvfs
, req
, async_setup
, NULL
, (ntvfs
, req
, private_data
));
684 static void nbench_cancel_send(struct ntvfs_request
*req
)
686 PASS_THRU_REP_POST(req
);
690 cancel an existing async request
692 static NTSTATUS
nbench_cancel(struct ntvfs_module_context
*ntvfs
,
693 struct ntvfs_request
*req
)
697 PASS_THRU_REQ(ntvfs
, req
, cancel
, NULL
, (ntvfs
, req
));
705 static void nbench_lock_send(struct ntvfs_request
*req
)
707 union smb_lock
*lck
= req
->async_states
->private_data
;
709 if (lck
->generic
.level
== RAW_LOCK_LOCKX
&&
710 lck
->lockx
.in
.lock_cnt
== 1 &&
711 lck
->lockx
.in
.ulock_cnt
== 0) {
712 nbench_log(req
, "LockX %s %d %d %s\n",
713 nbench_ntvfs_handle_string(req
, lck
->lockx
.in
.file
.ntvfs
),
714 (int)lck
->lockx
.in
.locks
[0].offset
,
715 (int)lck
->lockx
.in
.locks
[0].count
,
716 get_nt_error_c_code(req
->async_states
->status
));
717 } else if (lck
->generic
.level
== RAW_LOCK_LOCKX
&&
718 lck
->lockx
.in
.ulock_cnt
== 1) {
719 nbench_log(req
, "UnlockX %s %d %d %s\n",
720 nbench_ntvfs_handle_string(req
, lck
->lockx
.in
.file
.ntvfs
),
721 (int)lck
->lockx
.in
.locks
[0].offset
,
722 (int)lck
->lockx
.in
.locks
[0].count
,
723 get_nt_error_c_code(req
->async_states
->status
));
725 nbench_log(req
, "Lock-%d - NOT HANDLED\n", lck
->generic
.level
);
728 PASS_THRU_REP_POST(req
);
731 static NTSTATUS
nbench_lock(struct ntvfs_module_context
*ntvfs
,
732 struct ntvfs_request
*req
, union smb_lock
*lck
)
736 PASS_THRU_REQ(ntvfs
, req
, lock
, lck
, (ntvfs
, req
, lck
));
742 set info on a open file
744 static void nbench_setfileinfo_send(struct ntvfs_request
*req
)
746 union smb_setfileinfo
*info
= req
->async_states
->private_data
;
748 nbench_log(req
, "SET_FILE_INFORMATION %s %d %s\n",
749 nbench_ntvfs_handle_string(req
, info
->generic
.in
.file
.ntvfs
),
751 get_nt_error_c_code(req
->async_states
->status
));
753 PASS_THRU_REP_POST(req
);
756 static NTSTATUS
nbench_setfileinfo(struct ntvfs_module_context
*ntvfs
,
757 struct ntvfs_request
*req
,
758 union smb_setfileinfo
*info
)
762 PASS_THRU_REQ(ntvfs
, req
, setfileinfo
, info
, (ntvfs
, req
, info
));
768 return filesystem space info
770 static void nbench_fsinfo_send(struct ntvfs_request
*req
)
772 union smb_fsinfo
*fs
= req
->async_states
->private_data
;
774 nbench_log(req
, "QUERY_FS_INFORMATION %d %s\n",
776 get_nt_error_c_code(req
->async_states
->status
));
778 PASS_THRU_REP_POST(req
);
781 static NTSTATUS
nbench_fsinfo(struct ntvfs_module_context
*ntvfs
,
782 struct ntvfs_request
*req
, union smb_fsinfo
*fs
)
786 PASS_THRU_REQ(ntvfs
, req
, fsinfo
, fs
, (ntvfs
, req
, fs
));
792 return print queue info
794 static void nbench_lpq_send(struct ntvfs_request
*req
)
796 union smb_lpq
*lpq
= req
->async_states
->private_data
;
798 nbench_log(req
, "Lpq-%d - NOT HANDLED\n", lpq
->generic
.level
);
800 PASS_THRU_REP_POST(req
);
803 static NTSTATUS
nbench_lpq(struct ntvfs_module_context
*ntvfs
,
804 struct ntvfs_request
*req
, union smb_lpq
*lpq
)
808 PASS_THRU_REQ(ntvfs
, req
, lpq
, lpq
, (ntvfs
, req
, lpq
));
814 list files in a directory matching a wildcard pattern
816 static void nbench_search_first_send(struct ntvfs_request
*req
)
818 union smb_search_first
*io
= req
->async_states
->private_data
;
820 switch (io
->generic
.level
) {
821 case RAW_SEARCH_TRANS2
:
822 if (NT_STATUS_IS_ERR(req
->async_states
->status
)) {
823 ZERO_STRUCT(io
->t2ffirst
.out
);
825 nbench_log(req
, "FIND_FIRST \"%s\" %d %d %d %s\n",
826 io
->t2ffirst
.in
.pattern
,
827 io
->t2ffirst
.data_level
,
828 io
->t2ffirst
.in
.max_count
,
829 io
->t2ffirst
.out
.count
,
830 get_nt_error_c_code(req
->async_states
->status
));
834 nbench_log(req
, "Search-%d - NOT HANDLED\n", io
->generic
.level
);
838 PASS_THRU_REP_POST(req
);
841 static NTSTATUS
nbench_search_first(struct ntvfs_module_context
*ntvfs
,
842 struct ntvfs_request
*req
, union smb_search_first
*io
,
843 void *search_private
,
844 bool (*callback
)(void *, const union smb_search_data
*))
848 PASS_THRU_REQ(ntvfs
, req
, search_first
, io
, (ntvfs
, req
, io
, search_private
, callback
));
853 /* continue a search */
854 static void nbench_search_next_send(struct ntvfs_request
*req
)
856 union smb_search_next
*io
= req
->async_states
->private_data
;
858 nbench_log(req
, "Searchnext-%d - NOT HANDLED\n", io
->generic
.level
);
860 PASS_THRU_REP_POST(req
);
863 static NTSTATUS
nbench_search_next(struct ntvfs_module_context
*ntvfs
,
864 struct ntvfs_request
*req
, union smb_search_next
*io
,
865 void *search_private
,
866 bool (*callback
)(void *, const union smb_search_data
*))
870 PASS_THRU_REQ(ntvfs
, req
, search_next
, io
, (ntvfs
, req
, io
, search_private
, callback
));
876 static void nbench_search_close_send(struct ntvfs_request
*req
)
878 union smb_search_close
*io
= req
->async_states
->private_data
;
880 nbench_log(req
, "Searchclose-%d - NOT HANDLED\n", io
->generic
.level
);
882 PASS_THRU_REP_POST(req
);
885 static NTSTATUS
nbench_search_close(struct ntvfs_module_context
*ntvfs
,
886 struct ntvfs_request
*req
, union smb_search_close
*io
)
890 PASS_THRU_REQ(ntvfs
, req
, search_close
, io
, (ntvfs
, req
, io
));
895 /* SMBtrans - not used on file shares */
896 static void nbench_trans_send(struct ntvfs_request
*req
)
898 nbench_log(req
, "Trans - NOT HANDLED\n");
900 PASS_THRU_REP_POST(req
);
903 static NTSTATUS
nbench_trans(struct ntvfs_module_context
*ntvfs
,
904 struct ntvfs_request
*req
, struct smb_trans2
*trans2
)
908 PASS_THRU_REQ(ntvfs
, req
, trans
, trans2
, (ntvfs
, req
, trans2
));
914 initialise the nbench backend, registering ourselves with the ntvfs subsystem
916 NTSTATUS
ntvfs_nbench_init(void)
919 struct ntvfs_ops ops
;
920 NTVFS_CURRENT_CRITICAL_SIZES(vers
);
924 /* fill in the name and type */
926 ops
.type
= NTVFS_DISK
;
928 /* fill in all the operations */
929 ops
.connect
= nbench_connect
;
930 ops
.disconnect
= nbench_disconnect
;
931 ops
.unlink
= nbench_unlink
;
932 ops
.chkpath
= nbench_chkpath
;
933 ops
.qpathinfo
= nbench_qpathinfo
;
934 ops
.setpathinfo
= nbench_setpathinfo
;
935 ops
.open
= nbench_open
;
936 ops
.mkdir
= nbench_mkdir
;
937 ops
.rmdir
= nbench_rmdir
;
938 ops
.rename
= nbench_rename
;
939 ops
.copy
= nbench_copy
;
940 ops
.ioctl
= nbench_ioctl
;
941 ops
.read
= nbench_read
;
942 ops
.write
= nbench_write
;
943 ops
.seek
= nbench_seek
;
944 ops
.flush
= nbench_flush
;
945 ops
.close
= nbench_close
;
946 ops
.exit
= nbench_exit
;
947 ops
.lock
= nbench_lock
;
948 ops
.setfileinfo
= nbench_setfileinfo
;
949 ops
.qfileinfo
= nbench_qfileinfo
;
950 ops
.fsinfo
= nbench_fsinfo
;
951 ops
.lpq
= nbench_lpq
;
952 ops
.search_first
= nbench_search_first
;
953 ops
.search_next
= nbench_search_next
;
954 ops
.search_close
= nbench_search_close
;
955 ops
.trans
= nbench_trans
;
956 ops
.logoff
= nbench_logoff
;
957 ops
.async_setup
= nbench_async_setup
;
958 ops
.cancel
= nbench_cancel
;
960 /* we don't register a trans2 handler as we want to be able to
961 log individual trans2 requests */
964 /* register ourselves with the NTVFS subsystem. */
965 ret
= ntvfs_register(&ops
, &vers
);
967 if (!NT_STATUS_IS_OK(ret
)) {
968 DEBUG(0,("Failed to register nbench backend!\n"));