From: "Dr. David Alan Gilbert" Date: Mon, 27 Jan 2020 19:01:53 +0000 Subject: [PATCH] virtiofsd: Clean up inodes on destroy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clear out our inodes and fd's on a 'destroy' - so we get rid of them if we reboot the guest. Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Daniel P. Berrangé Signed-off-by: Dr. David Alan Gilbert (cherry picked from commit 771b01eb76ff480fee984bd1d21727147cc3e702) --- tools/virtiofsd/passthrough_ll.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c index b176a314d6..9ed77a17fd 100644 --- a/tools/virtiofsd/passthrough_ll.c +++ b/tools/virtiofsd/passthrough_ll.c @@ -1169,6 +1169,25 @@ 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->refcount = 0; + lo_map_remove(&lo->ino_map, inode->fuse_ino); + close(inode->fd); + + 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); @@ -2035,6 +2054,12 @@ 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); +} + static struct fuse_lowlevel_ops lo_oper = { .init = lo_init, .lookup = lo_lookup, @@ -2073,6 +2098,7 @@ static struct fuse_lowlevel_ops lo_oper = { .copy_file_range = lo_copy_file_range, #endif .lseek = lo_lseek, + .destroy = lo_destroy, }; /* Print vhost-user.json backend program capabilities */