summaryrefslogtreecommitdiffstats
path: root/fs/ceph/caps.c
diff options
context:
space:
mode:
authorYan, Zheng2015-01-05 04:04:04 +0100
committerIlya Dryomov2015-02-19 11:31:37 +0100
commit03f4fcb02884859b584c709652bb48f8125ceb45 (patch)
treea65b5f4bb6661d17b9a9bdacf7b1c27ddff33137 /fs/ceph/caps.c
parentlibceph: use mon_client.c/put_generic_request() more (diff)
downloadkernel-qcow2-linux-03f4fcb02884859b584c709652bb48f8125ceb45.tar.gz
kernel-qcow2-linux-03f4fcb02884859b584c709652bb48f8125ceb45.tar.xz
kernel-qcow2-linux-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.c15
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));
}