aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dlm/plock.c
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2013-04-05 05:57:15 -0400
committerDavid Teigland <teigland@redhat.com>2013-04-08 13:03:15 -0400
commit900083183959107159f962b83b3b439d53796499 (patch)
tree45827ae0ce336cc0767bcb09938772df4497a809 /fs/dlm/plock.c
parent31880c37c11e28cb81c70757e38392b42e695dc6 (diff)
dlm: avoid unnecessary posix unlock
When the kernel clears flocks/plocks during close, it calls posix unlock when there are flocks but no posix locks. Without this patch, that unnecessary posix unlock is passed to userland (dlm_controld), across the cluster, and back to the kernel. This can create a lot of plock activity, even when no posix locks had been used. This patch copies the nfs approach, and skips the full posix unlock if there is no plock found during the vfs unlock phase. Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/dlm/plock.c')
-rw-r--r--fs/dlm/plock.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c
index 01fd5c11a7fb..f704458ea5f5 100644
--- a/fs/dlm/plock.c
+++ b/fs/dlm/plock.c
@@ -247,6 +247,7 @@ int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
247 struct dlm_ls *ls; 247 struct dlm_ls *ls;
248 struct plock_op *op; 248 struct plock_op *op;
249 int rv; 249 int rv;
250 unsigned char fl_flags = fl->fl_flags;
250 251
251 ls = dlm_find_lockspace_local(lockspace); 252 ls = dlm_find_lockspace_local(lockspace);
252 if (!ls) 253 if (!ls)
@@ -258,9 +259,18 @@ int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
258 goto out; 259 goto out;
259 } 260 }
260 261
261 if (posix_lock_file_wait(file, fl) < 0) 262 /* cause the vfs unlock to return ENOENT if lock is not found */
262 log_error(ls, "dlm_posix_unlock: vfs unlock error %llx", 263 fl->fl_flags |= FL_EXISTS;
263 (unsigned long long)number); 264
265 rv = posix_lock_file_wait(file, fl);
266 if (rv == -ENOENT) {
267 rv = 0;
268 goto out_free;
269 }
270 if (rv < 0) {
271 log_error(ls, "dlm_posix_unlock: vfs unlock error %d %llx",
272 rv, (unsigned long long)number);
273 }
264 274
265 op->info.optype = DLM_PLOCK_OP_UNLOCK; 275 op->info.optype = DLM_PLOCK_OP_UNLOCK;
266 op->info.pid = fl->fl_pid; 276 op->info.pid = fl->fl_pid;
@@ -296,9 +306,11 @@ int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
296 if (rv == -ENOENT) 306 if (rv == -ENOENT)
297 rv = 0; 307 rv = 0;
298 308
309out_free:
299 kfree(op); 310 kfree(op);
300out: 311out:
301 dlm_put_lockspace(ls); 312 dlm_put_lockspace(ls);
313 fl->fl_flags = fl_flags;
302 return rv; 314 return rv;
303} 315}
304EXPORT_SYMBOL_GPL(dlm_posix_unlock); 316EXPORT_SYMBOL_GPL(dlm_posix_unlock);