ceph: make iterate_sessions a global symbol
[ Upstream commit 59b312f36230ea91ebb6ce1b11f2781604495d30 ] Signed-off-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Stable-dep-of: 5bd76b8de5b7 ("ceph: fix NULL pointer dereference for req->r_session") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
9ac038d3c2
commit
d94ba7b3b7
@ -4310,33 +4310,9 @@ static void flush_dirty_session_caps(struct ceph_mds_session *s)
|
||||
dout("flush_dirty_caps done\n");
|
||||
}
|
||||
|
||||
static void iterate_sessions(struct ceph_mds_client *mdsc,
|
||||
void (*cb)(struct ceph_mds_session *))
|
||||
{
|
||||
int mds;
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
for (mds = 0; mds < mdsc->max_sessions; ++mds) {
|
||||
struct ceph_mds_session *s;
|
||||
|
||||
if (!mdsc->sessions[mds])
|
||||
continue;
|
||||
|
||||
s = ceph_get_mds_session(mdsc->sessions[mds]);
|
||||
if (!s)
|
||||
continue;
|
||||
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
cb(s);
|
||||
ceph_put_mds_session(s);
|
||||
mutex_lock(&mdsc->mutex);
|
||||
}
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
}
|
||||
|
||||
void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
|
||||
{
|
||||
iterate_sessions(mdsc, flush_dirty_session_caps);
|
||||
ceph_mdsc_iterate_sessions(mdsc, flush_dirty_session_caps, true);
|
||||
}
|
||||
|
||||
void __ceph_touch_fmode(struct ceph_inode_info *ci,
|
||||
|
@ -809,6 +809,33 @@ static void put_request_session(struct ceph_mds_request *req)
|
||||
}
|
||||
}
|
||||
|
||||
void ceph_mdsc_iterate_sessions(struct ceph_mds_client *mdsc,
|
||||
void (*cb)(struct ceph_mds_session *),
|
||||
bool check_state)
|
||||
{
|
||||
int mds;
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
for (mds = 0; mds < mdsc->max_sessions; ++mds) {
|
||||
struct ceph_mds_session *s;
|
||||
|
||||
s = __ceph_lookup_mds_session(mdsc, mds);
|
||||
if (!s)
|
||||
continue;
|
||||
|
||||
if (check_state && !check_session_state(s)) {
|
||||
ceph_put_mds_session(s);
|
||||
continue;
|
||||
}
|
||||
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
cb(s);
|
||||
ceph_put_mds_session(s);
|
||||
mutex_lock(&mdsc->mutex);
|
||||
}
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
}
|
||||
|
||||
void ceph_mdsc_release_request(struct kref *kref)
|
||||
{
|
||||
struct ceph_mds_request *req = container_of(kref,
|
||||
@ -4377,24 +4404,12 @@ void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session,
|
||||
}
|
||||
|
||||
/*
|
||||
* lock unlock sessions, to wait ongoing session activities
|
||||
* lock unlock the session, to wait ongoing session activities
|
||||
*/
|
||||
static void lock_unlock_sessions(struct ceph_mds_client *mdsc)
|
||||
static void lock_unlock_session(struct ceph_mds_session *s)
|
||||
{
|
||||
int i;
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
for (i = 0; i < mdsc->max_sessions; i++) {
|
||||
struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i);
|
||||
if (!s)
|
||||
continue;
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
mutex_lock(&s->s_mutex);
|
||||
mutex_unlock(&s->s_mutex);
|
||||
ceph_put_mds_session(s);
|
||||
mutex_lock(&mdsc->mutex);
|
||||
}
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
mutex_lock(&s->s_mutex);
|
||||
mutex_unlock(&s->s_mutex);
|
||||
}
|
||||
|
||||
static void maybe_recover_session(struct ceph_mds_client *mdsc)
|
||||
@ -4658,7 +4673,7 @@ void ceph_mdsc_pre_umount(struct ceph_mds_client *mdsc)
|
||||
dout("pre_umount\n");
|
||||
mdsc->stopping = 1;
|
||||
|
||||
lock_unlock_sessions(mdsc);
|
||||
ceph_mdsc_iterate_sessions(mdsc, lock_unlock_session, false);
|
||||
ceph_flush_dirty_caps(mdsc);
|
||||
wait_requests(mdsc);
|
||||
|
||||
|
@ -518,6 +518,9 @@ static inline void ceph_mdsc_put_request(struct ceph_mds_request *req)
|
||||
kref_put(&req->r_kref, ceph_mdsc_release_request);
|
||||
}
|
||||
|
||||
extern void ceph_mdsc_iterate_sessions(struct ceph_mds_client *mdsc,
|
||||
void (*cb)(struct ceph_mds_session *),
|
||||
bool check_state);
|
||||
extern struct ceph_msg *ceph_create_session_msg(u32 op, u64 seq);
|
||||
extern void __ceph_queue_cap_release(struct ceph_mds_session *session,
|
||||
struct ceph_cap *cap);
|
||||
|
Loading…
Reference in New Issue
Block a user