• Zhaoyang Huang's avatar
    fs: nfs: fix missing refcnt by replacing folio_set_private by folio_attach_private · 03e02b94
    Zhaoyang Huang authored
    
    
    This patch is inspired by a code review of fs codes which aims at
    folio's extra refcnt that could introduce unwanted behavious when
    judging refcnt, such as[1].That is, the folio passed to
    mapping_evict_folio carries the refcnts from find_lock_entries,
    page_cache, corresponding to PTEs and folio's private if has. However,
    current code doesn't take the refcnt for folio's private which could
    have mapping_evict_folio miss the one to only PTE and lead to
    call filemap_release_folio wrongly.
    
    [1]
    long mapping_evict_folio(struct address_space *mapping, struct folio *folio)
    {
    ...
    //current code will misjudge here if there is one pte on the folio which
    is be deemed as the one as folio's private
            if (folio_ref_count(folio) >
                            folio_nr_pages(folio) + folio_has_private(folio) + 1)
                    return 0;
            if (!filemap_release_folio(folio, 0))
                    return 0;
    
            return remove_mapping(mapping, folio);
    }
    Signed-off-by: default avatarZhaoyang Huang <zhaoyang.huang@unisoc.com>
    Signed-off-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
    03e02b94
write.c 57.6 KB