Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=254da030dfb1b13d42d07e4292a4790d88c6874f
Commit:     254da030dfb1b13d42d07e4292a4790d88c6874f
Parent:     420d2a1028b906f24e836e37089a6ad55ab1848f
Author:     Patrick Caulfield <[EMAIL PROTECTED]>
AuthorDate: Wed Mar 21 09:23:53 2007 +0000
Committer:  Steven Whitehouse <[EMAIL PROTECTED]>
CommitDate: Tue May 1 09:10:44 2007 +0100

    [DLM] Don't delete misc device if lockspace removal fails
    
    Currently if the lockspace removal fails the misc device associated with a
    lockspace is left deleted. After that there is no way to access the orphaned
    lockspace from userland.
    
    This patch recreates the misc device if th dlm_release_lockspace fails. I
    believe this is better than attempting to remove the lockspace first because
    that leaves an unattached device lying around. The potential gap in which 
there
    is no access to the lockspace between removing the misc device and 
recreating it
    is acceptable ... after all the application is trying to remove it, and 
only new
    users of the lockspace will be affected.
    
    Signed-Off-By: Patrick Caulfield <[EMAIL PROTECTED]>
    Signed-off-by: Steven Whitehouse <[EMAIL PROTECTED]>
---
 fs/dlm/user.c |   58 +++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/fs/dlm/user.c b/fs/dlm/user.c
index 3870150..27a75ce 100644
--- a/fs/dlm/user.c
+++ b/fs/dlm/user.c
@@ -286,11 +286,34 @@ static int device_user_unlock(struct dlm_user_proc *proc,
        return error;
 }
 
+static int create_misc_device(struct dlm_ls *ls, char *name)
+{
+       int error, len;
+
+       error = -ENOMEM;
+       len = strlen(name) + strlen(name_prefix) + 2;
+       ls->ls_device.name = kzalloc(len, GFP_KERNEL);
+       if (!ls->ls_device.name)
+               goto fail;
+
+       snprintf((char *)ls->ls_device.name, len, "%s_%s", name_prefix,
+                name);
+       ls->ls_device.fops = &device_fops;
+       ls->ls_device.minor = MISC_DYNAMIC_MINOR;
+
+       error = misc_register(&ls->ls_device);
+       if (error) {
+               kfree(ls->ls_device.name);
+       }
+fail:
+       return error;
+}
+
 static int device_create_lockspace(struct dlm_lspace_params *params)
 {
        dlm_lockspace_t *lockspace;
        struct dlm_ls *ls;
-       int error, len;
+       int error;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
@@ -304,29 +327,14 @@ static int device_create_lockspace(struct 
dlm_lspace_params *params)
        if (!ls)
                return -ENOENT;
 
-       error = -ENOMEM;
-       len = strlen(params->name) + strlen(name_prefix) + 2;
-       ls->ls_device.name = kzalloc(len, GFP_KERNEL);
-       if (!ls->ls_device.name)
-               goto fail;
-       snprintf((char *)ls->ls_device.name, len, "%s_%s", name_prefix,
-                params->name);
-       ls->ls_device.fops = &device_fops;
-       ls->ls_device.minor = MISC_DYNAMIC_MINOR;
-
-       error = misc_register(&ls->ls_device);
-       if (error) {
-               kfree(ls->ls_device.name);
-               goto fail;
-       }
-
-       error = ls->ls_device.minor;
+       error = create_misc_device(ls, params->name);
        dlm_put_lockspace(ls);
-       return error;
 
- fail:
-       dlm_put_lockspace(ls);
-       dlm_release_lockspace(lockspace, 0);
+       if (error)
+               dlm_release_lockspace(lockspace, 0);
+       else
+               error = ls->ls_device.minor;
+
        return error;
 }
 
@@ -343,6 +351,10 @@ static int device_remove_lockspace(struct 
dlm_lspace_params *params)
        if (!ls)
                return -ENOENT;
 
+       /* Deregister the misc device first, so we don't have
+        * a device that's not attached to a lockspace. If
+        * dlm_release_lockspace fails then we can recreate it
+        */
        error = misc_deregister(&ls->ls_device);
        if (error) {
                dlm_put_lockspace(ls);
@@ -361,6 +373,8 @@ static int device_remove_lockspace(struct dlm_lspace_params 
*params)
 
        dlm_put_lockspace(ls);
        error = dlm_release_lockspace(lockspace, force);
+       if (error)
+               create_misc_device(ls, ls->ls_name);
  out:
        return error;
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to