diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-05-01 05:49:16 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2015-06-25 04:49:28 -0400 |
commit | 604d1b0245b97738cde4341944ad93edff4b2827 (patch) | |
tree | 05a75dfc1ddf4729405f9cb6ce2f405b8e47791e /fs/ceph/caps.c | |
parent | 860560904962d08fd38666207c910065fe53e074 (diff) |
ceph: take snap_rwsem when accessing snap realm's cached_context
When ceph inode's i_head_snapc is NULL, __ceph_mark_dirty_caps()
accesses snap realm's cached_context. So we need take read lock
of snap_rwsem.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r-- | fs/ceph/caps.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index f1dbcae7c75c..900c05fd77d8 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
@@ -1413,9 +1413,11 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | |||
1413 | ceph_cap_string(was | mask)); | 1413 | ceph_cap_string(was | mask)); |
1414 | ci->i_dirty_caps |= mask; | 1414 | ci->i_dirty_caps |= mask; |
1415 | if (was == 0) { | 1415 | if (was == 0) { |
1416 | if (!ci->i_head_snapc) | 1416 | if (!ci->i_head_snapc) { |
1417 | WARN_ON_ONCE(!rwsem_is_locked(&mdsc->snap_rwsem)); | ||
1417 | ci->i_head_snapc = ceph_get_snap_context( | 1418 | ci->i_head_snapc = ceph_get_snap_context( |
1418 | ci->i_snap_realm->cached_context); | 1419 | ci->i_snap_realm->cached_context); |
1420 | } | ||
1419 | dout(" inode %p now dirty snapc %p auth cap %p\n", | 1421 | dout(" inode %p now dirty snapc %p auth cap %p\n", |
1420 | &ci->vfs_inode, ci->i_head_snapc, ci->i_auth_cap); | 1422 | &ci->vfs_inode, ci->i_head_snapc, ci->i_auth_cap); |
1421 | BUG_ON(!list_empty(&ci->i_dirty_item)); | 1423 | BUG_ON(!list_empty(&ci->i_dirty_item)); |