|
@@ -247,6 +247,7 @@ int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
|
|
struct dlm_ls *ls;
|
|
|
struct plock_op *op;
|
|
|
int rv;
|
|
|
+ unsigned char fl_flags = fl->fl_flags;
|
|
|
|
|
|
ls = dlm_find_lockspace_local(lockspace);
|
|
|
if (!ls)
|
|
@@ -258,9 +259,18 @@ int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (posix_lock_file_wait(file, fl) < 0)
|
|
|
- log_error(ls, "dlm_posix_unlock: vfs unlock error %llx",
|
|
|
- (unsigned long long)number);
|
|
|
+ /* cause the vfs unlock to return ENOENT if lock is not found */
|
|
|
+ fl->fl_flags |= FL_EXISTS;
|
|
|
+
|
|
|
+ rv = posix_lock_file_wait(file, fl);
|
|
|
+ if (rv == -ENOENT) {
|
|
|
+ rv = 0;
|
|
|
+ goto out_free;
|
|
|
+ }
|
|
|
+ if (rv < 0) {
|
|
|
+ log_error(ls, "dlm_posix_unlock: vfs unlock error %d %llx",
|
|
|
+ rv, (unsigned long long)number);
|
|
|
+ }
|
|
|
|
|
|
op->info.optype = DLM_PLOCK_OP_UNLOCK;
|
|
|
op->info.pid = fl->fl_pid;
|
|
@@ -296,9 +306,11 @@ int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
|
|
|
if (rv == -ENOENT)
|
|
|
rv = 0;
|
|
|
|
|
|
+out_free:
|
|
|
kfree(op);
|
|
|
out:
|
|
|
dlm_put_lockspace(ls);
|
|
|
+ fl->fl_flags = fl_flags;
|
|
|
return rv;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(dlm_posix_unlock);
|