diff options
author | Yan, Zheng <zyan@redhat.com> | 2014-11-06 15:09:41 +0800 |
---|---|---|
committer | Ilya Dryomov <idryomov@redhat.com> | 2014-12-17 20:09:51 +0300 |
commit | 97c85a828f36bbfffe9d77b977b65a5872b6cad4 (patch) | |
tree | dd432537785a075981f8e1ea5525b5f4f0006cf3 /fs/ceph/super.c | |
parent | 7cfa0313d0dc52e4da9f196f8ad5bfdf266fc1fb (diff) | |
download | op-kernel-dev-97c85a828f36bbfffe9d77b977b65a5872b6cad4.zip op-kernel-dev-97c85a828f36bbfffe9d77b977b65a5872b6cad4.tar.gz |
ceph: introduce global empty snap context
Current snaphost code does not properly handle moving inode from one
empty snap realm to another empty snap realm. After changing inode's
snap realm, some dirty pages' snap context can be not equal to inode's
i_head_snap. This can trigger BUG() in ceph_put_wrbuffer_cap_refs()
The fix is introduce a global empty snap context for all empty snap
realm. This avoids triggering the BUG() for filesystem with no snapshot.
Fixes: http://tracker.ceph.com/issues/9928
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Reviewed-by: Ilya Dryomov <idryomov@redhat.com>
Diffstat (limited to 'fs/ceph/super.c')
-rw-r--r-- | fs/ceph/super.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index f6e1237..3b5c1e3 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -1028,15 +1028,20 @@ static int __init init_ceph(void) ceph_flock_init(); ceph_xattr_init(); + ret = ceph_snap_init(); + if (ret) + goto out_xattr; ret = register_filesystem(&ceph_fs_type); if (ret) - goto out_icache; + goto out_snap; pr_info("loaded (mds proto %d)\n", CEPH_MDSC_PROTOCOL); return 0; -out_icache: +out_snap: + ceph_snap_exit(); +out_xattr: ceph_xattr_exit(); destroy_caches(); out: @@ -1047,6 +1052,7 @@ static void __exit exit_ceph(void) { dout("exit_ceph\n"); unregister_filesystem(&ceph_fs_type); + ceph_snap_exit(); ceph_xattr_exit(); destroy_caches(); } |