From 6461ab68d771903fd5ecc21c4df68102d022c3d5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 16 Aug 2010 13:37:31 -0700 Subject: [PATCH] --- yaml --- r: 210047 b: refs/heads/master c: ed326044489ed89c740c50a3df5dffc9c3b20b96 h: refs/heads/master i: 210045: dc7ad8e46f93f53b54d1a511deffa6c88548b3df 210043: e7454de7c552201d5293aceceecd0495ada3160e 210039: 459ad47ec6dc931f6a8570aadfdab7ec59a54b58 210031: ad8f4289cb576b76b37abb7225dca9eff644cf5c 210015: 6e08dc6e8b3f747c9dc914f6c09b432a60654db3 209983: 074cf6776d33e64e2f1d540a1edc58e7ae611586 209919: 9cf3cd8e43b557bc0e888142d517c53d9cbb544b v: v3 --- [refs] | 2 +- trunk/fs/ceph/snap.c | 60 +++++++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/[refs] b/[refs] index ffce621b5d3a..2a4e25c6f67e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4a625be47243e0e07dedd0a1a6b94c66c2ab93ba +refs/heads/master: ed326044489ed89c740c50a3df5dffc9c3b20b96 diff --git a/trunk/fs/ceph/snap.c b/trunk/fs/ceph/snap.c index 2cb190c2bd99..6bdbf3ae7082 100644 --- a/trunk/fs/ceph/snap.c +++ b/trunk/fs/ceph/snap.c @@ -548,6 +548,41 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci, return 1; /* caller may want to ceph_flush_snaps */ } +/* + * Queue cap_snaps for snap writeback for this realm and its children. + * Called under snap_rwsem, so realm topology won't change. + */ +static void queue_realm_cap_snaps(struct ceph_snap_realm *realm) +{ + struct ceph_inode_info *ci; + struct inode *lastinode = NULL; + struct ceph_snap_realm *child; + + dout("queue_realm_cap_snaps %p %llx inodes\n", realm, realm->ino); + + spin_lock(&realm->inodes_with_caps_lock); + list_for_each_entry(ci, &realm->inodes_with_caps, + i_snap_realm_item) { + struct inode *inode = igrab(&ci->vfs_inode); + if (!inode) + continue; + spin_unlock(&realm->inodes_with_caps_lock); + if (lastinode) + iput(lastinode); + lastinode = inode; + ceph_queue_cap_snap(ci); + spin_lock(&realm->inodes_with_caps_lock); + } + spin_unlock(&realm->inodes_with_caps_lock); + if (lastinode) + iput(lastinode); + + dout("queue_realm_cap_snaps %p %llx children\n", realm, realm->ino); + list_for_each_entry(child, &realm->children, child_item) + queue_realm_cap_snaps(child); + + dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino); +} /* * Parse and apply a snapblob "snap trace" from the MDS. This specifies @@ -598,29 +633,8 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, * * ...unless it's a snap deletion! */ - if (!deletion) { - struct ceph_inode_info *ci; - struct inode *lastinode = NULL; - - spin_lock(&realm->inodes_with_caps_lock); - list_for_each_entry(ci, &realm->inodes_with_caps, - i_snap_realm_item) { - struct inode *inode = igrab(&ci->vfs_inode); - if (!inode) - continue; - spin_unlock(&realm->inodes_with_caps_lock); - if (lastinode) - iput(lastinode); - lastinode = inode; - ceph_queue_cap_snap(ci); - spin_lock(&realm->inodes_with_caps_lock); - } - spin_unlock(&realm->inodes_with_caps_lock); - if (lastinode) - iput(lastinode); - dout("update_snap_trace cap_snaps queued\n"); - } - + if (!deletion) + queue_realm_cap_snaps(realm); } else { dout("update_snap_trace %llx %p seq %lld unchanged\n", realm->ino, realm, realm->seq);