qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 3/5] virtiofsd: make lo_release() atomic


From: Stefan Hajnoczi
Subject: [Qemu-devel] [PATCH 3/5] virtiofsd: make lo_release() atomic
Date: Fri, 26 Jul 2019 10:11:01 +0100

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 <address@hidden>
---
 contrib/virtiofsd/passthrough_ll.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/contrib/virtiofsd/passthrough_ll.c 
b/contrib/virtiofsd/passthrough_ll.c
index 277a17fc03..c1500e092d 100644
--- a/contrib/virtiofsd/passthrough_ll.c
+++ b/contrib/virtiofsd/passthrough_ll.c
@@ -1759,14 +1759,18 @@ static void lo_open(fuse_req_t req, fuse_ino_t ino, 
struct fuse_file_info *fi)
 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);
-- 
2.21.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]