#define MAP_FILE 0
#endif
+struct aio_fork_config {
+ bool erratic_testing_mode;
+};
+
struct mmap_area {
size_t size;
volatile void *ptr;
size_t n;
off_t offset;
enum cmd_type cmd;
+ bool erratic_testing_mode;
};
struct rw_ret {
cmd_type_str(cmd_struct.cmd),
(int)cmd_struct.n, (int)cmd_struct.offset, fd));
-#ifdef DEVELOPER
- {
+ if (cmd_struct.erratic_testing_mode) {
/*
* For developer testing, we want erratic behaviour for
* async I/O times
DEBUG(10, ("delaying for %u msecs\n", msecs));
smb_msleep(msecs);
}
-#endif
-
ZERO_STRUCT(ret_struct);
struct rw_cmd cmd;
ssize_t written;
int err;
+ struct aio_fork_config *config;
+ SMB_VFS_HANDLE_GET_DATA(handle, config,
+ struct aio_fork_config,
+ return -1);
req = tevent_req_create(mem_ctx, &state, struct aio_fork_pread_state);
if (req == NULL) {
cmd.n = n;
cmd.offset = offset;
cmd.cmd = READ_CMD;
+ cmd.erratic_testing_mode = config->erratic_testing_mode;
DEBUG(10, ("sending fd %d to child %d\n", fsp->fh->fd,
(int)state->child->pid));
struct rw_cmd cmd;
ssize_t written;
int err;
+ struct aio_fork_config *config;
+ SMB_VFS_HANDLE_GET_DATA(handle, config,
+ struct aio_fork_config,
+ return NULL);
req = tevent_req_create(mem_ctx, &state, struct aio_fork_pwrite_state);
if (req == NULL) {
cmd.n = n;
cmd.offset = offset;
cmd.cmd = WRITE_CMD;
+ cmd.erratic_testing_mode = config->erratic_testing_mode;
DEBUG(10, ("sending fd %d to child %d\n", fsp->fh->fd,
(int)state->child->pid));
struct rw_cmd cmd;
ssize_t written;
int err;
+ struct aio_fork_config *config;
+ SMB_VFS_HANDLE_GET_DATA(handle, config,
+ struct aio_fork_config,
+ return -1);
req = tevent_req_create(mem_ctx, &state, struct aio_fork_fsync_state);
if (req == NULL) {
ZERO_STRUCT(cmd);
cmd.cmd = FSYNC_CMD;
+ cmd.erratic_testing_mode = config->erratic_testing_mode;
DEBUG(10, ("sending fd %d to child %d\n", fsp->fh->fd,
(int)state->child->pid));
static int aio_fork_connect(vfs_handle_struct *handle, const char *service,
const char *user)
{
+ int ret;
+ struct aio_fork_config *config;
+ ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+ if (ret < 0) {
+ return ret;
+ }
+
+ config = talloc_zero(handle->conn, struct aio_fork_config);
+ if (!config) {
+ SMB_VFS_NEXT_DISCONNECT(handle);
+ DEBUG(0, ("talloc_zero() failed\n"));
+ return -1;
+ }
+
+ config->erratic_testing_mode = lp_parm_bool(SNUM(handle->conn), "vfs_aio_fork",
+ "erratic_testing_mode", false);
+
+ SMB_VFS_HANDLE_SET_DATA(handle, config,
+ NULL, struct aio_fork_config,
+ return -1);
+
/*********************************************************************
* How many threads to initialize ?
* 100 per process seems insane as a default until you realize that
* says different.
*********************************************************************/
aio_pending_size = 100;
- return SMB_VFS_NEXT_CONNECT(handle, service, user);
+ return 0;
}
static struct vfs_fn_pointers vfs_aio_fork_fns = {