Skip to content

Commit ce72d4e

Browse files
lxbszidryomov
authored andcommitted
ceph: issue a cap release immediately if no cap exists
In case: mds client - Releases cap and put Inode - Increase cap->seq and sends revokes req to the client - Receives release req and - Receives & drops the revoke req skip removing the cap and then eval the CInode and issue or revoke caps again. - Receives & drops the caps update or revoke req - Health warning for client isn't responding to mclientcaps(revoke) All the IMPORT/REVOKE/GRANT cap ops will increase the session seq in MDS side and then the client need to issue a cap release to unblock MDS to remove the corresponding cap to unblock possible waiters. Link: https://tracker.ceph.com/issues/61332 Signed-off-by: Xiubo Li <[email protected]> Reviewed-by: Milind Changire <[email protected]> Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 2d12ad9 commit ce72d4e

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

fs/ceph/caps.c

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4092,6 +4092,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
40924092
struct cap_extra_info extra_info = {};
40934093
bool queue_trunc;
40944094
bool close_sessions = false;
4095+
bool do_cap_release = false;
40954096

40964097
dout("handle_caps from mds%d\n", session->s_mds);
40974098

@@ -4198,17 +4199,14 @@ void ceph_handle_caps(struct ceph_mds_session *session,
41984199
if (!inode) {
41994200
dout(" i don't have ino %llx\n", vino.ino);
42004201

4201-
if (op == CEPH_CAP_OP_IMPORT) {
4202-
cap = ceph_get_cap(mdsc, NULL);
4203-
cap->cap_ino = vino.ino;
4204-
cap->queue_release = 1;
4205-
cap->cap_id = le64_to_cpu(h->cap_id);
4206-
cap->mseq = mseq;
4207-
cap->seq = seq;
4208-
cap->issue_seq = seq;
4209-
spin_lock(&session->s_cap_lock);
4210-
__ceph_queue_cap_release(session, cap);
4211-
spin_unlock(&session->s_cap_lock);
4202+
switch (op) {
4203+
case CEPH_CAP_OP_IMPORT:
4204+
case CEPH_CAP_OP_REVOKE:
4205+
case CEPH_CAP_OP_GRANT:
4206+
do_cap_release = true;
4207+
break;
4208+
default:
4209+
break;
42124210
}
42134211
goto flush_cap_releases;
42144212
}
@@ -4258,6 +4256,14 @@ void ceph_handle_caps(struct ceph_mds_session *session,
42584256
inode, ceph_ino(inode), ceph_snap(inode),
42594257
session->s_mds);
42604258
spin_unlock(&ci->i_ceph_lock);
4259+
switch (op) {
4260+
case CEPH_CAP_OP_REVOKE:
4261+
case CEPH_CAP_OP_GRANT:
4262+
do_cap_release = true;
4263+
break;
4264+
default:
4265+
break;
4266+
}
42614267
goto flush_cap_releases;
42624268
}
42634269

@@ -4308,6 +4314,18 @@ void ceph_handle_caps(struct ceph_mds_session *session,
43084314
* along for the mds (who clearly thinks we still have this
43094315
* cap).
43104316
*/
4317+
if (do_cap_release) {
4318+
cap = ceph_get_cap(mdsc, NULL);
4319+
cap->cap_ino = vino.ino;
4320+
cap->queue_release = 1;
4321+
cap->cap_id = le64_to_cpu(h->cap_id);
4322+
cap->mseq = mseq;
4323+
cap->seq = seq;
4324+
cap->issue_seq = seq;
4325+
spin_lock(&session->s_cap_lock);
4326+
__ceph_queue_cap_release(session, cap);
4327+
spin_unlock(&session->s_cap_lock);
4328+
}
43114329
ceph_flush_cap_releases(mdsc, session);
43124330
goto done;
43134331

0 commit comments

Comments
 (0)