]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
dlm: fix lvb copy for user locks
authorDavid Teigland <teigland@redhat.com>
Tue, 25 Aug 2015 17:51:44 +0000 (12:51 -0500)
committerDavid Teigland <teigland@redhat.com>
Tue, 25 Aug 2015 19:41:50 +0000 (14:41 -0500)
For a userland lock request, the previous and current
lock modes are used to decide when the lvb should be
copied back to the user.  The wrong previous value was
used, so that it always matched the current value.
This caused the lvb to be copied back to the user in
the wrong cases.

Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/user.c
include/uapi/linux/dlm_device.h

index fb85f32e9eca66f238d3cfb97a82781be626d0b2..35960502ec8d30e02a8c4287c60b20da0459e407 100644 (file)
@@ -785,6 +785,7 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
        DECLARE_WAITQUEUE(wait, current);
        struct dlm_callback cb;
        int rv, resid, copy_lvb = 0;
+       int old_mode, new_mode;
 
        if (count == sizeof(struct dlm_device_version)) {
                rv = copy_version_to_user(buf, count);
@@ -841,6 +842,9 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
 
        lkb = list_entry(proc->asts.next, struct dlm_lkb, lkb_cb_list);
 
+       /* rem_lkb_callback sets a new lkb_last_cast */
+       old_mode = lkb->lkb_last_cast.mode;
+
        rv = dlm_rem_lkb_callback(lkb->lkb_resource->res_ls, lkb, &cb, &resid);
        if (rv < 0) {
                /* this shouldn't happen; lkb should have been removed from
@@ -864,9 +868,6 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
        }
 
        if (cb.flags & DLM_CB_CAST) {
-               int old_mode, new_mode;
-
-               old_mode = lkb->lkb_last_cast.mode;
                new_mode = cb.mode;
 
                if (!cb.sb_status && lkb->lkb_lksb->sb_lvbptr &&
index 3060783c419154bace8dd6eaffbee3d3d022e060..df56c8ff076986567912c1c8f3fd5ccd9374b8f7 100644 (file)
@@ -26,7 +26,7 @@
 /* Version of the device interface */
 #define DLM_DEVICE_VERSION_MAJOR 6
 #define DLM_DEVICE_VERSION_MINOR 0
-#define DLM_DEVICE_VERSION_PATCH 1
+#define DLM_DEVICE_VERSION_PATCH 2
 
 /* struct passed to the lock write */
 struct dlm_lock_params {