From 6d05abf613c1bf07efd56ce02b5fe6a94b917f0c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 19 Aug 2008 16:39:28 -0700 Subject: [PATCH] kclient: recheck caps after import, in case RELEASE went to old mds auth --- src/TODO | 2 -- src/kernel/caps.c | 14 +++++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/TODO b/src/TODO index e32a1e34213da..c493ac09aa5c8 100644 --- a/src/TODO +++ b/src/TODO @@ -30,8 +30,6 @@ snaps on uclient - do pickysnap(?) flag thing snaps on mds -- cap release probably needs ack by mds. or, mds needs to possibly initiate recovery on import? no, release should pbly just be acked by mds... like it was way back when... bah! - - file size recovery needs to probe possibly a _range_ snaps. - mds server ops diff --git a/src/kernel/caps.c b/src/kernel/caps.c index a8d8f26a887d9..695c04a9700b3 100644 --- a/src/kernel/caps.c +++ b/src/kernel/caps.c @@ -788,6 +788,9 @@ static void handle_cap_trunc(struct inode *inode, &ci->i_vmtruncate_work); } +/* + * caller holds s_mutex, snap_rwsem + */ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, struct ceph_mds_session *session) { @@ -830,6 +833,9 @@ out: iput(inode); } +/* + * caller holds s_mutex, snap_rwsem + */ static void handle_cap_import(struct inode *inode, struct ceph_mds_caps *im, struct ceph_mds_session *session, void *snaptrace, int snaptrace_len) @@ -872,6 +878,7 @@ void ceph_handle_caps(struct ceph_mds_client *mdsc, u32 seq; struct ceph_vino vino; u64 size, max_size; + int check_caps = 0; dout(10, "handle_caps from mds%d\n", mds); @@ -946,6 +953,7 @@ void ceph_handle_caps(struct ceph_mds_client *mdsc, msg->front.iov_base + sizeof(*h), le32_to_cpu(h->snap_trace_len)); up_write(&mdsc->snap_rwsem); + check_caps = 1; /* we may have sent a RELEASE to the old auth */ break; default: @@ -953,10 +961,14 @@ void ceph_handle_caps(struct ceph_mds_client *mdsc, derr(10, " unknown cap op %d %s\n", op, ceph_cap_op_name(op)); } - iput(inode); no_inode: mutex_unlock(&session->s_mutex); ceph_put_mds_session(session); + + if (check_caps) + ceph_check_caps(ceph_inode(inode), 1, 0); + if (inode) + iput(inode); return; bad: -- 2.39.5