aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/snap.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/snap.c')
-rw-r--r--fs/ceph/snap.c34
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;