From 8e22b29d3f3a1fff4387f767baae98d3216874fd Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 28 Apr 2008 10:54:37 -0700 Subject: [PATCH] kclient: drop leases before kill_anon_super --- src/kernel/mds_client.c | 18 ++++++++++++++++++ src/kernel/mds_client.h | 1 + src/kernel/super.c | 1 + 3 files changed, 20 insertions(+) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index d177bf7f1b23d..53526957130c8 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -848,6 +848,24 @@ bad: } +/* + * drop all leases (and dentry refs) in preparation for umount + */ +void ceph_mdsc_drop_leases(struct ceph_mds_client *mdsc) +{ + int i; + + spin_lock(&mdsc->lock); + for (i = 0; i < mdsc->max_sessions; i++) { + struct ceph_mds_session *session = __get_session(mdsc, i); + if (!session) + continue; + spin_unlock(&mdsc->lock); + remove_session_leases(session); + spin_lock(&mdsc->lock); + } + spin_unlock(&mdsc->lock); +} /* exported functions */ diff --git a/src/kernel/mds_client.h b/src/kernel/mds_client.h index 63ec1f5786e7c..a865aa35fbf54 100644 --- a/src/kernel/mds_client.h +++ b/src/kernel/mds_client.h @@ -145,5 +145,6 @@ extern int __ceph_mdsc_send_cap(struct ceph_mds_client *mdsc, struct ceph_mds_session *session, struct ceph_inode_cap *cap, int used, int wanted, int cancel_work); +extern void ceph_mdsc_drop_leases(struct ceph_mds_client *mdsc); #endif diff --git a/src/kernel/super.c b/src/kernel/super.c index 3cb5897215087..cf4111beb66d5 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -535,6 +535,7 @@ static void ceph_kill_sb(struct super_block *s) { struct ceph_client *client = ceph_sb_to_client(s); dout(1, "kill_sb %p\n", s); + ceph_mdsc_drop_leases(&client->mdsc); kill_anon_super(s); /* will call put_super after sb is r/o */ ceph_destroy_client(client); } -- 2.39.5