mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 15:58:47 +00:00
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>
This commit is contained in:
parent
cb170a2215
commit
154f42c2c3
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 @@ done:
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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,
|
|||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user