소스 검색

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>
Yan, Zheng 10 년 전
부모
커밋
23078637e0
1개의 변경된 파일0개의 추가작업 그리고 7개의 파일을 삭제
  1. 0 7
      fs/ceph/snap.c

+ 0 - 7
fs/ceph/snap.c

@@ -338,12 +338,6 @@ static int build_snap_context(struct ceph_snap_realm *realm)
 		return 0;
 		return 0;
 	}
 	}
 
 
-	if (num == 0 && realm->seq == ceph_empty_snapc->seq) {
-		ceph_get_snap_context(ceph_empty_snapc);
-		snapc = ceph_empty_snapc;
-		goto done;
-	}
-
 	/* alloc new snap context */
 	/* alloc new snap context */
 	err = -ENOMEM;
 	err = -ENOMEM;
 	if (num > (SIZE_MAX - sizeof(*snapc)) / sizeof(u64))
 	if (num > (SIZE_MAX - sizeof(*snapc)) / sizeof(u64))
@@ -381,7 +375,6 @@ static int build_snap_context(struct ceph_snap_realm *realm)
 	     realm->ino, realm, snapc, snapc->seq,
 	     realm->ino, realm, snapc, snapc->seq,
 	     (unsigned int) snapc->num_snaps);
 	     (unsigned int) snapc->num_snaps);
 
 
-done:
 	ceph_put_snap_context(realm->cached_context);
 	ceph_put_snap_context(realm->cached_context);
 	realm->cached_context = snapc;
 	realm->cached_context = snapc;
 	return 0;
 	return 0;