virtiofsd: make lo_release() atomic
Hold the lock across both lo_map_get() and lo_map_remove() to prevent races between two FUSE_RELEASE requests. In this case I don't see a serious bug but it's safer to do things atomically. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
e7b337326d
commit
baed65c060
@ -1772,14 +1772,18 @@ static void lo_release(fuse_req_t req, fuse_ino_t ino,
|
||||
struct fuse_file_info *fi)
|
||||
{
|
||||
struct lo_data *lo = lo_data(req);
|
||||
int fd;
|
||||
struct lo_map_elem *elem;
|
||||
int fd = -1;
|
||||
|
||||
(void)ino;
|
||||
|
||||
fd = lo_fi_fd(req, fi);
|
||||
|
||||
pthread_mutex_lock(&lo->mutex);
|
||||
lo_map_remove(&lo->fd_map, fi->fh);
|
||||
elem = lo_map_get(&lo->fd_map, fi->fh);
|
||||
if (elem) {
|
||||
fd = elem->fd;
|
||||
elem = NULL;
|
||||
lo_map_remove(&lo->fd_map, fi->fh);
|
||||
}
|
||||
pthread_mutex_unlock(&lo->mutex);
|
||||
|
||||
close(fd);
|
||||
|
Loading…
Reference in New Issue
Block a user