diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-01-05 11:04:04 +0800 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2015-02-19 13:31:37 +0300 |
commit | 03f4fcb02884859b584c709652bb48f8125ceb45 (patch) | |
tree | a65b5f4bb6661d17b9a9bdacf7b1c27ddff33137 /fs/ceph/caps.c | |
parent | f646912d1044ace6c6c5b5785b2579177781873b (diff) | |
download | lwn-03f4fcb02884859b584c709652bb48f8125ceb45.tar.gz lwn-03f4fcb02884859b584c709652bb48f8125ceb45.zip |
ceph: handle SESSION_FORCE_RO message
mark session as readonly and wake up all cap waiters.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r-- | fs/ceph/caps.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index b93c631c6c87..d0618e8412fd 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -2143,6 +2143,21 @@ again: ret = 1; } } else { + int session_readonly = false; + if ((need & CEPH_CAP_FILE_WR) && ci->i_auth_cap) { + struct ceph_mds_session *s = ci->i_auth_cap->session; + spin_lock(&s->s_cap_lock); + session_readonly = s->s_readonly; + spin_unlock(&s->s_cap_lock); + } + if (session_readonly) { + dout("get_cap_refs %p needed %s but mds%d readonly\n", + inode, ceph_cap_string(need), ci->i_auth_cap->mds); + *err = -EROFS; + ret = 1; + goto out_unlock; + } + dout("get_cap_refs %p have %s needed %s\n", inode, ceph_cap_string(have), ceph_cap_string(need)); } |