]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dlm: add new RELEASE_RECOVER uevent attribute for release_lockspace
authorAlexander Aring <aahringo@redhat.com>
Wed, 23 Jul 2025 15:21:54 +0000 (11:21 -0400)
committerDavid Teigland <teigland@redhat.com>
Tue, 12 Aug 2025 16:26:29 +0000 (11:26 -0500)
RELEASE_RECOVER=0|1 is passed to user space as part of the OFFLINE
uevent for leaving a lockspace, and used by subsequent patches.
RELEASE_RECOVER=1 tells user space that the release_lockspace/leave
should be handled by the remaining lockspace members as if the
leaving node had failed.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/lockspace.c

index be8dbf482229538bace8c3f3ab5d5f4a424df810..6ff666a511c7ae0f3b0b0823b188d47fc5b9b733 100644 (file)
@@ -186,12 +186,17 @@ static struct kobj_type dlm_ktype = {
 
 static struct kset *dlm_kset;
 
-static int do_uevent(struct dlm_ls *ls, int in)
+static int do_uevent(struct dlm_ls *ls, int in, unsigned int release_recover)
 {
-       if (in)
+       char message[512] = {};
+       char *envp[] = { message, NULL };
+
+       if (in) {
                kobject_uevent(&ls->ls_kobj, KOBJ_ONLINE);
-       else
-               kobject_uevent(&ls->ls_kobj, KOBJ_OFFLINE);
+       } else {
+               snprintf(message, 511, "RELEASE_RECOVER=%u", release_recover);
+               kobject_uevent_env(&ls->ls_kobj, KOBJ_OFFLINE, envp);
+       }
 
        log_rinfo(ls, "%s the lockspace group...", in ? "joining" : "leaving");
 
@@ -575,7 +580,7 @@ static int new_lockspace(const char *name, const char *cluster,
           current lockspace members are (via configfs) and then tells the
           lockspace to start running (via sysfs) in dlm_ls_start(). */
 
-       error = do_uevent(ls, 1);
+       error = do_uevent(ls, 1, 0);
        if (error < 0)
                goto out_recoverd;
 
@@ -592,7 +597,7 @@ static int new_lockspace(const char *name, const char *cluster,
        return 0;
 
  out_members:
-       do_uevent(ls, 0);
+       do_uevent(ls, 0, 0);
        dlm_clear_members(ls);
        kfree(ls->ls_node_array);
  out_recoverd:
@@ -733,7 +738,7 @@ static int release_lockspace(struct dlm_ls *ls, int release_option)
 
        if (release_option != DLM_RELEASE_NO_EVENT &&
            dlm_user_daemon_available())
-               do_uevent(ls, 0);
+               do_uevent(ls, 0, 0);
 
        dlm_recoverd_stop(ls);