Commit 21b559de authored by Greg Farnum's avatar Greg Farnum Committed by Sage Weil

ceph: send cap release message early on failed revoke.

If an MDS tries to revoke caps that we don't have, we want to send
releases early since they probably contain the caps message the MDS
is looking for.

Previously, we only sent the messages if we didn't have the inode either. But
in a multi-mds system we can retain the inode after dropping all caps for
a single MDS.
Signed-off-by: default avatarGreg Farnum <gregf@hq.newdream.net>
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent bba0cd0e
...@@ -2774,15 +2774,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, ...@@ -2774,15 +2774,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
if (op == CEPH_CAP_OP_IMPORT) if (op == CEPH_CAP_OP_IMPORT)
__queue_cap_release(session, vino.ino, cap_id, __queue_cap_release(session, vino.ino, cap_id,
mseq, seq); mseq, seq);
goto flush_cap_releases;
/*
* send any full release message to try to move things
* along for the mds (who clearly thinks we still have this
* cap).
*/
ceph_add_cap_releases(mdsc, session);
ceph_send_cap_releases(mdsc, session);
goto done;
} }
/* these will work even if we don't have a cap yet */ /* these will work even if we don't have a cap yet */
...@@ -2810,7 +2802,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, ...@@ -2810,7 +2802,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
dout(" no cap on %p ino %llx.%llx from mds%d\n", dout(" no cap on %p ino %llx.%llx from mds%d\n",
inode, ceph_ino(inode), ceph_snap(inode), mds); inode, ceph_ino(inode), ceph_snap(inode), mds);
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
goto done; goto flush_cap_releases;
} }
/* note that each of these drops i_lock for us */ /* note that each of these drops i_lock for us */
...@@ -2834,6 +2826,17 @@ void ceph_handle_caps(struct ceph_mds_session *session, ...@@ -2834,6 +2826,17 @@ void ceph_handle_caps(struct ceph_mds_session *session,
ceph_cap_op_name(op)); ceph_cap_op_name(op));
} }
goto done;
flush_cap_releases:
/*
* send any full release message to try to move things
* along for the mds (who clearly thinks we still have this
* cap).
*/
ceph_add_cap_releases(mdsc, session);
ceph_send_cap_releases(mdsc, session);
done: done:
mutex_unlock(&session->s_mutex); mutex_unlock(&session->s_mutex);
done_unlocked: done_unlocked:
......
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