Alyssa Ross <hi@xxxxxxxxx> requested that virtiofs notifies userspace when filesytems become available. This can be used to detect when a filesystem with a given tag is hotplugged, for example. uevents allow userspace to detect changes without resorting to polling. The tag is included as a uevent property so it's easy for userspace to identify the filesystem in question even when the sysfs directory goes away during removal. Here are example uevents: # udevadm monitor -k -p KERNEL[111.113221] add /fs/virtiofs/2 (virtiofs) ACTION=add DEVPATH=/fs/virtiofs/2 SUBSYSTEM=virtiofs TAG=test KERNEL[165.527167] remove /fs/virtiofs/2 (virtiofs) ACTION=remove DEVPATH=/fs/virtiofs/2 SUBSYSTEM=virtiofs TAG=test Signed-off-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx> --- fs/fuse/virtio_fs.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c index 28e96b7cde00..18a8f531e5d4 100644 --- a/fs/fuse/virtio_fs.c +++ b/fs/fuse/virtio_fs.c @@ -270,6 +270,17 @@ static void virtio_fs_start_all_queues(struct virtio_fs *fs) } } +static void virtio_fs_uevent(struct virtio_fs *fs, enum kobject_action action) +{ + char tag_str[sizeof("TAG=") + + sizeof_field(struct virtio_fs_config, tag) + 1]; + char *envp[] = {tag_str, NULL}; + + snprintf(tag_str, sizeof(tag_str), "TAG=%s", fs->tag); + + kobject_uevent_env(&fs->kobj, action, envp); +} + /* Add a new instance to the list or return -EEXIST if tag name exists*/ static int virtio_fs_add_instance(struct virtio_device *vdev, struct virtio_fs *fs) @@ -309,6 +320,8 @@ static int virtio_fs_add_instance(struct virtio_device *vdev, mutex_unlock(&virtio_fs_mutex); + virtio_fs_uevent(fs, KOBJ_ADD); + return 0; } @@ -977,6 +990,8 @@ static void virtio_fs_remove(struct virtio_device *vdev) { struct virtio_fs *fs = vdev->priv; + virtio_fs_uevent(fs, KOBJ_REMOVE); + mutex_lock(&virtio_fs_mutex); /* This device is going away. No one should get new reference */ list_del_init(&fs->list); -- 2.43.0