Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ceph: properly mark empty directory as complete

ceph_add_cap() calls __check_cap_issue(), which clears directory
inode' complete flag. so we should set the complete flag for empty
directory should be set after calling ceph_add_cap().

Signed-off-by: Yan, Zheng <zyan@redhat.com>

authored by

Yan, Zheng and committed by
Ilya Dryomov
2f92b3d0 a6a5ce4f

+15 -14
+15 -14
fs/ceph/inode.c
··· 840 840 ceph_vinop(inode), inode->i_mode); 841 841 } 842 842 843 - /* set dir completion flag? */ 844 - if (S_ISDIR(inode->i_mode) && 845 - ci->i_files == 0 && ci->i_subdirs == 0 && 846 - ceph_snap(inode) == CEPH_NOSNAP && 847 - (le32_to_cpu(info->cap.caps) & CEPH_CAP_FILE_SHARED) && 848 - (issued & CEPH_CAP_FILE_EXCL) == 0 && 849 - !__ceph_dir_is_complete(ci)) { 850 - dout(" marking %p complete (empty)\n", inode); 851 - __ceph_dir_set_complete(ci, atomic_read(&ci->i_release_count), 852 - ci->i_ordered_count); 853 - } 854 - 855 843 /* were we issued a capability? */ 856 844 if (info->cap.caps) { 857 845 if (ceph_snap(inode) == CEPH_NOSNAP) { 846 + unsigned caps = le32_to_cpu(info->cap.caps); 858 847 ceph_add_cap(inode, session, 859 848 le64_to_cpu(info->cap.cap_id), 860 - cap_fmode, 861 - le32_to_cpu(info->cap.caps), 849 + cap_fmode, caps, 862 850 le32_to_cpu(info->cap.wanted), 863 851 le32_to_cpu(info->cap.seq), 864 852 le32_to_cpu(info->cap.mseq), 865 853 le64_to_cpu(info->cap.realm), 866 854 info->cap.flags, &new_cap); 855 + 856 + /* set dir completion flag? */ 857 + if (S_ISDIR(inode->i_mode) && 858 + ci->i_files == 0 && ci->i_subdirs == 0 && 859 + (caps & CEPH_CAP_FILE_SHARED) && 860 + (issued & CEPH_CAP_FILE_EXCL) == 0 && 861 + !__ceph_dir_is_complete(ci)) { 862 + dout(" marking %p complete (empty)\n", inode); 863 + __ceph_dir_set_complete(ci, 864 + atomic_read(&ci->i_release_count), 865 + ci->i_ordered_count); 866 + } 867 + 867 868 wake = true; 868 869 } else { 869 870 dout(" %p got snap_caps %s\n", inode,