Commit c847f4e2 authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland
Browse files

fs: dlm: fix cleanup pending ops when interrupted



Immediately clean up a posix lock request if it is interrupted
while waiting for a result from user space (dlm_controld.)  This
largely reverts the recent commit b92a4e3f ("fs: dlm: change
posix lock sigint handling"). That previous commit attempted
to defer lock cleanup to the point in time when a result from
user space arrived. The deferred approach was not reliable
because some dlm plock ops may not receive replies.

Cc: stable@vger.kernel.org
Fixes: b92a4e3f ("fs: dlm: change posix lock sigint handling")
Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 92655fbd
Loading
Loading
Loading
Loading
+6 −19
Original line number Diff line number Diff line
@@ -30,8 +30,6 @@ struct plock_async_data {
struct plock_op {
	struct list_head list;
	int done;
	/* if lock op got interrupted while waiting dlm_controld reply */
	bool sigint;
	struct dlm_plock_info info;
	/* if set indicates async handling */
	struct plock_async_data *data;
@@ -167,12 +165,14 @@ int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
			spin_unlock(&ops_lock);
			goto do_lock_wait;
		}

		op->sigint = true;
		list_del(&op->list);
		spin_unlock(&ops_lock);

		log_debug(ls, "%s: wait interrupted %x %llx pid %d",
			  __func__, ls->ls_global_id,
			  (unsigned long long)number, op->info.pid);
		do_unlock_close(&op->info);
		dlm_release_plock_op(op);
		goto out;
	}

@@ -434,19 +434,6 @@ static ssize_t dev_write(struct file *file, const char __user *u, size_t count,
		if (iter->info.fsid == info.fsid &&
		    iter->info.number == info.number &&
		    iter->info.owner == info.owner) {
			if (iter->sigint) {
				list_del(&iter->list);
				spin_unlock(&ops_lock);

				pr_debug("%s: sigint cleanup %x %llx pid %d",
					  __func__, iter->info.fsid,
					  (unsigned long long)iter->info.number,
					  iter->info.pid);
				do_unlock_close(&iter->info);
				memcpy(&iter->info, &info, sizeof(info));
				dlm_release_plock_op(iter);
				return count;
			}
			list_del_init(&iter->list);
			memcpy(&iter->info, &info, sizeof(info));
			if (iter->data)
@@ -465,7 +452,7 @@ static ssize_t dev_write(struct file *file, const char __user *u, size_t count,
		else
			wake_up(&recv_wq);
	} else
		log_print("%s: no op %x %llx", __func__,
		pr_debug("%s: no op %x %llx", __func__,
			 info.fsid, (unsigned long long)info.number);
	return count;
}