Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -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:
+8 −0
Original line number Diff line number Diff line
@@ -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
 */
+3 −0
Original line number Diff line number Diff line
@@ -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