[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 102/104] virtiofsd: fix lo_destroy() resource leaks
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[PATCH 102/104] virtiofsd: fix lo_destroy() resource leaks |
Date: |
Thu, 12 Dec 2019 16:39:02 +0000 |
From: Stefan Hajnoczi <address@hidden>
Now that lo_destroy() is serialized we can call unref_inode() so that
all inode resources are freed.
Signed-off-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
---
tools/virtiofsd/passthrough_ll.c | 41 ++++++++++++++++----------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
index 1bf251a91d..38f4948e61 100644
--- a/tools/virtiofsd/passthrough_ll.c
+++ b/tools/virtiofsd/passthrough_ll.c
@@ -1355,26 +1355,6 @@ static void unref_inode_lolocked(struct lo_data *lo,
struct lo_inode *inode,
}
}
-static int unref_all_inodes_cb(gpointer key, gpointer value, gpointer
user_data)
-{
- struct lo_inode *inode = value;
- struct lo_data *lo = user_data;
-
- inode->nlookup = 0;
- lo_map_remove(&lo->ino_map, inode->fuse_ino);
- close(inode->fd);
- lo_inode_put(lo, &inode); /* Drop our refcount from lo_do_lookup() */
-
- return TRUE;
-}
-
-static void unref_all_inodes(struct lo_data *lo)
-{
- pthread_mutex_lock(&lo->mutex);
- g_hash_table_foreach_remove(lo->inodes, unref_all_inodes_cb, lo);
- pthread_mutex_unlock(&lo->mutex);
-}
-
static void lo_forget_one(fuse_req_t req, fuse_ino_t ino, uint64_t nlookup)
{
struct lo_data *lo = lo_data(req);
@@ -2460,7 +2440,26 @@ static void lo_lseek(fuse_req_t req, fuse_ino_t ino,
off_t off, int whence,
static void lo_destroy(void *userdata)
{
struct lo_data *lo = (struct lo_data *)userdata;
- unref_all_inodes(lo);
+
+ /*
+ * Normally lo->mutex must be taken when traversing lo->inodes but
+ * lo_destroy() is a serialized request so no races are possible here.
+ *
+ * In addition, we cannot acquire lo->mutex since unref_inode() takes it
+ * too and this would result in a recursive lock.
+ */
+ while (true) {
+ GHashTableIter iter;
+ gpointer key, value;
+
+ g_hash_table_iter_init(&iter, lo->inodes);
+ if (!g_hash_table_iter_next(&iter, &key, &value)) {
+ break;
+ }
+
+ struct lo_inode *inode = value;
+ unref_inode_lolocked(lo, inode, inode->nlookup);
+ }
}
static struct fuse_lowlevel_ops lo_oper = {
--
2.23.0
- [PATCH 092/104] virtiofsd: add man page, (continued)
- [PATCH 092/104] virtiofsd: add man page, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 094/104] virtiofsd: do not always set FUSE_FLOCK_LOCKS, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 095/104] virtiofsd: convert more fprintf and perror to use fuse log infra, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 093/104] virtiofsd: introduce inode refcount to prevent use-after-free, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 096/104] virtiofsd: Reset O_DIRECT flag during file open, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 097/104] virtiofsd: Fix data corruption with O_APPEND wirte in writeback mode, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 098/104] virtiofsd: add definition of fuse_buf_writev(), Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 099/104] virtiofsd: use fuse_buf_writev to replace fuse_buf_write for better performance, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 102/104] virtiofsd: fix lo_destroy() resource leaks,
Dr. David Alan Gilbert (git) <=
- [PATCH 103/104] virtiofsd: add --thread-pool-size=NUM option, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 101/104] virtiofsd: prevent FUSE_INIT/FUSE_DESTROY races, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 100/104] virtiofsd: process requests in a thread pool, Dr. David Alan Gilbert (git), 2019/12/12
- [PATCH 104/104] virtiofsd: Convert lo_destroy to take the lo->mutex lock itself, Dr. David Alan Gilbert (git), 2019/12/12
- Re: [PATCH 000/104] virtiofs daemon [all], no-reply, 2019/12/12