ceph: add missing locking to protect i_snap_realm_item during split
authorSage Weil <sage@newdream.net>
Tue, 9 Mar 2010 20:52:26 +0000 (12:52 -0800)
committerSage Weil <sage@newdream.net>
Sun, 21 Mar 2010 04:33:07 +0000 (21:33 -0700)
All ci->i_snap_realm_item/realm->inodes_with_caps manipulation should be
protected by realm->inodes_with_caps_lock.  This bug would have only bit
us in a rare race with a realm split (during some snap creations).

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/snap.c

index bf2a5f3846a4df0e0170362c17f3a0c9ee08fa3d..8a43bc8675eb924efd3b04485e9de9747e183333 100644 (file)
@@ -818,7 +818,9 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc,
                         * queued (again) by ceph_update_snap_trace()
                         * below.  Queue it _now_, under the old context.
                         */
+                       spin_lock(&realm->inodes_with_caps_lock);
                        list_del_init(&ci->i_snap_realm_item);
+                       spin_unlock(&realm->inodes_with_caps_lock);
                        spin_unlock(&inode->i_lock);
 
                        ceph_queue_cap_snap(ci,