diff options
-rw-r--r-- | fs/ceph/caps.c | 14 | ||||
-rw-r--r-- | fs/ceph/mds_client.c | 8 | ||||
-rw-r--r-- | fs/ceph/mds_client.h | 3 |
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 | */ |
2575 | static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, | 2575 | static 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: | |||
2778 | done_unlocked: | 2786 | done_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 | ||
2783 | bad: | 2793 | bad: |
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 | ||
744 | void 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, | |||
364 | extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, | 364 | extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, |
365 | struct ceph_msg *msg); | 365 | struct ceph_msg *msg); |
366 | 366 | ||
367 | extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc, | ||
368 | struct ceph_mds_session *session); | ||
369 | |||
367 | #endif | 370 | #endif |