aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ceph/caps.c14
-rw-r--r--fs/ceph/mds_client.c8
-rw-r--r--fs/ceph/mds_client.h3
3 files changed, 23 insertions, 2 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 47068b10baf8..52befa65fbf7 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -2573,7 +2573,8 @@ static void handle_cap_trunc(struct inode *inode,
2573 * caller holds s_mutex 2573 * caller holds s_mutex
2574 */ 2574 */
2575static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, 2575static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
2576 struct ceph_mds_session *session) 2576 struct ceph_mds_session *session,
2577 int *open_target_sessions)
2577{ 2578{
2578 struct ceph_inode_info *ci = ceph_inode(inode); 2579 struct ceph_inode_info *ci = ceph_inode(inode);
2579 int mds = session->s_mds; 2580 int mds = session->s_mds;
@@ -2605,6 +2606,12 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
2605 ci->i_cap_exporting_mds = mds; 2606 ci->i_cap_exporting_mds = mds;
2606 ci->i_cap_exporting_mseq = mseq; 2607 ci->i_cap_exporting_mseq = mseq;
2607 ci->i_cap_exporting_issued = cap->issued; 2608 ci->i_cap_exporting_issued = cap->issued;
2609
2610 /*
2611 * make sure we have open sessions with all possible
2612 * export targets, so that we get the matching IMPORT
2613 */
2614 *open_target_sessions = 1;
2608 } 2615 }
2609 __ceph_remove_cap(cap); 2616 __ceph_remove_cap(cap);
2610 } 2617 }
@@ -2680,6 +2687,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
2680 u64 size, max_size; 2687 u64 size, max_size;
2681 u64 tid; 2688 u64 tid;
2682 void *snaptrace; 2689 void *snaptrace;
2690 int open_target_sessions = 0;
2683 2691
2684 dout("handle_caps from mds%d\n", mds); 2692 dout("handle_caps from mds%d\n", mds);
2685 2693
@@ -2731,7 +2739,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
2731 goto done; 2739 goto done;
2732 2740
2733 case CEPH_CAP_OP_EXPORT: 2741 case CEPH_CAP_OP_EXPORT:
2734 handle_cap_export(inode, h, session); 2742 handle_cap_export(inode, h, session, &open_target_sessions);
2735 goto done; 2743 goto done;
2736 2744
2737 case CEPH_CAP_OP_IMPORT: 2745 case CEPH_CAP_OP_IMPORT:
@@ -2778,6 +2786,8 @@ done:
2778done_unlocked: 2786done_unlocked:
2779 if (inode) 2787 if (inode)
2780 iput(inode); 2788 iput(inode);
2789 if (open_target_sessions)
2790 ceph_mdsc_open_export_target_sessions(mdsc, session);
2781 return; 2791 return;
2782 2792
2783bad: 2793bad:
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 552b934c9cd0..a546e0ddb8e3 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -741,6 +741,14 @@ static void __open_export_target_sessions(struct ceph_mds_client *mdsc,
741 } 741 }
742} 742}
743 743
744void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc,
745 struct ceph_mds_session *session)
746{
747 mutex_lock(&mdsc->mutex);
748 __open_export_target_sessions(mdsc, session);
749 mutex_unlock(&mdsc->mutex);
750}
751
744/* 752/*
745 * session caps 753 * session caps
746 */ 754 */
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index 8f2126321f2d..c86be30e8707 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -364,4 +364,7 @@ extern void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session,
364extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, 364extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc,
365 struct ceph_msg *msg); 365 struct ceph_msg *msg);
366 366
367extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc,
368 struct ceph_mds_session *session);
369
367#endif 370#endif