mirror of https://gitee.com/openkylin/qemu.git
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 fuse_file_info *fi)
|
||||||
{
|
{
|
||||||
struct lo_data *lo = lo_data(req);
|
struct lo_data *lo = lo_data(req);
|
||||||
int fd;
|
struct lo_map_elem *elem;
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
(void)ino;
|
(void)ino;
|
||||||
|
|
||||||
fd = lo_fi_fd(req, fi);
|
|
||||||
|
|
||||||
pthread_mutex_lock(&lo->mutex);
|
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);
|
pthread_mutex_unlock(&lo->mutex);
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
Loading…
Reference in New Issue