diff options
author | Volker Lendecke <vl@samba.org> | 2009-05-18 09:49:23 +0200 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2009-05-26 09:39:33 +0200 |
commit | 6b745771f71c615ecf33bf47c37ece88953a0fb9 (patch) | |
tree | f96356ff07997d9dccb2d1b87dc8abf0253898a0 /source3/modules | |
parent | 87e58d9fcefad8c61031e57a6cc4b22b1e91f7af (diff) | |
download | samba-6b745771f71c615ecf33bf47c37ece88953a0fb9.tar.gz |
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)
Diffstat (limited to 'source3/modules')
-rw-r--r-- | source3/modules/vfs_aio_fork.c | 16 |
1 files changed, 16 insertions, 0 deletions
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); } |