Commit 154f42c2 authored by Sage Weil's avatar Sage Weil

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: default avatarSage Weil <sage@newdream.net>
parent cb170a22
...@@ -2573,7 +2573,8 @@ static void handle_cap_trunc(struct inode *inode, ...@@ -2573,7 +2573,8 @@ static void handle_cap_trunc(struct inode *inode,
* caller holds s_mutex * caller holds s_mutex
*/ */
static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, 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); struct ceph_inode_info *ci = ceph_inode(inode);
int mds = session->s_mds; int mds = session->s_mds;
...@@ -2605,6 +2606,12 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, ...@@ -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_mds = mds;
ci->i_cap_exporting_mseq = mseq; ci->i_cap_exporting_mseq = mseq;
ci->i_cap_exporting_issued = cap->issued; 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); __ceph_remove_cap(cap);
} }
...@@ -2680,6 +2687,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, ...@@ -2680,6 +2687,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
u64 size, max_size; u64 size, max_size;
u64 tid; u64 tid;
void *snaptrace; void *snaptrace;
int open_target_sessions = 0;
dout("handle_caps from mds%d\n", mds); dout("handle_caps from mds%d\n", mds);
...@@ -2731,7 +2739,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, ...@@ -2731,7 +2739,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
goto done; goto done;
case CEPH_CAP_OP_EXPORT: case CEPH_CAP_OP_EXPORT:
handle_cap_export(inode, h, session); handle_cap_export(inode, h, session, &open_target_sessions);
goto done; goto done;
case CEPH_CAP_OP_IMPORT: case CEPH_CAP_OP_IMPORT:
...@@ -2778,6 +2786,8 @@ void ceph_handle_caps(struct ceph_mds_session *session, ...@@ -2778,6 +2786,8 @@ void ceph_handle_caps(struct ceph_mds_session *session,
done_unlocked: done_unlocked:
if (inode) if (inode)
iput(inode); iput(inode);
if (open_target_sessions)
ceph_mdsc_open_export_target_sessions(mdsc, session);
return; return;
bad: bad:
......
...@@ -741,6 +741,14 @@ static void __open_export_target_sessions(struct ceph_mds_client *mdsc, ...@@ -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 * session caps
*/ */
......
...@@ -364,4 +364,7 @@ extern void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session, ...@@ -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, extern void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc,
struct ceph_msg *msg); struct ceph_msg *msg);
extern void ceph_mdsc_open_export_target_sessions(struct ceph_mds_client *mdsc,
struct ceph_mds_session *session);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment