diff --git a/mm/filemap.c b/mm/filemap.c index 657bcd887fdb..b76a13395299 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3754,11 +3754,15 @@ static struct folio *do_read_cache_folio(struct address_space *mapping, if (!folio) return ERR_PTR(-ENOMEM); err = filemap_add_folio(mapping, folio, index, gfp); + printk("err: %d, folio: %p, in: %p, %s\n", err, folio, mapping->host, __func__); if (unlikely(err)) { folio_put(folio); if (err == -EEXIST) goto repeat; /* Presumably ENOMEM for xarray node */ + void *kaddr = kmap_local_folio(folio, 0); + memset(kaddr, 0, folio_size(folio)); + kunmap_local(kaddr); return ERR_PTR(err); } @@ -3791,6 +3795,7 @@ static struct folio *do_read_cache_folio(struct address_space *mapping, folio_put(folio); if (err == AOP_TRUNCATED_PAGE) goto repeat; + printk("err: %d, folio: %p, %s\n", err, folio, __func__); return ERR_PTR(err); } diff --git a/fs/namei.c b/fs/namei.c index 3a4c40e12f78..3f72aa8d604d 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -5272,6 +5272,8 @@ const char *page_get_link(struct dentry *dentry, struct inode *inode, page = read_mapping_page(mapping, 0, NULL); if (IS_ERR(page)) return (char*)page; + else if (IS_ERR(page_folio(page))) + return (char*)page_folio(page); } set_delayed_call(callback, page_put_link, page); BUG_ON(mapping_gfp_mask(mapping) & __GFP_HIGHMEM);