From 6b745771f71c615ecf33bf47c37ece88953a0fb9 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 18 May 2009 09:49:23 +0200 Subject: [PATCH] In aio_fork, we have to close all fd's, we might hold a gpfs share mode Keeping such an fd open prohibits another open of that same file. (cherry picked from commit f22343874833397afb2010a43ee0057fa5d8471e) --- source3/modules/vfs_aio_fork.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/source3/modules/vfs_aio_fork.c b/source3/modules/vfs_aio_fork.c index 3a95b1bd507..578059ab9d2 100644 --- a/source3/modules/vfs_aio_fork.c +++ b/source3/modules/vfs_aio_fork.c @@ -423,6 +423,21 @@ static int aio_child_destructor(struct aio_child *child) 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) @@ -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]; + file_walk_table(close_fsp_fd, NULL); aio_child_loop(result->sockfd, result->map); } -- 2.11.4.GIT