From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> 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 <dgilb...@redhat.com> --- 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 bbc5f0981e..c526d6f4f6 100644 --- a/tools/virtiofsd/passthrough_ll.c +++ b/tools/virtiofsd/passthrough_ll.c @@ -1201,6 +1201,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); @@ -2066,6 +2085,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, @@ -2104,6 +2129,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 */ -- 2.23.0