diff options
-rw-r--r-- | fs/ceph/mds_client.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 8d95b0f051e4..7da836909abb 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -746,14 +746,24 @@ static void remove_session_caps(struct ceph_mds_session *session) | |||
746 | static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap, | 746 | static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap, |
747 | void *arg) | 747 | void *arg) |
748 | { | 748 | { |
749 | wake_up(&ceph_inode(inode)->i_cap_wq); | 749 | struct ceph_inode_info *ci = ceph_inode(inode); |
750 | |||
751 | wake_up(&ci->i_cap_wq); | ||
752 | if (arg) { | ||
753 | spin_lock(&inode->i_lock); | ||
754 | ci->i_wanted_max_size = 0; | ||
755 | ci->i_requested_max_size = 0; | ||
756 | spin_unlock(&inode->i_lock); | ||
757 | } | ||
750 | return 0; | 758 | return 0; |
751 | } | 759 | } |
752 | 760 | ||
753 | static void wake_up_session_caps(struct ceph_mds_session *session) | 761 | static void wake_up_session_caps(struct ceph_mds_session *session, |
762 | int reconnect) | ||
754 | { | 763 | { |
755 | dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); | 764 | dout("wake_up_session_caps %p mds%d\n", session, session->s_mds); |
756 | iterate_session_caps(session, wake_up_session_cb, NULL); | 765 | iterate_session_caps(session, wake_up_session_cb, |
766 | (void *)(unsigned long)reconnect); | ||
757 | } | 767 | } |
758 | 768 | ||
759 | /* | 769 | /* |
@@ -794,6 +804,8 @@ static int send_renew_caps(struct ceph_mds_client *mdsc, | |||
794 | 804 | ||
795 | /* | 805 | /* |
796 | * Note new cap ttl, and any transition from stale -> not stale (fresh?). | 806 | * Note new cap ttl, and any transition from stale -> not stale (fresh?). |
807 | * | ||
808 | * Called under session->s_mutex | ||
797 | */ | 809 | */ |
798 | static void renewed_caps(struct ceph_mds_client *mdsc, | 810 | static void renewed_caps(struct ceph_mds_client *mdsc, |
799 | struct ceph_mds_session *session, int is_renew) | 811 | struct ceph_mds_session *session, int is_renew) |
@@ -822,7 +834,7 @@ static void renewed_caps(struct ceph_mds_client *mdsc, | |||
822 | spin_unlock(&session->s_cap_lock); | 834 | spin_unlock(&session->s_cap_lock); |
823 | 835 | ||
824 | if (wake) | 836 | if (wake) |
825 | wake_up_session_caps(session); | 837 | wake_up_session_caps(session, 0); |
826 | } | 838 | } |
827 | 839 | ||
828 | /* | 840 | /* |
@@ -2248,6 +2260,7 @@ static void check_new_map(struct ceph_mds_client *mdsc, | |||
2248 | pr_info("mds%d reconnect completed\n", s->s_mds); | 2260 | pr_info("mds%d reconnect completed\n", s->s_mds); |
2249 | kick_requests(mdsc, i, 1); | 2261 | kick_requests(mdsc, i, 1); |
2250 | ceph_kick_flushing_caps(mdsc, s); | 2262 | ceph_kick_flushing_caps(mdsc, s); |
2263 | wake_up_session_caps(s, 1); | ||
2251 | } | 2264 | } |
2252 | } | 2265 | } |
2253 | } | 2266 | } |