aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-07-19 22:14:06 -0400
committerIlya Dryomov <idryomov@gmail.com>2015-09-08 16:14:29 -0400
commit23078637e05460428f803be7d0f46908df8a970a (patch)
treecb944c5cd124ed8b1d57fdd4cba2f22cff03723c
parent6893162215d7bf08a4273247ec1fc7dedee5135c (diff)
ceph: fix queuing inode to mdsdir's snaprealm
During MDS failovers, MClientSnap message may cause kclient to move some inodes from root directory's snaprealm to mdsdir's snaprealm and queue snapshots for these inodes. For a FS has never created any snapshot, both root directory's snaprealm and mdsdir's snaprealm share the same snapshot contexts (both are ceph_empty_snapc). This confuses ceph_put_wrbuffer_cap_refs(), make it unable to distinguish snapshot buffers from head buffers. The fix is do not use ceph_empty_snapc as snaprealm's cached context. Signed-off-by: Yan, Zheng <zyan@redhat.com>
-rw-r--r--fs/ceph/snap.c7
1 files changed, 0 insertions, 7 deletions
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index 233d906aec02..4aa7122a8d38 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -338,12 +338,6 @@ static int build_snap_context(struct ceph_snap_realm *realm)
338 return 0; 338 return 0;
339 } 339 }
340 340
341 if (num == 0 && realm->seq == ceph_empty_snapc->seq) {
342 ceph_get_snap_context(ceph_empty_snapc);
343 snapc = ceph_empty_snapc;
344 goto done;
345 }
346
347 /* alloc new snap context */ 341 /* alloc new snap context */
348 err = -ENOMEM; 342 err = -ENOMEM;
349 if (num > (SIZE_MAX - sizeof(*snapc)) / sizeof(u64)) 343 if (num > (SIZE_MAX - sizeof(*snapc)) / sizeof(u64))
@@ -381,7 +375,6 @@ static int build_snap_context(struct ceph_snap_realm *realm)
381 realm->ino, realm, snapc, snapc->seq, 375 realm->ino, realm, snapc, snapc->seq,
382 (unsigned int) snapc->num_snaps); 376 (unsigned int) snapc->num_snaps);
383 377
384done:
385 ceph_put_snap_context(realm->cached_context); 378 ceph_put_snap_context(realm->cached_context);
386 realm->cached_context = snapc; 379 realm->cached_context = snapc;
387 return 0; 380 return 0;