diff options
author | Dr. David Alan Gilbert <dgilbert@redhat.com> | 2019-02-22 18:33:52 +0000 |
---|---|---|
committer | Dr. David Alan Gilbert <dgilbert@redhat.com> | 2020-01-23 16:41:37 +0000 |
commit | 771b01eb76ff480fee984bd1d21727147cc3e702 (patch) | |
tree | d29d7f90c988f8ac4592474d90333d0d54f27cbd /tools | |
parent | bfc50a6e06b10b2f9dbaf6c1a89dd523322e016f (diff) |
virtiofsd: Clean up inodes on destroy
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 <dgilbert@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/virtiofsd/passthrough_ll.c | 26 |
1 files changed, 26 insertions, 0 deletions
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 */ |