In aio_fork, we have to close all fd's, we might hold a gpfs share mode
authorVolker Lendecke <vl@samba.org>
Mon, 18 May 2009 07:49:23 +0000 (09:49 +0200)
committerVolker Lendecke <vl@samba.org>
Mon, 18 May 2009 08:42:22 +0000 (10:42 +0200)
Keeping such an fd open prohibits another open of that same file.

source3/modules/vfs_aio_fork.c

index e706495a56f7cd407cd4dc06d6da13e4e9aa49cd..cb4ad0cf826838d3bce105d525b782a981478a1c 100644 (file)
@@ -423,6 +423,21 @@ static int aio_child_destructor(struct aio_child *child)
        return 0;
 }
 
        return 0;
 }
 
+/*
+ * We have to close all fd's in open files, we might incorrectly hold a system
+ * level share mode on a file.
+ */
+
+static struct files_struct *close_fsp_fd(struct files_struct *fsp,
+                                        void *private_data)
+{
+       if ((fsp->fh != NULL) && (fsp->fh->fd != -1)) {
+               close(fsp->fh->fd);
+               fsp->fh->fd = -1;
+       }
+       return NULL;
+}
+
 static NTSTATUS create_aio_child(struct aio_child_list *children,
                                 size_t map_size,
                                 struct aio_child **presult)
 static NTSTATUS create_aio_child(struct aio_child_list *children,
                                 size_t map_size,
                                 struct aio_child **presult)
@@ -461,6 +476,7 @@ static NTSTATUS create_aio_child(struct aio_child_list *children,
        if (result->pid == 0) {
                close(fdpair[0]);
                result->sockfd = fdpair[1];
        if (result->pid == 0) {
                close(fdpair[0]);
                result->sockfd = fdpair[1];
+               file_walk_table(close_fsp_fd, NULL);
                aio_child_loop(result->sockfd, result->map);
        }
 
                aio_child_loop(result->sockfd, result->map);
        }