From 2b921f7162b53204051955228bf99bbed55d2457 Mon Sep 17 00:00:00 2001 From: "Dr. David Alan Gilbert" Date: Mon, 27 Jan 2020 19:01:53 +0100 Subject: [PATCH 082/116] virtiofsd: Clean up inodes on destroy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RH-Author: Dr. David Alan Gilbert Message-id: <20200127190227.40942-79-dgilbert@redhat.com> Patchwork-id: 93532 O-Subject: [RHEL-AV-8.2 qemu-kvm PATCH 078/112] virtiofsd: Clean up inodes on destroy Bugzilla: 1694164 RH-Acked-by: Philippe Mathieu-Daudé RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Sergio Lopez Pascual From: "Dr. David Alan Gilbert" 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) Signed-off-by: Miroslav Rezanina --- 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 b176a31..9ed77a1 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 */ -- 1.8.3.1