s3-smb1: Postpone close_file until all aio is handled
[metze/samba/wip.git] / source3 / include / vfs.h
index bd66d34043d492d874214bec4d94eea73ac24f98..c5b896db0f2464abc751c7b3e6a2c5eef0aab83b 100644 (file)
@@ -186,6 +186,7 @@ struct fd_handle {
 typedef struct files_struct {
        struct files_struct *next, *prev;
        uint64_t fnum;
+       struct smbXsrv_open *op;
        struct connection_struct *conn;
        struct fd_handle *fh;
        unsigned int num_smb_operations;
@@ -226,6 +227,7 @@ typedef struct files_struct {
        bool is_sparse;
        struct smb_filename *fsp_name;
        uint32_t name_hash;             /* Jenkins hash of full pathname. */
+       uint64_t mid;                   /* Mid of the operation that created us. */
 
        struct vfs_fsp_data *vfs_extension;
        struct fake_file_handle *fake_file_handle;
@@ -247,6 +249,17 @@ typedef struct files_struct {
        /* if not NULL, means this is a print file */
        struct print_file_data *print_file;
 
+       unsigned num_aio_requests;
+       struct tevent_req **aio_requests;
+
+       /*
+        * If a close request comes in while we still have aio_requests
+        * around, we need to hold back the close. When all aio_requests are
+        * done, the aio completion routines need tevent_wait_done() on
+        * this. A bit ugly, but before we have close_file() fully async
+        * possibly the simplest approach. Thanks, Jeremy for the idea.
+        */
+       struct tevent_req *deferred_close;
 } files_struct;
 
 struct vuid_cache_entry {
@@ -280,7 +293,7 @@ struct share_params {
 typedef struct connection_struct {
        struct connection_struct *next, *prev;
        struct smbd_server_connection *sconn; /* can be NULL */
-       struct smbXsrv_tcon0 *tcon; /* can be NULL */
+       struct smbXsrv_tcon *tcon; /* can be NULL */
        uint32_t cnum; /* an index passed over the wire */
        struct share_params *params;
        bool force_user;
@@ -513,8 +526,22 @@ struct vfs_fn_pointers {
        int (*close_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
        ssize_t (*read_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n);
        ssize_t (*pread_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, void *data, size_t n, off_t offset);
+       struct tevent_req *(*pread_send_fn)(struct vfs_handle_struct *handle,
+                                           TALLOC_CTX *mem_ctx,
+                                           struct tevent_context *ev,
+                                           struct files_struct *fsp,
+                                           void *data,
+                                           size_t n, off_t offset);
+       ssize_t (*pread_recv_fn)(struct tevent_req *req, int *err);
        ssize_t (*write_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n);
        ssize_t (*pwrite_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const void *data, size_t n, off_t offset);
+       struct tevent_req *(*pwrite_send_fn)(struct vfs_handle_struct *handle,
+                                            TALLOC_CTX *mem_ctx,
+                                            struct tevent_context *ev,
+                                            struct files_struct *fsp,
+                                            const void *data,
+                                            size_t n, off_t offset);
+       ssize_t (*pwrite_recv_fn)(struct tevent_req *req, int *err);
        off_t (*lseek_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, off_t offset, int whence);
        ssize_t (*sendfile_fn)(struct vfs_handle_struct *handle, int tofd, files_struct *fromfsp, const DATA_BLOB *header, off_t offset, size_t count);
        ssize_t (*recvfile_fn)(struct vfs_handle_struct *handle, int fromfd, files_struct *tofsp, off_t offset, size_t count);
@@ -522,6 +549,11 @@ struct vfs_fn_pointers {
                         const struct smb_filename *smb_fname_src,
                         const struct smb_filename *smb_fname_dst);
        int (*fsync_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
+       struct tevent_req *(*fsync_send_fn)(struct vfs_handle_struct *handle,
+                                           TALLOC_CTX *mem_ctx,
+                                           struct tevent_context *ev,
+                                           struct files_struct *fsp);
+       int (*fsync_recv_fn)(struct tevent_req *req, int *err);
        int (*stat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname);
        int (*fstat_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf);
        int (*lstat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename);
@@ -685,13 +717,6 @@ struct vfs_fn_pointers {
        int (*fsetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, const void *value, size_t size, int flags);
 
        /* aio operations */
-       int (*aio_read_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-       int (*aio_write_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-       ssize_t (*aio_return_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-       int (*aio_cancel_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-       int (*aio_error_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-       int (*aio_fsync_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, int op, SMB_STRUCT_AIOCB *aiocb);
-       int (*aio_suspend_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_AIOCB * const aiocb[], int n, const struct timespec *timeout);
        bool (*aio_force_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp);
 
        /* offline operations */
@@ -876,12 +901,28 @@ ssize_t smb_vfs_call_read(struct vfs_handle_struct *handle,
 ssize_t smb_vfs_call_pread(struct vfs_handle_struct *handle,
                           struct files_struct *fsp, void *data, size_t n,
                           off_t offset);
+struct tevent_req *smb_vfs_call_pread_send(struct vfs_handle_struct *handle,
+                                          TALLOC_CTX *mem_ctx,
+                                          struct tevent_context *ev,
+                                          struct files_struct *fsp,
+                                          void *data,
+                                          size_t n, off_t offset);
+ssize_t SMB_VFS_PREAD_RECV(struct tevent_req *req, int *perrno);
+
 ssize_t smb_vfs_call_write(struct vfs_handle_struct *handle,
                           struct files_struct *fsp, const void *data,
                           size_t n);
 ssize_t smb_vfs_call_pwrite(struct vfs_handle_struct *handle,
                            struct files_struct *fsp, const void *data,
                            size_t n, off_t offset);
+struct tevent_req *smb_vfs_call_pwrite_send(struct vfs_handle_struct *handle,
+                                           TALLOC_CTX *mem_ctx,
+                                           struct tevent_context *ev,
+                                           struct files_struct *fsp,
+                                           const void *data,
+                                           size_t n, off_t offset);
+ssize_t SMB_VFS_PWRITE_RECV(struct tevent_req *req, int *perrno);
+
 off_t smb_vfs_call_lseek(struct vfs_handle_struct *handle,
                             struct files_struct *fsp, off_t offset,
                             int whence);
@@ -896,6 +937,13 @@ int smb_vfs_call_rename(struct vfs_handle_struct *handle,
                        const struct smb_filename *smb_fname_dst);
 int smb_vfs_call_fsync(struct vfs_handle_struct *handle,
                       struct files_struct *fsp);
+
+struct tevent_req *smb_vfs_call_fsync_send(struct vfs_handle_struct *handle,
+                                          TALLOC_CTX *mem_ctx,
+                                          struct tevent_context *ev,
+                                          struct files_struct *fsp);
+int SMB_VFS_FSYNC_RECV(struct tevent_req *req, int *perrno);
+
 int smb_vfs_call_stat(struct vfs_handle_struct *handle,
                      struct smb_filename *smb_fname);
 int smb_vfs_call_fstat(struct vfs_handle_struct *handle,
@@ -1107,25 +1155,6 @@ int smb_vfs_call_lsetxattr(struct vfs_handle_struct *handle, const char *path,
 int smb_vfs_call_fsetxattr(struct vfs_handle_struct *handle,
                           struct files_struct *fsp, const char *name,
                           const void *value, size_t size, int flags);
-int smb_vfs_call_aio_read(struct vfs_handle_struct *handle,
-                         struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-int smb_vfs_call_aio_write(struct vfs_handle_struct *handle,
-                          struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-ssize_t smb_vfs_call_aio_return(struct vfs_handle_struct *handle,
-                               struct files_struct *fsp,
-                               SMB_STRUCT_AIOCB *aiocb);
-int smb_vfs_call_aio_cancel(struct vfs_handle_struct *handle,
-                           struct files_struct *fsp, SMB_STRUCT_AIOCB *aiocb);
-int smb_vfs_call_aio_error(struct vfs_handle_struct *handle,
-                          struct files_struct *fsp,
-                          SMB_STRUCT_AIOCB *aiocb);
-int smb_vfs_call_aio_fsync(struct vfs_handle_struct *handle,
-                          struct files_struct *fsp, int op,
-                          SMB_STRUCT_AIOCB *aiocb);
-int smb_vfs_call_aio_suspend(struct vfs_handle_struct *handle,
-                            struct files_struct *fsp,
-                            const SMB_STRUCT_AIOCB * const aiocb[], int n,
-                            const struct timespec *timeout);
 bool smb_vfs_call_aio_force(struct vfs_handle_struct *handle,
                            struct files_struct *fsp);
 bool smb_vfs_call_is_offline(struct vfs_handle_struct *handle,