Commit 7732fe16 authored by Jeff Layton's avatar Jeff Layton Committed by Ilya Dryomov

ceph: don't take s_mutex in ceph_flush_snaps

Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarLuis Henriques <lhenriques@suse.de>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 0449a352
...@@ -1531,7 +1531,7 @@ static inline int __send_flush_snap(struct inode *inode, ...@@ -1531,7 +1531,7 @@ static inline int __send_flush_snap(struct inode *inode,
* asynchronously back to the MDS once sync writes complete and dirty * asynchronously back to the MDS once sync writes complete and dirty
* data is written out. * data is written out.
* *
* Called under i_ceph_lock. Takes s_mutex as needed. * Called under i_ceph_lock.
*/ */
static void __ceph_flush_snaps(struct ceph_inode_info *ci, static void __ceph_flush_snaps(struct ceph_inode_info *ci,
struct ceph_mds_session *session) struct ceph_mds_session *session)
...@@ -1653,7 +1653,6 @@ void ceph_flush_snaps(struct ceph_inode_info *ci, ...@@ -1653,7 +1653,6 @@ void ceph_flush_snaps(struct ceph_inode_info *ci,
mds = ci->i_auth_cap->session->s_mds; mds = ci->i_auth_cap->session->s_mds;
if (session && session->s_mds != mds) { if (session && session->s_mds != mds) {
dout(" oops, wrong session %p mutex\n", session); dout(" oops, wrong session %p mutex\n", session);
mutex_unlock(&session->s_mutex);
ceph_put_mds_session(session); ceph_put_mds_session(session);
session = NULL; session = NULL;
} }
...@@ -1662,10 +1661,6 @@ void ceph_flush_snaps(struct ceph_inode_info *ci, ...@@ -1662,10 +1661,6 @@ void ceph_flush_snaps(struct ceph_inode_info *ci,
mutex_lock(&mdsc->mutex); mutex_lock(&mdsc->mutex);
session = __ceph_lookup_mds_session(mdsc, mds); session = __ceph_lookup_mds_session(mdsc, mds);
mutex_unlock(&mdsc->mutex); mutex_unlock(&mdsc->mutex);
if (session) {
dout(" inverting session/ino locks on %p\n", session);
mutex_lock(&session->s_mutex);
}
goto retry; goto retry;
} }
...@@ -1677,12 +1672,10 @@ void ceph_flush_snaps(struct ceph_inode_info *ci, ...@@ -1677,12 +1672,10 @@ void ceph_flush_snaps(struct ceph_inode_info *ci,
out: out:
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
if (psession) { if (psession)
*psession = session; *psession = session;
} else if (session) { else
mutex_unlock(&session->s_mutex);
ceph_put_mds_session(session); ceph_put_mds_session(session);
}
/* we flushed them all; remove this inode from the queue */ /* we flushed them all; remove this inode from the queue */
spin_lock(&mdsc->snap_flush_lock); spin_lock(&mdsc->snap_flush_lock);
list_del_init(&ci->i_snap_flush_item); list_del_init(&ci->i_snap_flush_item);
......
...@@ -846,10 +846,7 @@ static void flush_snaps(struct ceph_mds_client *mdsc) ...@@ -846,10 +846,7 @@ static void flush_snaps(struct ceph_mds_client *mdsc)
} }
spin_unlock(&mdsc->snap_flush_lock); spin_unlock(&mdsc->snap_flush_lock);
if (session) { ceph_put_mds_session(session);
mutex_unlock(&session->s_mutex);
ceph_put_mds_session(session);
}
dout("flush_snaps done\n"); dout("flush_snaps done\n");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment