From 67a2e629919bdc5a783e64636890fec2a7dfa9f8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 18 May 2009 09:49:23 +0200 Subject: 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. --- source3/modules/vfs_aio_fork.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'source3') diff --git a/source3/modules/vfs_aio_fork.c b/source3/modules/vfs_aio_fork.c index e706495a56..cb4ad0cf82 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); } -- cgit