From 910e366e916a14af95bb97333678516cc491f3fd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 30 Apr 2008 12:24:03 -0700 Subject: [PATCH] kclient: fix double mutex unlock in check_caps --- src/kernel/inode.c | 8 ++++---- src/kernel/mds_client.c | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/kernel/inode.c b/src/kernel/inode.c index de4b87afaaee5..5fe88ffef4fa8 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -850,26 +850,26 @@ retry: ack: /* take s_mutex, one way or another */ if (session && session != cap->session) { - dout(30, "oops, wrong session mutex\n"); + dout(30, "oops, wrong session %p mutex\n"); mutex_unlock(&session->s_mutex); session = 0; } if (!session) { session = cap->session; if (mutex_trylock(&session->s_mutex) == 0) { - dout(10, "inverting session/inode locking\n"); + dout(10, "inverting session/ino locks on %p\n", + session); spin_unlock(&inode->i_lock); mutex_lock(&session->s_mutex); goto retry; } } - /* ok */ + /* send_cap drops i_lock */ removed_last = __ceph_mdsc_send_cap(mdsc, session, cap, used, wanted, !is_delayed); if (removed_last) goto out; - mutex_unlock(&session->s_mutex); goto retry; } diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 13670e4b1f995..cddd1ee3f0f38 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -1474,6 +1474,7 @@ int send_renewcaps(struct ceph_mds_client *mdsc, /* * called with i_lock, then drops it. + * caller should hold s_mutex. * * returns true if we removed the last cap on this inode. */ -- 2.39.5