[Devel] [PATCH RHEL9 COMMIT] fs: Move and make generic ext4_send_uevent_work()
Konstantin Khorenko
khorenko at virtuozzo.com
Thu Jan 27 17:36:54 MSK 2022
The commit is pushed to "branch-rh9-5.14.0-4.vz9.12.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-4.vz9.12.2
------>
commit 4a53ef5cf314d03ec4ca7654d749f530f2336a75
Author: Kirill Tkhai <ktkhai at virtuozzo.com>
Date: Thu Jan 27 17:36:54 2022 +0300
fs: Move and make generic ext4_send_uevent_work()
So other filesystems will be able to use it.
To_merge: ac6082c837be ("ext4: add generic uevent infrastructure")
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
====================
xfs: Add notification about fs events like for ext4
This patchset generalizes ext4's related code and introduced the same
uevent notifications for xfs.
https://jira.sw.ru/browse/PSBM-135476
Feature: fs: udev events support
---
fs/ext4/super.c | 105 +++--------------------------------------------------
fs/super.c | 84 ++++++++++++++++++++++++++++++++++++++++++
include/linux/fs.h | 3 ++
3 files changed, 92 insertions(+), 100 deletions(-)
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 88927904478e..6396b601ae6b 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -424,106 +424,6 @@ static time64_t __ext4_get_tstamp(__le32 *lo, __u8 *hi)
#define ext4_get_tstamp(es, tstamp) \
__ext4_get_tstamp(&(es)->tstamp, &(es)->tstamp ## _hi)
-/**
- * ext4_send_uevent - prepare and send uevent
- *
- * @sb: super_block
- * @action: action type
- *
- */
-static void ext4_send_uevent_work(struct work_struct *w)
-{
- struct fs_uevent *e = container_of(w, struct fs_uevent, work);
- struct super_block *sb = e->sb;
- struct kobj_uevent_env *env;
- const uuid_t *uuid = &sb->s_uuid;
- enum kobject_action kaction = KOBJ_CHANGE;
- int ret;
-
- env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);
- if (!env){
- kfree(e);
- return;
- }
- ret = add_uevent_var(env, "FS_TYPE=%s", sb->s_type->name);
- if (ret)
- goto out;
- ret = add_uevent_var(env, "FS_NAME=%s", sb->s_id);
- if (ret)
- goto out;
-
- if (!uuid_is_null(uuid)) {
- ret = add_uevent_var(env, "UUID=%pUB", uuid);
- if (ret)
- goto out;
- }
-
- switch (e->action) {
- case FS_UA_MOUNT:
- kaction = KOBJ_ONLINE;
- ret = add_uevent_var(env, "FS_ACTION=%s", "MOUNT");
- break;
- case FS_UA_UMOUNT:
- kaction = KOBJ_OFFLINE;
- ret = add_uevent_var(env, "FS_ACTION=%s", "UMOUNT");
- break;
- case FS_UA_REMOUNT:
- ret = add_uevent_var(env, "FS_ACTION=%s", "REMOUNT");
- break;
- case FS_UA_ERROR:
- ret = add_uevent_var(env, "FS_ACTION=%s", "ERROR");
- break;
- case FS_UA_ABORT:
- ret = add_uevent_var(env, "FS_ACTION=%s", "ABORT");
- break;
- case FS_UA_FREEZE:
- ret = add_uevent_var(env, "FS_ACTION=%s", "FREEZE");
- break;
- case FS_UA_UNFREEZE:
- ret = add_uevent_var(env, "FS_ACTION=%s", "UNFREEZE");
- break;
- default:
- ret = -EINVAL;
- }
- if (ret)
- goto out;
- ret = kobject_uevent_env(e->kobject, kaction, env->envp);
-out:
- kfree(env);
- kfree(e);
-}
-
-/**
- * ext4_send_uevent - prepare and schedule event submission
- *
- * @sb: super_block
- * @action: action type
- *
- */
-void ext4_send_uevent(struct super_block *sb, enum fs_event_type action)
-{
- struct fs_uevent *e;
-
- /*
- * May happen if called from ext4_put_super() -> __ext4_abort()
- * -> ext4_send_uevent()
- */
- if (!fs_events_wq)
- return;
-
- e = kzalloc(sizeof(*e), GFP_NOIO);
- if (!e)
- return;
-
- /* Do not forget to flush fs_events_wq before you kill sb */
- e->sb = sb;
- e->action = action;
- e->kobject = &EXT4_SB(sb)->s_kobj;
- INIT_WORK(&e->work, ext4_send_uevent_work);
- queue_work(fs_events_wq, &e->work);
-}
-
-
/*
* The del_gendisk() function uninitializes the disk-specific data
* structures, including the bdi structure, without telling anyone
@@ -717,6 +617,11 @@ static void save_error_info(struct super_block *sb, int error,
spin_unlock(&sbi->s_error_lock);
}
+static void ext4_send_uevent(struct super_block *sb, enum fs_event_type action)
+{
+ fs_send_uevent(sb, &EXT4_SB(sb)->s_kobj, action);
+}
+
/* Deal with the reporting of failure conditions on a filesystem such as
* inconsistencies detected or read IO failures.
*
diff --git a/fs/super.c b/fs/super.c
index c62e470c0b8b..3526cf6b1179 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1829,6 +1829,90 @@ EXPORT_SYMBOL(thaw_super);
struct workqueue_struct *fs_events_wq;
+void fs_send_uevent_work(struct work_struct *w)
+{
+ struct fs_uevent *e = container_of(w, struct fs_uevent, work);
+ struct super_block *sb = e->sb;
+ struct kobj_uevent_env *env;
+ const uuid_t *uuid = &sb->s_uuid;
+ enum kobject_action kaction = KOBJ_CHANGE;
+ int ret;
+
+ env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);
+ if (!env){
+ kfree(e);
+ return;
+ }
+ ret = add_uevent_var(env, "FS_TYPE=%s", sb->s_type->name);
+ if (ret)
+ goto out;
+ ret = add_uevent_var(env, "FS_NAME=%s", sb->s_id);
+ if (ret)
+ goto out;
+
+ if (!uuid_is_null(uuid)) {
+ ret = add_uevent_var(env, "UUID=%pUB", uuid);
+ if (ret)
+ goto out;
+ }
+
+ switch (e->action) {
+ case FS_UA_MOUNT:
+ kaction = KOBJ_ONLINE;
+ ret = add_uevent_var(env, "FS_ACTION=%s", "MOUNT");
+ break;
+ case FS_UA_UMOUNT:
+ kaction = KOBJ_OFFLINE;
+ ret = add_uevent_var(env, "FS_ACTION=%s", "UMOUNT");
+ break;
+ case FS_UA_REMOUNT:
+ ret = add_uevent_var(env, "FS_ACTION=%s", "REMOUNT");
+ break;
+ case FS_UA_ERROR:
+ ret = add_uevent_var(env, "FS_ACTION=%s", "ERROR");
+ break;
+ case FS_UA_ABORT:
+ ret = add_uevent_var(env, "FS_ACTION=%s", "ABORT");
+ break;
+ case FS_UA_FREEZE:
+ ret = add_uevent_var(env, "FS_ACTION=%s", "FREEZE");
+ break;
+ case FS_UA_UNFREEZE:
+ ret = add_uevent_var(env, "FS_ACTION=%s", "UNFREEZE");
+ break;
+ default:
+ ret = -EINVAL;
+ }
+ if (ret)
+ goto out;
+ ret = kobject_uevent_env(e->kobject, kaction, env->envp);
+out:
+ kfree(env);
+ kfree(e);
+}
+
+/* fs_send_uevent - prepare and schedule event submission */
+void fs_send_uevent(struct super_block *sb, struct kobject *kobj,
+ enum fs_event_type action)
+{
+ struct fs_uevent *e;
+
+ if (!fs_events_wq)
+ return;
+
+ e = kzalloc(sizeof(*e), GFP_NOIO);
+ if (!e)
+ return;
+
+ /* Do not forget to flush fs_events_wq before you kill sb */
+ e->sb = sb;
+ e->action = action;
+ e->kobject = kobj;
+ INIT_WORK(&e->work, fs_send_uevent_work);
+ queue_work(fs_events_wq, &e->work);
+}
+EXPORT_SYMBOL(fs_send_uevent);
+
static int __init fs_events_init(void)
{
fs_events_wq = alloc_workqueue("fs_events", 0, 0);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 6e76379d6035..45e7393858eb 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3179,6 +3179,9 @@ struct fs_uevent {
extern struct workqueue_struct *fs_events_wq;
+extern void fs_send_uevent(struct super_block *sb, struct kobject *kobj,
+ enum fs_event_type action);
+
#include <linux/err.h>
/* needed for stackable file system support */
More information about the Devel
mailing list