diff options
author | Sage Weil <sage@newdream.net> | 2010-06-21 13:45:04 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-08-01 20:11:41 -0700 |
commit | 154f42c2c3c3b66a7a63dad5648e8a9860a32af9 (patch) | |
tree | 408beec027a62dcb67f212b07590039aea22866b /fs | |
parent | cb170a22153730eb9c82b6c85ead2001dba6c41a (diff) |
ceph: connect to export targets on cap export
When we get a cap EXPORT message, make sure we are connected to all export
targets to ensure we can handle the matching IMPORT.
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs')
-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 47068b10baf..52befa65fbf 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -2573,7 +2573,8 @@ static void handle_cap_trunc(struct inode *inode, * caller holds s_mutex */ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, - struct ceph_mds_session *session) + struct ceph_mds_session *session, + int *open_target_sessions) { struct ceph_inode_info *ci = ceph_inode(inode); int mds = session->s_mds; @@ -2605,6 +2606,12 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, ci->i_cap_exporting_mds = mds; ci->i_cap_exporting_mseq = mseq; ci->i_cap_exporting_issued = cap->issued; + + /* + * make sure we have open sessions with all possible + * export targets, so that we get the matching IMPORT + */ + *open_target_sessions = 1; } __ceph_remove_cap(cap); } @@ -2680,6 +2687,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, u64 size, max_size; u64 tid; void *snaptrace; + int open_target_sessions = 0; dout("handle_caps from mds%d\n", mds); @@ -2731,7 +2739,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, goto done; case CEPH_CAP_OP_EXPORT: - handle_cap_export(inode, h, session); + handle_cap_export(inode, h, session, &open_target_sessions); goto done; case CEPH_CAP_OP_IMPORT: @@ -2778,6 +2786,8 @@ done: done_unlocked: if (inode) iput(inode); + if (open_target_sessions) + ceph_mdsc_open_export_target_sessions(mdsc, session); return; bad: diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 552b934c9cd..a546e0ddb8e 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, } } +void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc, + struct ceph_mds_session *session) +{ + mutex_lock(&mdsc->mutex); + __open_export_target_sessions(mdsc, session); + mutex_unlock(&mdsc->mutex); +} + /* * session caps */ diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h index 8f2126321f2..c86be30e870 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, extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg); +extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc, + struct ceph_mds_session *session); + #endif |