summaryrefslogtreecommitdiff
path: root/fs/fuse
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2024-02-13 03:11:49 +0300
committerMiklos Szeredi <mszeredi@redhat.com>2024-02-23 11:40:26 +0300
commit9086b2d9e9f3da0b0f939aa1d7ff74e9bf5b54c8 (patch)
treeef69159f74f0fa9519a9324a255dd7b400ded4db /fs/fuse
parenta8f62f50b4e4ea92a938fca2ec1bd108d7f210e9 (diff)
downloadlinux-9086b2d9e9f3da0b0f939aa1d7ff74e9bf5b54c8.tar.xz
virtiofs: emit uevents on filesystem events
Alyssa Ross <hi@alyssa.is> 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@redhat.com> Reviewed-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/fuse')
-rw-r--r--fs/fuse/virtio_fs.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index 99b6113bbd13..62a44603740c 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -306,6 +306,8 @@ static int virtio_fs_add_instance(struct virtio_device *vdev,
mutex_unlock(&virtio_fs_mutex);
+ kobject_uevent(&fs->kobj, KOBJ_ADD);
+
return 0;
}
@@ -1565,9 +1567,22 @@ static struct file_system_type virtio_fs_type = {
.kill_sb = virtio_kill_sb,
};
+static int virtio_fs_uevent(const struct kobject *kobj, struct kobj_uevent_env *env)
+{
+ const struct virtio_fs *fs = container_of(kobj, struct virtio_fs, kobj);
+
+ add_uevent_var(env, "TAG=%s", fs->tag);
+ return 0;
+}
+
+static const struct kset_uevent_ops virtio_fs_uevent_ops = {
+ .uevent = virtio_fs_uevent,
+};
+
static int __init virtio_fs_sysfs_init(void)
{
- virtio_fs_kset = kset_create_and_add("virtiofs", NULL, fs_kobj);
+ virtio_fs_kset = kset_create_and_add("virtiofs", &virtio_fs_uevent_ops,
+ fs_kobj);
if (!virtio_fs_kset)
return -ENOMEM;
return 0;