Skip to content

Commit

Permalink
virtiofsd: Clean up inodes on destroy
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Daniel P. Berrangé <[email protected]>
Signed-off-by: Dr. David Alan Gilbert <[email protected]>
  • Loading branch information
dagrh committed Jan 23, 2020
1 parent bfc50a6 commit 771b01e
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions tools/virtiofsd/passthrough_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 771b01e

Please sign in to comment.