diff options
Diffstat (limited to 'fs/ceph/snap.c')
-rw-r--r-- | fs/ceph/snap.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c index 190b6c4a6f2b..54b14de2e729 100644 --- a/fs/ceph/snap.c +++ b/fs/ceph/snap.c | |||
@@ -1,10 +1,12 @@ | |||
1 | #include "ceph_debug.h" | 1 | #include <linux/ceph/ceph_debug.h> |
2 | 2 | ||
3 | #include <linux/sort.h> | 3 | #include <linux/sort.h> |
4 | #include <linux/slab.h> | 4 | #include <linux/slab.h> |
5 | 5 | ||
6 | #include "super.h" | 6 | #include "super.h" |
7 | #include "decode.h" | 7 | #include "mds_client.h" |
8 | |||
9 | #include <linux/ceph/decode.h> | ||
8 | 10 | ||
9 | /* | 11 | /* |
10 | * Snapshots in ceph are driven in large part by cooperation from the | 12 | * Snapshots in ceph are driven in large part by cooperation from the |
@@ -204,7 +206,7 @@ void ceph_put_snap_realm(struct ceph_mds_client *mdsc, | |||
204 | up_write(&mdsc->snap_rwsem); | 206 | up_write(&mdsc->snap_rwsem); |
205 | } else { | 207 | } else { |
206 | spin_lock(&mdsc->snap_empty_lock); | 208 | spin_lock(&mdsc->snap_empty_lock); |
207 | list_add(&mdsc->snap_empty, &realm->empty_item); | 209 | list_add(&realm->empty_item, &mdsc->snap_empty); |
208 | spin_unlock(&mdsc->snap_empty_lock); | 210 | spin_unlock(&mdsc->snap_empty_lock); |
209 | } | 211 | } |
210 | } | 212 | } |
@@ -340,7 +342,7 @@ static int build_snap_context(struct ceph_snap_realm *realm) | |||
340 | num = 0; | 342 | num = 0; |
341 | snapc->seq = realm->seq; | 343 | snapc->seq = realm->seq; |
342 | if (parent) { | 344 | if (parent) { |
343 | /* include any of parent's snaps occuring _after_ my | 345 | /* include any of parent's snaps occurring _after_ my |
344 | parent became my parent */ | 346 | parent became my parent */ |
345 | for (i = 0; i < parent->cached_context->num_snaps; i++) | 347 | for (i = 0; i < parent->cached_context->num_snaps; i++) |
346 | if (parent->cached_context->snaps[i] >= | 348 | if (parent->cached_context->snaps[i] >= |
@@ -461,8 +463,8 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci) | |||
461 | 463 | ||
462 | dout("queue_cap_snap %p cap_snap %p queuing under %p\n", inode, | 464 | dout("queue_cap_snap %p cap_snap %p queuing under %p\n", inode, |
463 | capsnap, snapc); | 465 | capsnap, snapc); |
464 | igrab(inode); | 466 | ihold(inode); |
465 | 467 | ||
466 | atomic_set(&capsnap->nref, 1); | 468 | atomic_set(&capsnap->nref, 1); |
467 | capsnap->ci = ci; | 469 | capsnap->ci = ci; |
468 | INIT_LIST_HEAD(&capsnap->ci_item); | 470 | INIT_LIST_HEAD(&capsnap->ci_item); |
@@ -526,7 +528,7 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci, | |||
526 | struct ceph_cap_snap *capsnap) | 528 | struct ceph_cap_snap *capsnap) |
527 | { | 529 | { |
528 | struct inode *inode = &ci->vfs_inode; | 530 | struct inode *inode = &ci->vfs_inode; |
529 | struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc; | 531 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
530 | 532 | ||
531 | BUG_ON(capsnap->writing); | 533 | BUG_ON(capsnap->writing); |
532 | capsnap->size = inode->i_size; | 534 | capsnap->size = inode->i_size; |
@@ -582,10 +584,14 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm) | |||
582 | if (lastinode) | 584 | if (lastinode) |
583 | iput(lastinode); | 585 | iput(lastinode); |
584 | 586 | ||
585 | dout("queue_realm_cap_snaps %p %llx children\n", realm, realm->ino); | 587 | list_for_each_entry(child, &realm->children, child_item) { |
586 | list_for_each_entry(child, &realm->children, child_item) | 588 | dout("queue_realm_cap_snaps %p %llx queue child %p %llx\n", |
587 | queue_realm_cap_snaps(child); | 589 | realm, realm->ino, child, child->ino); |
590 | list_del_init(&child->dirty_item); | ||
591 | list_add(&child->dirty_item, &realm->dirty_item); | ||
592 | } | ||
588 | 593 | ||
594 | list_del_init(&realm->dirty_item); | ||
589 | dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino); | 595 | dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino); |
590 | } | 596 | } |
591 | 597 | ||
@@ -681,7 +687,9 @@ more: | |||
681 | * queue cap snaps _after_ we've built the new snap contexts, | 687 | * queue cap snaps _after_ we've built the new snap contexts, |
682 | * so that i_head_snapc can be set appropriately. | 688 | * so that i_head_snapc can be set appropriately. |
683 | */ | 689 | */ |
684 | list_for_each_entry(realm, &dirty_realms, dirty_item) { | 690 | while (!list_empty(&dirty_realms)) { |
691 | realm = list_first_entry(&dirty_realms, struct ceph_snap_realm, | ||
692 | dirty_item); | ||
685 | queue_realm_cap_snaps(realm); | 693 | queue_realm_cap_snaps(realm); |
686 | } | 694 | } |
687 | 695 | ||
@@ -714,7 +722,7 @@ static void flush_snaps(struct ceph_mds_client *mdsc) | |||
714 | ci = list_first_entry(&mdsc->snap_flush_list, | 722 | ci = list_first_entry(&mdsc->snap_flush_list, |
715 | struct ceph_inode_info, i_snap_flush_item); | 723 | struct ceph_inode_info, i_snap_flush_item); |
716 | inode = &ci->vfs_inode; | 724 | inode = &ci->vfs_inode; |
717 | igrab(inode); | 725 | ihold(inode); |
718 | spin_unlock(&mdsc->snap_flush_lock); | 726 | spin_unlock(&mdsc->snap_flush_lock); |
719 | spin_lock(&inode->i_lock); | 727 | spin_lock(&inode->i_lock); |
720 | __ceph_flush_snaps(ci, &session, 0); | 728 | __ceph_flush_snaps(ci, &session, 0); |
@@ -747,7 +755,7 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc, | |||
747 | struct ceph_mds_session *session, | 755 | struct ceph_mds_session *session, |
748 | struct ceph_msg *msg) | 756 | struct ceph_msg *msg) |
749 | { | 757 | { |
750 | struct super_block *sb = mdsc->client->sb; | 758 | struct super_block *sb = mdsc->fsc->sb; |
751 | int mds = session->s_mds; | 759 | int mds = session->s_mds; |
752 | u64 split; | 760 | u64 split; |
753 | int op; | 761 | int op; |