Commit b96f4650 authored by David Teigland's avatar David Teigland

dlm: fix lvb copy for user locks

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: default avatarDavid Teigland <teigland@redhat.com>
parent 18df8a87
...@@ -785,6 +785,7 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count, ...@@ -785,6 +785,7 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
struct dlm_callback cb; struct dlm_callback cb;
int rv, resid, copy_lvb = 0; int rv, resid, copy_lvb = 0;
int old_mode, new_mode;
if (count == sizeof(struct dlm_device_version)) { if (count == sizeof(struct dlm_device_version)) {
rv = copy_version_to_user(buf, count); 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, ...@@ -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); 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); rv = dlm_rem_lkb_callback(lkb->lkb_resource->res_ls, lkb, &cb, &resid);
if (rv < 0) { if (rv < 0) {
/* this shouldn't happen; lkb should have been removed from /* 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, ...@@ -864,9 +868,6 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
} }
if (cb.flags & DLM_CB_CAST) { if (cb.flags & DLM_CB_CAST) {
int old_mode, new_mode;
old_mode = lkb->lkb_last_cast.mode;
new_mode = cb.mode; new_mode = cb.mode;
if (!cb.sb_status && lkb->lkb_lksb->sb_lvbptr && if (!cb.sb_status && lkb->lkb_lksb->sb_lvbptr &&
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
/* Version of the device interface */ /* Version of the device interface */
#define DLM_DEVICE_VERSION_MAJOR 6 #define DLM_DEVICE_VERSION_MAJOR 6
#define DLM_DEVICE_VERSION_MINOR 0 #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 passed to the lock write */
struct dlm_lock_params { struct dlm_lock_params {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment