From: Volker Lendecke Date: Mon, 18 May 2009 07:49:23 +0000 (+0200) Subject: In aio_fork, we have to close all fd's, we might hold a gpfs share mode X-Git-Tag: build_3.2.11_ctdb.61~4 X-Git-Url: http://git.samba.org/?p=obnox%2Fsamba-ctdb.git;a=commitdiff_plain;h=2f66b4d266b76125c25a5e5ff27db6c74cb76a6a 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. Signed-off-by: Michael Adam --- diff --git a/source/modules/vfs_aio_fork.c b/source/modules/vfs_aio_fork.c index 864fd4229d..ca4ee609db 100644 --- a/source/modules/vfs_aio_fork.c +++ b/source/modules/vfs_aio_fork.c @@ -426,6 +426,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) @@ -465,6 +480,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); }