From: Yan, Zheng Date: Tue, 24 Jan 2017 02:02:32 +0000 (+0800) Subject: ceph: make sure flushing inode in proper session's cap_flushing list X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=00f06cba53f53f3f7be8ac4f9ba2c2f6a94bca6f;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git ceph: make sure flushing inode in proper session's cap_flushing list when flushing inode's auth cap changes, we need to move it into the new auth cap session's cap_flushing list Signed-off-by: Yan, Zheng --- diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index d941c48e8bff..ed8c7addce91 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -3410,6 +3410,7 @@ retry: tcap->implemented |= issued; if (cap == ci->i_auth_cap) ci->i_auth_cap = tcap; + if (!list_empty(&ci->i_cap_flush_list) && ci->i_auth_cap == tcap) { spin_lock(&mdsc->cap_dirty_lock); @@ -3423,9 +3424,18 @@ retry: } else if (tsession) { /* add placeholder for the export tagert */ int flag = (cap == ci->i_auth_cap) ? CEPH_CAP_FLAG_AUTH : 0; + tcap = new_cap; ceph_add_cap(inode, tsession, t_cap_id, -1, issued, 0, t_seq - 1, t_mseq, (u64)-1, flag, &new_cap); + if (!list_empty(&ci->i_cap_flush_list) && + ci->i_auth_cap == tcap) { + spin_lock(&mdsc->cap_dirty_lock); + list_move_tail(&ci->i_flushing_item, + &tcap->session->s_cap_flushing); + spin_unlock(&mdsc->cap_dirty_lock); + } + __ceph_remove_cap(cap, false); goto out_unlock; }