Restructure the connect function code to always call
[abartlet/samba.git/.git] / source3 / modules / vfs_readahead.c
index df75814b7248dd6932601bbb1ac7424e087a45a7..e7a7dd305ccecb7ee933639f837332910024a0f4 100644 (file)
@@ -127,8 +127,15 @@ static int readahead_connect(struct vfs_handle_struct *handle,
                                const char *service,
                                const char *user)
 {
-       struct readahead_data *rhd = SMB_MALLOC_P(struct readahead_data);
+       struct readahead_data *rhd;
+       int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
+
+       if (ret < 0) {
+               return ret;
+       }
+       rhd = SMB_MALLOC_P(struct readahead_data);
        if (!rhd) {
+               SMB_VFS_NEXT_DISCONNECT(handle);
                DEBUG(0,("readahead_connect: out of memory\n"));
                return -1;
        }
@@ -152,21 +159,13 @@ static int readahead_connect(struct vfs_handle_struct *handle,
 
        handle->data = (void *)rhd;
        handle->free_data = free_readahead_data;
-       return SMB_VFS_NEXT_CONNECT(handle, service, user);
+       return 0;
 }
 
-/*******************************************************************
- Functions we're replacing.
- We don't replace read as it isn't used from smbd to read file
- data.
-*******************************************************************/
-
-static vfs_op_tuple readahead_ops [] =
-{
-       {SMB_VFS_OP(readahead_sendfile), SMB_VFS_OP_SENDFILE, SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(readahead_pread), SMB_VFS_OP_PREAD, SMB_VFS_LAYER_TRANSPARENT},
-        {SMB_VFS_OP(readahead_connect), SMB_VFS_OP_CONNECT,  SMB_VFS_LAYER_TRANSPARENT},
-       {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
+static struct vfs_fn_pointers vfs_readahead_fns = {
+       .sendfile = readahead_sendfile,
+       .pread = readahead_pread,
+       .connect_fn = readahead_connect
 };
 
 /*******************************************************************
@@ -176,5 +175,6 @@ static vfs_op_tuple readahead_ops [] =
 NTSTATUS vfs_readahead_init(void);
 NTSTATUS vfs_readahead_init(void)
 {
-       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "readahead", readahead_ops);
+       return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "readahead",
+                               &vfs_readahead_fns);
 }