2634
2635
struct ceph_mds_session *session,
2635
2636
int *open_target_sessions)
2638
struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
2637
2639
struct ceph_inode_info *ci = ceph_inode(inode);
2638
2640
int mds = session->s_mds;
2639
2641
unsigned mseq = le32_to_cpu(ex->migrate_seq);
2670
2672
* export targets, so that we get the matching IMPORT
2672
2674
*open_target_sessions = 1;
2677
* we can't flush dirty caps that we've seen the
2678
* EXPORT but no IMPORT for
2680
spin_lock(&mdsc->cap_dirty_lock);
2681
if (!list_empty(&ci->i_dirty_item)) {
2682
dout(" moving %p to cap_dirty_migrating\n",
2684
list_move(&ci->i_dirty_item,
2685
&mdsc->cap_dirty_migrating);
2687
spin_unlock(&mdsc->cap_dirty_lock);
2674
2689
__ceph_remove_cap(cap);
2707
2722
ci->i_cap_exporting_issued = 0;
2708
2723
ci->i_cap_exporting_mseq = 0;
2709
2724
ci->i_cap_exporting_mds = -1;
2726
spin_lock(&mdsc->cap_dirty_lock);
2727
if (!list_empty(&ci->i_dirty_item)) {
2728
dout(" moving %p back to cap_dirty\n", inode);
2729
list_move(&ci->i_dirty_item, &mdsc->cap_dirty);
2731
spin_unlock(&mdsc->cap_dirty_lock);
2711
2733
dout("handle_cap_import inode %p ci %p mds%d mseq %d\n",
2712
2734
inode, ci, mds, mseq);
2911
2933
void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
2913
struct ceph_inode_info *ci, *nci = NULL;
2914
struct inode *inode, *ninode = NULL;
2915
struct list_head *p, *n;
2935
struct ceph_inode_info *ci;
2936
struct inode *inode;
2917
2938
dout("flush_dirty_caps\n");
2918
2939
spin_lock(&mdsc->cap_dirty_lock);
2919
list_for_each_safe(p, n, &mdsc->cap_dirty) {
2923
ci->i_ceph_flags &= ~CEPH_I_NOFLUSH;
2924
dout("flush_dirty_caps inode %p (was next inode)\n",
2927
ci = list_entry(p, struct ceph_inode_info,
2929
inode = igrab(&ci->vfs_inode);
2931
dout("flush_dirty_caps inode %p\n", inode);
2933
if (n != &mdsc->cap_dirty) {
2934
nci = list_entry(n, struct ceph_inode_info,
2936
ninode = igrab(&nci->vfs_inode);
2938
nci->i_ceph_flags |= CEPH_I_NOFLUSH;
2939
dout("flush_dirty_caps next inode %p, noflush\n",
2940
while (!list_empty(&mdsc->cap_dirty)) {
2941
ci = list_first_entry(&mdsc->cap_dirty, struct ceph_inode_info,
2943
inode = &ci->vfs_inode;
2945
dout("flush_dirty_caps %p\n", inode);
2945
2946
spin_unlock(&mdsc->cap_dirty_lock);
2947
ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_FLUSH,
2947
ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_FLUSH, NULL);
2951
2949
spin_lock(&mdsc->cap_dirty_lock);
2953
2951
spin_unlock(&mdsc->cap_dirty_lock);
2952
dout("flush_dirty_caps done\n");