From: green@linuxhacker.ru
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
devel@driverdev.osuosl.org,
Andreas Dilger <andreas.dilger@intel.com>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Lustre Development List <lustre-devel@lists.lustre.org>,
Oleg Drokin <green@linuxhacker.ru>
Subject: [PATCH 31/32] staging/lustre/ldlm: Remove posix lock (flock) deadlock detection
Date: Thu, 1 Oct 2015 00:12:41 -0400 [thread overview]
Message-ID: <1443672762-982936-32-git-send-email-green@linuxhacker.ru> (raw)
In-Reply-To: <1443672762-982936-1-git-send-email-green@linuxhacker.ru>
From: Oleg Drokin <green@linuxhacker.ru>
This is server-side code that cannot work on the client
(vfs would do this check on the local node).
Signed-off-by: Oleg Drokin <green@linuxhacker.ru>
---
drivers/staging/lustre/lustre/ldlm/ldlm_flock.c | 132 ------------------------
1 file changed, 132 deletions(-)
diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c b/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c
index 57b4edb..0c46a06 100644
--- a/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c
+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_flock.c
@@ -91,40 +91,6 @@ ldlm_flocks_overlap(struct ldlm_lock *lock, struct ldlm_lock *new)
lock->l_policy_data.l_flock.start));
}
-static inline void ldlm_flock_blocking_link(struct ldlm_lock *req,
- struct ldlm_lock *lock)
-{
- /* For server only */
- if (req->l_export == NULL)
- return;
-
- LASSERT(hlist_unhashed(&req->l_exp_flock_hash));
-
- req->l_policy_data.l_flock.blocking_owner =
- lock->l_policy_data.l_flock.owner;
- req->l_policy_data.l_flock.blocking_export =
- lock->l_export;
- req->l_policy_data.l_flock.blocking_refs = 0;
-
- cfs_hash_add(req->l_export->exp_flock_hash,
- &req->l_policy_data.l_flock.owner,
- &req->l_exp_flock_hash);
-}
-
-static inline void ldlm_flock_blocking_unlink(struct ldlm_lock *req)
-{
- /* For server only */
- if (req->l_export == NULL)
- return;
-
- check_res_locked(req->l_resource);
- if (req->l_export->exp_flock_hash != NULL &&
- !hlist_unhashed(&req->l_exp_flock_hash))
- cfs_hash_del(req->l_export->exp_flock_hash,
- &req->l_policy_data.l_flock.owner,
- &req->l_exp_flock_hash);
-}
-
static inline void
ldlm_flock_destroy(struct ldlm_lock *lock, ldlm_mode_t mode, __u64 flags)
{
@@ -149,79 +115,6 @@ ldlm_flock_destroy(struct ldlm_lock *lock, ldlm_mode_t mode, __u64 flags)
}
/**
- * POSIX locks deadlock detection code.
- *
- * Given a new lock \a req and an existing lock \a bl_lock it conflicts
- * with, we need to iterate through all blocked POSIX locks for this
- * export and see if there is a deadlock condition arising. (i.e. when
- * one client holds a lock on something and want a lock on something
- * else and at the same time another client has the opposite situation).
- */
-static int
-ldlm_flock_deadlock(struct ldlm_lock *req, struct ldlm_lock *bl_lock)
-{
- struct obd_export *req_exp = req->l_export;
- struct obd_export *bl_exp = bl_lock->l_export;
- __u64 req_owner = req->l_policy_data.l_flock.owner;
- __u64 bl_owner = bl_lock->l_policy_data.l_flock.owner;
-
- /* For server only */
- if (req_exp == NULL)
- return 0;
-
- class_export_get(bl_exp);
- while (1) {
- struct obd_export *bl_exp_new;
- struct ldlm_lock *lock = NULL;
- struct ldlm_flock *flock;
-
- if (bl_exp->exp_flock_hash != NULL)
- lock = cfs_hash_lookup(bl_exp->exp_flock_hash,
- &bl_owner);
- if (lock == NULL)
- break;
-
- LASSERT(req != lock);
- flock = &lock->l_policy_data.l_flock;
- LASSERT(flock->owner == bl_owner);
- bl_owner = flock->blocking_owner;
- bl_exp_new = class_export_get(flock->blocking_export);
- class_export_put(bl_exp);
-
- cfs_hash_put(bl_exp->exp_flock_hash, &lock->l_exp_flock_hash);
- bl_exp = bl_exp_new;
-
- if (bl_owner == req_owner && bl_exp == req_exp) {
- class_export_put(bl_exp);
- return 1;
- }
- }
- class_export_put(bl_exp);
-
- return 0;
-}
-
-static void ldlm_flock_cancel_on_deadlock(struct ldlm_lock *lock,
- struct list_head *work_list)
-{
- CDEBUG(D_INFO, "reprocess deadlock req=%p\n", lock);
-
- if ((exp_connect_flags(lock->l_export) &
- OBD_CONNECT_FLOCK_DEAD) == 0) {
- CERROR(
- "deadlock found, but client doesn't support flock canceliation\n");
- } else {
- LASSERT(lock->l_completion_ast);
- LASSERT((lock->l_flags & LDLM_FL_AST_SENT) == 0);
- lock->l_flags |= LDLM_FL_AST_SENT | LDLM_FL_CANCEL_ON_BLOCK |
- LDLM_FL_FLOCK_DEADLOCK;
- ldlm_flock_blocking_unlink(lock);
- ldlm_resource_unlink_lock(lock);
- ldlm_add_ast_work_item(lock, NULL, work_list);
- }
-}
-
-/**
* Process a granting attempt for flock lock.
* Must be called under ns lock held.
*
@@ -307,11 +200,6 @@ reprocess:
if (!first_enq) {
reprocess_failed = 1;
- if (ldlm_flock_deadlock(req, lock)) {
- ldlm_flock_cancel_on_deadlock(req,
- work_list);
- return LDLM_ITER_CONTINUE;
- }
continue;
}
@@ -334,17 +222,6 @@ reprocess:
return LDLM_ITER_STOP;
}
- /* add lock to blocking list before deadlock
- * check to prevent race */
- ldlm_flock_blocking_link(req, lock);
-
- if (ldlm_flock_deadlock(req, lock)) {
- ldlm_flock_blocking_unlink(req);
- ldlm_flock_destroy(req, mode, *flags);
- *err = -EDEADLK;
- return LDLM_ITER_STOP;
- }
-
ldlm_resource_add_lock(res, &res->lr_waiting, req);
*flags |= LDLM_FL_BLOCK_GRANTED;
return LDLM_ITER_STOP;
@@ -360,10 +237,6 @@ reprocess:
return LDLM_ITER_STOP;
}
- /* In case we had slept on this lock request take it off of the
- * deadlock detection hash list. */
- ldlm_flock_blocking_unlink(req);
-
/* Scan the locks owned by this process that overlap this request.
* We may have to merge or split existing locks. */
@@ -551,9 +424,7 @@ ldlm_flock_interrupted_wait(void *data)
lock = ((struct ldlm_flock_wait_data *)data)->fwd_lock;
- /* take lock off the deadlock detection hash list. */
lock_res_and_lock(lock);
- ldlm_flock_blocking_unlink(lock);
/* client side - set flag to prevent lock from being put on LRU list */
lock->l_flags |= LDLM_FL_CBPENDING;
@@ -660,9 +531,6 @@ granted:
lock_res_and_lock(lock);
- /* take lock off the deadlock detection hash list. */
- ldlm_flock_blocking_unlink(lock);
-
/* ldlm_lock_enqueue() has already placed lock on the granted list. */
list_del_init(&lock->l_res_link);
--
2.1.0
next prev parent reply other threads:[~2015-10-01 4:16 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-01 4:12 [PATCH 00/32] Lustre (mostly locking) unused code removal green
2015-10-01 4:12 ` [PATCH 01/32] staging/lustre/llite: Remove unused ll_get_default/max_cookiesize() green
2015-10-01 4:12 ` [PATCH 02/32] staging/lustre: KEY_DEFAULT/MAX_COOKIESIZE key is unused, remove them green
2015-10-01 4:12 ` [PATCH 03/32] staging/lustre: Remove ununused ll_ra_read_get() green
2015-10-01 4:12 ` [PATCH 04/32] staging/lustre/llite: Remove unused ll_rmdir_entry() green
2015-10-01 4:12 ` [PATCH 05/32] staging/lustre/lov: Remove unused lov_dump_lmm/pool() green
2015-10-01 4:12 ` [PATCH 06/32] staging/lustre/lov: Remove unused lov_lsm_decref() green
2015-10-01 4:12 ` [PATCH 07/32] staging/lustre/ldlm: Remove unused interval tree bits green
2015-10-01 4:12 ` [PATCH 08/32] staging/lustre/ldlm: Remove unused ldlm_cancel_locks_for_exports() green
2015-10-01 4:12 ` [PATCH 09/32] staging/lustre/ldlm: Remove ldlm_init/destroy_export() green
2015-10-01 4:12 ` [PATCH 10/32] staging/lustre/ldlm: Remove unimplemented lock conversion traces green
2015-10-01 4:12 ` [PATCH 11/32] staging/lustre/ldlm: Get rid of lr_converting queue green
2015-10-01 4:12 ` [PATCH 12/32] staging/lustre/ldlm: Remove unused ldlm_cli_enqueue_local() green
2015-10-01 4:12 ` [PATCH 13/32] staging/lustre/ldlm: Remove unused ldlm_init/fini_flock_export green
2015-10-01 4:12 ` [PATCH 14/32] staging/lustre/ldlm: Remove unused ldlm_enqueue_pack() green
2015-10-01 4:12 ` [PATCH 15/32] staging/lustre/ldlm: Remove ldlm_errno2error() green
2015-10-01 4:12 ` [PATCH 16/32] staging/lustre/ldlm: Remove ldlm_glimpse_ast() green
2015-10-01 4:12 ` [PATCH 17/32] staging/lustre/ldlm: Remove ldlm_lock_fail_match() green
2015-10-01 4:12 ` [PATCH 18/32] staging/lustre/ldlm: Remove ldlm_namespace_free() green
2015-10-01 4:12 ` [PATCH 19/32] staging/lustre/ldlm: Remove unused ldlm_pool_get_clv() green
2015-10-01 4:12 ` [PATCH 20/32] staging/lustre/ldlm: Remove unused ldlm_pool_set_slv() green
2015-10-01 4:12 ` [PATCH 21/32] staging/lustre/ldlm: Remove ldlm_refresh/del_waiting_lock() green
2015-10-01 4:12 ` [PATCH 22/32] staging/lustre/ldlm: Remove intent policies handler green
2015-10-01 4:12 ` [PATCH 23/32] staging/lustre/ldlm: Remove unused ldlm_reprocess_all*() green
2015-10-01 4:12 ` [PATCH 24/32] staging/lustre/ldlm: Remove unused ldlm_resource_insert_lock_after() green
2015-10-01 4:12 ` [PATCH 25/32] staging/lustre/ldlm: Remove unused ldlm_blocking_ast/_nocheck() green
2015-10-01 4:12 ` [PATCH 26/32] staging/lustre: Remove ns_is_client() green
2015-10-01 4:12 ` [PATCH 27/32] staging/lustre: Remove ns_is_server() green
2015-10-01 4:12 ` [PATCH 28/32] staging/lustre/ldlm: Remove server side code from pool support green
2015-10-01 4:12 ` [PATCH 29/32] staging/lustre/ldlm: Remove unused exported symbols green
2015-10-01 4:12 ` [PATCH 30/32] staging/lustre/ldlm: Remove ldlm_namespace_inactive_list() green
2015-10-01 4:12 ` green [this message]
2015-10-01 4:12 ` [PATCH 32/32] staging/lustre/ldlm: Make ldlm_add_ast_work_item() static green
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1443672762-982936-32-git-send-email-green@linuxhacker.ru \
--to=green@linuxhacker.ru \
--cc=andreas.dilger@intel.com \
--cc=devel@driverdev.osuosl.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lustre-devel@lists.lustre.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®