* [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
@ 2026-02-05 9:49 Sun Jian
2026-02-07 11:58 ` kernel test robot
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Sun Jian @ 2026-02-05 9:49 UTC (permalink / raw)
To: Konstantin Komarov; +Cc: ntfs3, linux-kernel, Sun Jian
ntfs_lock_new_page() currently returns a struct page * but it primarily
operates on folios via __filemap_get_folio(). Convert it to return a
struct folio * and use folio_alloc() + __folio_set_locked() for the
temporary page used to avoid data corruption during decompression.
When the cached folio is not uptodate, keep the existing behavior by
calling folio_file_page() and converting the returned page back to a
folio. Defensively handle error pointers from folio_file_page().
ni_readpage_cmpr() is updated to consume the folio return value while
keeping the existing page array and cleanup logic unchanged.
Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
---
fs/ntfs3/frecord.c | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 641ddaf8d4a0..a23aaf34f001 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -2022,27 +2022,31 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
return err;
}
-static struct page *ntfs_lock_new_page(struct address_space *mapping,
- pgoff_t index, gfp_t gfp)
+static struct folio *ntfs_lock_new_page(struct address_space *mapping,
+ pgoff_t index, gfp_t gfp)
{
struct folio *folio = __filemap_get_folio(mapping, index,
FGP_LOCK | FGP_ACCESSED | FGP_CREAT, gfp);
- struct page *page;
if (IS_ERR(folio))
- return ERR_CAST(folio);
+ return folio;
- if (!folio_test_uptodate(folio))
- return folio_file_page(folio, index);
+ if (!folio_test_uptodate(folio)) {
+ struct page *page = folio_file_page(folio, index);
+
+ if (IS_ERR(page))
+ return ERR_CAST(page);
+ return page_folio(page);
+ }
/* Use a temporary page to avoid data corruption */
folio_unlock(folio);
folio_put(folio);
- page = alloc_page(gfp);
- if (!page)
+ folio = folio_alloc(gfp, 0);
+ if (!folio)
return ERR_PTR(-ENOMEM);
- __SetPageLocked(page);
- return page;
+ __folio_set_locked(folio);
+ return folio;
}
/*
@@ -2064,6 +2068,7 @@ int ni_readpage_cmpr(struct ntfs_inode *ni, struct folio *folio)
u32 i, idx, frame_size, pages_per_frame;
gfp_t gfp_mask;
struct page *pg;
+ struct folio *f;
if (vbo >= i_size_read(&ni->vfs_inode)) {
folio_zero_range(folio, 0, folio_size(folio));
@@ -2099,12 +2104,12 @@ int ni_readpage_cmpr(struct ntfs_inode *ni, struct folio *folio)
if (i == idx)
continue;
- pg = ntfs_lock_new_page(mapping, index, gfp_mask);
- if (IS_ERR(pg)) {
- err = PTR_ERR(pg);
+ f = ntfs_lock_new_page(mapping, index, gfp_mask);
+ if (IS_ERR(f)) {
+ err = PTR_ERR(f);
goto out1;
}
- pages[i] = pg;
+ pages[i] = &f->page;
}
err = ni_read_frame(ni, frame_vbo, pages, pages_per_frame, 0);
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
2026-02-05 9:49 [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page() Sun Jian
@ 2026-02-07 11:58 ` kernel test robot
2026-02-07 12:08 ` kernel test robot
2026-02-07 14:45 ` [PATCH v2] " Sun Jian
2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-02-07 11:58 UTC (permalink / raw)
To: Sun Jian, Konstantin Komarov; +Cc: oe-kbuild-all, ntfs3, linux-kernel, Sun Jian
Hi Sun,
kernel test robot noticed the following build errors:
[auto build test ERROR on brauner-vfs/vfs.all]
[also build test ERROR on linus/master v6.19-rc8]
[cannot apply to next-20260205]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sun-Jian/fs-ntfs3-return-folios-from-ntfs_lock_new_page/20260205-175053
base: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
patch link: https://lore.kernel.org/r/20260205094934.10500-1-sun.jian.kdev%40gmail.com
patch subject: [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
config: i386-randconfig-013-20260207 (https://download.01.org/0day-ci/archive/20260207/202602071921.nGIiI1J5-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.4.0-5) 12.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260207/202602071921.nGIiI1J5-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602071921.nGIiI1J5-lkp@intel.com/
All errors (new ones prefixed by >>):
fs/ntfs3/frecord.c: In function 'ni_decompress_file':
>> fs/ntfs3/frecord.c:2200:28: error: assignment to 'struct page *' from incompatible pointer type 'struct folio *' [-Werror=incompatible-pointer-types]
2200 | pg = ntfs_lock_new_page(mapping, index, gfp_mask);
| ^
cc1: some warnings being treated as errors
vim +2200 fs/ntfs3/frecord.c
4342306f0f0d5f Konstantin Komarov 2021-08-13 2133
4342306f0f0d5f Konstantin Komarov 2021-08-13 2134 #ifdef CONFIG_NTFS3_LZX_XPRESS
4342306f0f0d5f Konstantin Komarov 2021-08-13 2135 /*
e8b8e97f91b80f Kari Argillander 2021-08-03 2136 * ni_decompress_file - Decompress LZX/Xpress compressed file.
e8b8e97f91b80f Kari Argillander 2021-08-03 2137 *
e8b8e97f91b80f Kari Argillander 2021-08-03 2138 * Remove ATTR_DATA::WofCompressedData.
e8b8e97f91b80f Kari Argillander 2021-08-03 2139 * Remove ATTR_REPARSE.
4342306f0f0d5f Konstantin Komarov 2021-08-13 2140 */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2141 int ni_decompress_file(struct ntfs_inode *ni)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2142 {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2143 struct ntfs_sb_info *sbi = ni->mi.sbi;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2144 struct inode *inode = &ni->vfs_inode;
4fd6c08a16d7f1 Konstantin Komarov 2024-01-26 2145 loff_t i_size = i_size_read(inode);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2146 struct address_space *mapping = inode->i_mapping;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2147 gfp_t gfp_mask = mapping_gfp_mask(mapping);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2148 struct page **pages = NULL;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2149 struct ATTR_LIST_ENTRY *le;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2150 struct ATTRIB *attr;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2151 CLST vcn, cend, lcn, clen, end;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2152 pgoff_t index;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2153 u64 vbo;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2154 u8 frame_bits;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2155 u32 i, frame_size, pages_per_frame, bytes;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2156 struct mft_inode *mi;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2157 int err;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2158
e8b8e97f91b80f Kari Argillander 2021-08-03 2159 /* Clusters for decompressed data. */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2160 cend = bytes_to_cluster(sbi, i_size);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2161
4342306f0f0d5f Konstantin Komarov 2021-08-13 2162 if (!i_size)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2163 goto remove_wof;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2164
e8b8e97f91b80f Kari Argillander 2021-08-03 2165 /* Check in advance. */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2166 if (cend > wnd_zeroes(&sbi->used.bitmap)) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2167 err = -ENOSPC;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2168 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2169 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2170
4342306f0f0d5f Konstantin Komarov 2021-08-13 2171 frame_bits = ni_ext_compress_bits(ni);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2172 frame_size = 1u << frame_bits;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2173 pages_per_frame = frame_size >> PAGE_SHIFT;
345482bc431f64 Kari Argillander 2021-08-24 2174 pages = kcalloc(pages_per_frame, sizeof(struct page *), GFP_NOFS);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2175 if (!pages) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2176 err = -ENOMEM;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2177 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2178 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2179
4342306f0f0d5f Konstantin Komarov 2021-08-13 2180 /*
e8b8e97f91b80f Kari Argillander 2021-08-03 2181 * Step 1: Decompress data and copy to new allocated clusters.
4342306f0f0d5f Konstantin Komarov 2021-08-13 2182 */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2183 index = 0;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2184 for (vbo = 0; vbo < i_size; vbo += bytes) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2185 bool new;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2186
f35590ee26f572 Konstantin Komarov 2025-10-14 2187 bytes = vbo + frame_size > i_size ? (i_size - vbo) : frame_size;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2188 end = bytes_to_cluster(sbi, vbo + bytes);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2189
4342306f0f0d5f Konstantin Komarov 2021-08-13 2190 for (vcn = vbo >> sbi->cluster_bits; vcn < end; vcn += clen) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2191 err = attr_data_get_block(ni, vcn, cend - vcn, &lcn,
c380b52f6c5702 Konstantin Komarov 2022-10-07 2192 &clen, &new, false);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2193 if (err)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2194 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2195 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2196
4342306f0f0d5f Konstantin Komarov 2021-08-13 2197 for (i = 0; i < pages_per_frame; i++, index++) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2198 struct page *pg;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2199
68f6bd128e75a0 Matthew Wilcox (Oracle 2025-07-18 @2200) pg = ntfs_lock_new_page(mapping, index, gfp_mask);
68f6bd128e75a0 Matthew Wilcox (Oracle 2025-07-18 2201) if (IS_ERR(pg)) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2202 while (i--) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2203 unlock_page(pages[i]);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2204 put_page(pages[i]);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2205 }
68f6bd128e75a0 Matthew Wilcox (Oracle 2025-07-18 2206) err = PTR_ERR(pg);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2207 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2208 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2209 pages[i] = pg;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2210 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2211
f35590ee26f572 Konstantin Komarov 2025-10-14 2212 err = ni_read_frame(ni, vbo, pages, pages_per_frame, 1);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2213
4342306f0f0d5f Konstantin Komarov 2021-08-13 2214 for (i = 0; i < pages_per_frame; i++) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2215 unlock_page(pages[i]);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2216 put_page(pages[i]);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2217 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2218
4342306f0f0d5f Konstantin Komarov 2021-08-13 2219 if (err)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2220 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2221
4342306f0f0d5f Konstantin Komarov 2021-08-13 2222 cond_resched();
4342306f0f0d5f Konstantin Komarov 2021-08-13 2223 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2224
4342306f0f0d5f Konstantin Komarov 2021-08-13 2225 remove_wof:
4342306f0f0d5f Konstantin Komarov 2021-08-13 2226 /*
e8b8e97f91b80f Kari Argillander 2021-08-03 2227 * Step 2: Deallocate attributes ATTR_DATA::WofCompressedData
e8b8e97f91b80f Kari Argillander 2021-08-03 2228 * and ATTR_REPARSE.
4342306f0f0d5f Konstantin Komarov 2021-08-13 2229 */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2230 attr = NULL;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2231 le = NULL;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2232 while ((attr = ni_enum_attr_ex(ni, attr, &le, NULL))) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2233 CLST svcn, evcn;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2234 u32 asize, roff;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2235
4342306f0f0d5f Konstantin Komarov 2021-08-13 2236 if (attr->type == ATTR_REPARSE) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2237 struct MFT_REF ref;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2238
4342306f0f0d5f Konstantin Komarov 2021-08-13 2239 mi_get_ref(&ni->mi, &ref);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2240 ntfs_remove_reparse(sbi, 0, &ref);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2241 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2242
4342306f0f0d5f Konstantin Komarov 2021-08-13 2243 if (!attr->non_res)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2244 continue;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2245
4342306f0f0d5f Konstantin Komarov 2021-08-13 2246 if (attr->type != ATTR_REPARSE &&
4342306f0f0d5f Konstantin Komarov 2021-08-13 2247 (attr->type != ATTR_DATA ||
4342306f0f0d5f Konstantin Komarov 2021-08-13 2248 attr->name_len != ARRAY_SIZE(WOF_NAME) ||
4342306f0f0d5f Konstantin Komarov 2021-08-13 2249 memcmp(attr_name(attr), WOF_NAME, sizeof(WOF_NAME))))
4342306f0f0d5f Konstantin Komarov 2021-08-13 2250 continue;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2251
4342306f0f0d5f Konstantin Komarov 2021-08-13 2252 svcn = le64_to_cpu(attr->nres.svcn);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2253 evcn = le64_to_cpu(attr->nres.evcn);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2254
4342306f0f0d5f Konstantin Komarov 2021-08-13 2255 if (evcn + 1 <= svcn)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2256 continue;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2257
4342306f0f0d5f Konstantin Komarov 2021-08-13 2258 asize = le32_to_cpu(attr->size);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2259 roff = le16_to_cpu(attr->nres.run_off);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2260
6db620863f8528 Edward Lo 2022-08-06 2261 if (roff > asize) {
6db620863f8528 Edward Lo 2022-08-06 2262 err = -EINVAL;
6db620863f8528 Edward Lo 2022-08-06 2263 goto out;
6db620863f8528 Edward Lo 2022-08-06 2264 }
6db620863f8528 Edward Lo 2022-08-06 2265
e8b8e97f91b80f Kari Argillander 2021-08-03 2266 /*run==1 Means unpack and deallocate. */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2267 run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
4342306f0f0d5f Konstantin Komarov 2021-08-13 2268 Add2Ptr(attr, roff), asize - roff);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2269 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2270
4342306f0f0d5f Konstantin Komarov 2021-08-13 2271 /*
e8b8e97f91b80f Kari Argillander 2021-08-03 2272 * Step 3: Remove attribute ATTR_DATA::WofCompressedData.
4342306f0f0d5f Konstantin Komarov 2021-08-13 2273 */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2274 err = ni_remove_attr(ni, ATTR_DATA, WOF_NAME, ARRAY_SIZE(WOF_NAME),
4342306f0f0d5f Konstantin Komarov 2021-08-13 2275 false, NULL);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2276 if (err)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2277 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2278
4342306f0f0d5f Konstantin Komarov 2021-08-13 2279 /*
e8b8e97f91b80f Kari Argillander 2021-08-03 2280 * Step 4: Remove ATTR_REPARSE.
4342306f0f0d5f Konstantin Komarov 2021-08-13 2281 */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2282 err = ni_remove_attr(ni, ATTR_REPARSE, NULL, 0, false, NULL);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2283 if (err)
4342306f0f0d5f Konstantin Komarov 2021-08-13 2284 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2285
4342306f0f0d5f Konstantin Komarov 2021-08-13 2286 /*
e8b8e97f91b80f Kari Argillander 2021-08-03 2287 * Step 5: Remove sparse flag from data attribute.
4342306f0f0d5f Konstantin Komarov 2021-08-13 2288 */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2289 attr = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL, &mi);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2290 if (!attr) {
4342306f0f0d5f Konstantin Komarov 2021-08-13 2291 err = -EINVAL;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2292 goto out;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2293 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2294
4342306f0f0d5f Konstantin Komarov 2021-08-13 2295 if (attr->non_res && is_attr_sparsed(attr)) {
d3624466b56dd5 Konstantin Komarov 2021-08-31 2296 /* Sparsed attribute header is 8 bytes bigger than normal. */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2297 struct MFT_REC *rec = mi->mrec;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2298 u32 used = le32_to_cpu(rec->used);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2299 u32 asize = le32_to_cpu(attr->size);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2300 u16 roff = le16_to_cpu(attr->nres.run_off);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2301 char *rbuf = Add2Ptr(attr, roff);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2302
4342306f0f0d5f Konstantin Komarov 2021-08-13 2303 memmove(rbuf - 8, rbuf, used - PtrOffset(rec, rbuf));
4342306f0f0d5f Konstantin Komarov 2021-08-13 2304 attr->size = cpu_to_le32(asize - 8);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2305 attr->flags &= ~ATTR_FLAG_SPARSED;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2306 attr->nres.run_off = cpu_to_le16(roff - 8);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2307 attr->nres.c_unit = 0;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2308 rec->used = cpu_to_le32(used - 8);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2309 mi->dirty = true;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2310 ni->std_fa &= ~(FILE_ATTRIBUTE_SPARSE_FILE |
4342306f0f0d5f Konstantin Komarov 2021-08-13 2311 FILE_ATTRIBUTE_REPARSE_POINT);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2312
4342306f0f0d5f Konstantin Komarov 2021-08-13 2313 mark_inode_dirty(inode);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2314 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2315
e8b8e97f91b80f Kari Argillander 2021-08-03 2316 /* Clear cached flag. */
4342306f0f0d5f Konstantin Komarov 2021-08-13 2317 ni->ni_flags &= ~NI_FLAG_COMPRESSED_MASK;
c091354d6bf60e Matthew Wilcox (Oracle 2024-04-22 2318) if (ni->file.offs_folio) {
c091354d6bf60e Matthew Wilcox (Oracle 2024-04-22 2319) folio_put(ni->file.offs_folio);
c091354d6bf60e Matthew Wilcox (Oracle 2024-04-22 2320) ni->file.offs_folio = NULL;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2321 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2322 mapping->a_ops = &ntfs_aops;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2323
4342306f0f0d5f Konstantin Komarov 2021-08-13 2324 out:
195c52bdd5d5ec Kari Argillander 2021-08-24 2325 kfree(pages);
c12df45ee69011 Konstantin Komarov 2022-07-13 2326 if (err)
c12df45ee69011 Konstantin Komarov 2022-07-13 2327 _ntfs_bad_inode(inode);
4342306f0f0d5f Konstantin Komarov 2021-08-13 2328
4342306f0f0d5f Konstantin Komarov 2021-08-13 2329 return err;
4342306f0f0d5f Konstantin Komarov 2021-08-13 2330 }
4342306f0f0d5f Konstantin Komarov 2021-08-13 2331
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
2026-02-05 9:49 [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page() Sun Jian
2026-02-07 11:58 ` kernel test robot
@ 2026-02-07 12:08 ` kernel test robot
2026-02-07 14:59 ` sun jian
2026-02-07 14:45 ` [PATCH v2] " Sun Jian
2 siblings, 1 reply; 6+ messages in thread
From: kernel test robot @ 2026-02-07 12:08 UTC (permalink / raw)
To: Sun Jian, Konstantin Komarov
Cc: llvm, oe-kbuild-all, ntfs3, linux-kernel, Sun Jian
Hi Sun,
kernel test robot noticed the following build errors:
[auto build test ERROR on brauner-vfs/vfs.all]
[also build test ERROR on linus/master v6.19-rc8]
[cannot apply to next-20260205]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sun-Jian/fs-ntfs3-return-folios-from-ntfs_lock_new_page/20260205-175053
base: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
patch link: https://lore.kernel.org/r/20260205094934.10500-1-sun.jian.kdev%40gmail.com
patch subject: [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
config: hexagon-randconfig-001-20260207 (https://download.01.org/0day-ci/archive/20260207/202602072013.jwrURE2e-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260207/202602072013.jwrURE2e-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202602072013.jwrURE2e-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/ntfs3/frecord.c:2200:7: error: incompatible pointer types assigning to 'struct page *' from 'struct folio *' [-Wincompatible-pointer-types]
2200 | pg = ntfs_lock_new_page(mapping, index, gfp_mask);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
vim +2200 fs/ntfs3/frecord.c
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2133
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2134 #ifdef CONFIG_NTFS3_LZX_XPRESS
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2135 /*
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2136 * ni_decompress_file - Decompress LZX/Xpress compressed file.
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2137 *
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2138 * Remove ATTR_DATA::WofCompressedData.
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2139 * Remove ATTR_REPARSE.
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2140 */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2141 int ni_decompress_file(struct ntfs_inode *ni)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2142 {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2143 struct ntfs_sb_info *sbi = ni->mi.sbi;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2144 struct inode *inode = &ni->vfs_inode;
4fd6c08a16d7f1b Konstantin Komarov 2024-01-26 2145 loff_t i_size = i_size_read(inode);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2146 struct address_space *mapping = inode->i_mapping;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2147 gfp_t gfp_mask = mapping_gfp_mask(mapping);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2148 struct page **pages = NULL;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2149 struct ATTR_LIST_ENTRY *le;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2150 struct ATTRIB *attr;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2151 CLST vcn, cend, lcn, clen, end;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2152 pgoff_t index;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2153 u64 vbo;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2154 u8 frame_bits;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2155 u32 i, frame_size, pages_per_frame, bytes;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2156 struct mft_inode *mi;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2157 int err;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2158
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2159 /* Clusters for decompressed data. */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2160 cend = bytes_to_cluster(sbi, i_size);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2161
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2162 if (!i_size)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2163 goto remove_wof;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2164
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2165 /* Check in advance. */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2166 if (cend > wnd_zeroes(&sbi->used.bitmap)) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2167 err = -ENOSPC;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2168 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2169 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2170
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2171 frame_bits = ni_ext_compress_bits(ni);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2172 frame_size = 1u << frame_bits;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2173 pages_per_frame = frame_size >> PAGE_SHIFT;
345482bc431f649 Kari Argillander 2021-08-24 2174 pages = kcalloc(pages_per_frame, sizeof(struct page *), GFP_NOFS);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2175 if (!pages) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2176 err = -ENOMEM;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2177 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2178 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2179
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2180 /*
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2181 * Step 1: Decompress data and copy to new allocated clusters.
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2182 */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2183 index = 0;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2184 for (vbo = 0; vbo < i_size; vbo += bytes) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2185 bool new;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2186
f35590ee26f5722 Konstantin Komarov 2025-10-14 2187 bytes = vbo + frame_size > i_size ? (i_size - vbo) : frame_size;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2188 end = bytes_to_cluster(sbi, vbo + bytes);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2189
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2190 for (vcn = vbo >> sbi->cluster_bits; vcn < end; vcn += clen) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2191 err = attr_data_get_block(ni, vcn, cend - vcn, &lcn,
c380b52f6c5702c Konstantin Komarov 2022-10-07 2192 &clen, &new, false);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2193 if (err)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2194 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2195 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2196
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2197 for (i = 0; i < pages_per_frame; i++, index++) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2198 struct page *pg;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2199
68f6bd128e75a03 Matthew Wilcox (Oracle 2025-07-18 @2200) pg = ntfs_lock_new_page(mapping, index, gfp_mask);
68f6bd128e75a03 Matthew Wilcox (Oracle 2025-07-18 2201) if (IS_ERR(pg)) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2202 while (i--) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2203 unlock_page(pages[i]);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2204 put_page(pages[i]);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2205 }
68f6bd128e75a03 Matthew Wilcox (Oracle 2025-07-18 2206) err = PTR_ERR(pg);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2207 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2208 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2209 pages[i] = pg;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2210 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2211
f35590ee26f5722 Konstantin Komarov 2025-10-14 2212 err = ni_read_frame(ni, vbo, pages, pages_per_frame, 1);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2213
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2214 for (i = 0; i < pages_per_frame; i++) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2215 unlock_page(pages[i]);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2216 put_page(pages[i]);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2217 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2218
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2219 if (err)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2220 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2221
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2222 cond_resched();
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2223 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2224
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2225 remove_wof:
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2226 /*
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2227 * Step 2: Deallocate attributes ATTR_DATA::WofCompressedData
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2228 * and ATTR_REPARSE.
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2229 */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2230 attr = NULL;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2231 le = NULL;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2232 while ((attr = ni_enum_attr_ex(ni, attr, &le, NULL))) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2233 CLST svcn, evcn;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2234 u32 asize, roff;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2235
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2236 if (attr->type == ATTR_REPARSE) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2237 struct MFT_REF ref;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2238
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2239 mi_get_ref(&ni->mi, &ref);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2240 ntfs_remove_reparse(sbi, 0, &ref);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2241 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2242
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2243 if (!attr->non_res)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2244 continue;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2245
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2246 if (attr->type != ATTR_REPARSE &&
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2247 (attr->type != ATTR_DATA ||
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2248 attr->name_len != ARRAY_SIZE(WOF_NAME) ||
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2249 memcmp(attr_name(attr), WOF_NAME, sizeof(WOF_NAME))))
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2250 continue;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2251
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2252 svcn = le64_to_cpu(attr->nres.svcn);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2253 evcn = le64_to_cpu(attr->nres.evcn);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2254
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2255 if (evcn + 1 <= svcn)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2256 continue;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2257
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2258 asize = le32_to_cpu(attr->size);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2259 roff = le16_to_cpu(attr->nres.run_off);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2260
6db620863f8528e Edward Lo 2022-08-06 2261 if (roff > asize) {
6db620863f8528e Edward Lo 2022-08-06 2262 err = -EINVAL;
6db620863f8528e Edward Lo 2022-08-06 2263 goto out;
6db620863f8528e Edward Lo 2022-08-06 2264 }
6db620863f8528e Edward Lo 2022-08-06 2265
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2266 /*run==1 Means unpack and deallocate. */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2267 run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2268 Add2Ptr(attr, roff), asize - roff);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2269 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2270
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2271 /*
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2272 * Step 3: Remove attribute ATTR_DATA::WofCompressedData.
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2273 */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2274 err = ni_remove_attr(ni, ATTR_DATA, WOF_NAME, ARRAY_SIZE(WOF_NAME),
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2275 false, NULL);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2276 if (err)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2277 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2278
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2279 /*
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2280 * Step 4: Remove ATTR_REPARSE.
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2281 */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2282 err = ni_remove_attr(ni, ATTR_REPARSE, NULL, 0, false, NULL);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2283 if (err)
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2284 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2285
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2286 /*
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2287 * Step 5: Remove sparse flag from data attribute.
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2288 */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2289 attr = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL, &mi);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2290 if (!attr) {
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2291 err = -EINVAL;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2292 goto out;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2293 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2294
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2295 if (attr->non_res && is_attr_sparsed(attr)) {
d3624466b56dd5b Konstantin Komarov 2021-08-31 2296 /* Sparsed attribute header is 8 bytes bigger than normal. */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2297 struct MFT_REC *rec = mi->mrec;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2298 u32 used = le32_to_cpu(rec->used);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2299 u32 asize = le32_to_cpu(attr->size);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2300 u16 roff = le16_to_cpu(attr->nres.run_off);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2301 char *rbuf = Add2Ptr(attr, roff);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2302
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2303 memmove(rbuf - 8, rbuf, used - PtrOffset(rec, rbuf));
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2304 attr->size = cpu_to_le32(asize - 8);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2305 attr->flags &= ~ATTR_FLAG_SPARSED;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2306 attr->nres.run_off = cpu_to_le16(roff - 8);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2307 attr->nres.c_unit = 0;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2308 rec->used = cpu_to_le32(used - 8);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2309 mi->dirty = true;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2310 ni->std_fa &= ~(FILE_ATTRIBUTE_SPARSE_FILE |
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2311 FILE_ATTRIBUTE_REPARSE_POINT);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2312
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2313 mark_inode_dirty(inode);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2314 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2315
e8b8e97f91b80f0 Kari Argillander 2021-08-03 2316 /* Clear cached flag. */
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2317 ni->ni_flags &= ~NI_FLAG_COMPRESSED_MASK;
c091354d6bf60ec Matthew Wilcox (Oracle 2024-04-22 2318) if (ni->file.offs_folio) {
c091354d6bf60ec Matthew Wilcox (Oracle 2024-04-22 2319) folio_put(ni->file.offs_folio);
c091354d6bf60ec Matthew Wilcox (Oracle 2024-04-22 2320) ni->file.offs_folio = NULL;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2321 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2322 mapping->a_ops = &ntfs_aops;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2323
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2324 out:
195c52bdd5d5ecf Kari Argillander 2021-08-24 2325 kfree(pages);
c12df45ee690112 Konstantin Komarov 2022-07-13 2326 if (err)
c12df45ee690112 Konstantin Komarov 2022-07-13 2327 _ntfs_bad_inode(inode);
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2328
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2329 return err;
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2330 }
4342306f0f0d5ff Konstantin Komarov 2021-08-13 2331
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2] fs/ntfs3: return folios from ntfs_lock_new_page()
2026-02-05 9:49 [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page() Sun Jian
2026-02-07 11:58 ` kernel test robot
2026-02-07 12:08 ` kernel test robot
@ 2026-02-07 14:45 ` Sun Jian
2026-02-24 18:49 ` Konstantin Komarov
2 siblings, 1 reply; 6+ messages in thread
From: Sun Jian @ 2026-02-07 14:45 UTC (permalink / raw)
To: almaz.alexandrovich; +Cc: ntfs3, linux-kernel, lkp, Sun Jian
ntfs_lock_new_page() currently returns a struct page * but it primarily
operates on folios via __filemap_get_folio(). Convert it to return a
struct folio * and use folio_alloc() + __folio_set_locked() for the
temporary page used to avoid data corruption during decompression.
When the cached folio is not uptodate, preserve the existing behavior by
using folio_file_page() and converting the returned page back to a
folio.
Update ni_readpage_cmpr() and ni_decompress_file() to handle the new
return type while keeping the existing struct page * array and the
unlock_page()/put_page() cleanup paths unchanged.
Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
---
v2:
- Fix build failure in ni_decompress_file() by switching the local
pointer to struct folio * (reported by kernel test robot).
- Reported-by: kernel test robot <lkp@intel.com>
- Closes: https://lore.kernel.org/oe-kbuild-all/202602072013.jwrURE2e-lkp@intel.com/
- Closes: https://lore.kernel.org/oe-kbuild-all/202602071921.nGIiI1J5-lkp@intel.com/
fs/ntfs3/frecord.c | 43 ++++++++++++++++++++++++-------------------
1 file changed, 24 insertions(+), 19 deletions(-)
diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
index 641ddaf8d4a0..6169257cf784 100644
--- a/fs/ntfs3/frecord.c
+++ b/fs/ntfs3/frecord.c
@@ -2022,27 +2022,31 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
return err;
}
-static struct page *ntfs_lock_new_page(struct address_space *mapping,
- pgoff_t index, gfp_t gfp)
+static struct folio *ntfs_lock_new_page(struct address_space *mapping,
+ pgoff_t index, gfp_t gfp)
{
struct folio *folio = __filemap_get_folio(mapping, index,
FGP_LOCK | FGP_ACCESSED | FGP_CREAT, gfp);
- struct page *page;
if (IS_ERR(folio))
- return ERR_CAST(folio);
+ return folio;
- if (!folio_test_uptodate(folio))
- return folio_file_page(folio, index);
+ if (!folio_test_uptodate(folio)) {
+ struct page *page = folio_file_page(folio, index);
+
+ if (IS_ERR(page))
+ return ERR_CAST(page);
+ return page_folio(page);
+ }
/* Use a temporary page to avoid data corruption */
folio_unlock(folio);
folio_put(folio);
- page = alloc_page(gfp);
- if (!page)
+ folio = folio_alloc(gfp, 0);
+ if (!folio)
return ERR_PTR(-ENOMEM);
- __SetPageLocked(page);
- return page;
+ __folio_set_locked(folio);
+ return folio;
}
/*
@@ -2064,6 +2068,7 @@ int ni_readpage_cmpr(struct ntfs_inode *ni, struct folio *folio)
u32 i, idx, frame_size, pages_per_frame;
gfp_t gfp_mask;
struct page *pg;
+ struct folio *f;
if (vbo >= i_size_read(&ni->vfs_inode)) {
folio_zero_range(folio, 0, folio_size(folio));
@@ -2099,12 +2104,12 @@ int ni_readpage_cmpr(struct ntfs_inode *ni, struct folio *folio)
if (i == idx)
continue;
- pg = ntfs_lock_new_page(mapping, index, gfp_mask);
- if (IS_ERR(pg)) {
- err = PTR_ERR(pg);
+ f = ntfs_lock_new_page(mapping, index, gfp_mask);
+ if (IS_ERR(f)) {
+ err = PTR_ERR(f);
goto out1;
}
- pages[i] = pg;
+ pages[i] = &f->page;
}
err = ni_read_frame(ni, frame_vbo, pages, pages_per_frame, 0);
@@ -2190,18 +2195,18 @@ int ni_decompress_file(struct ntfs_inode *ni)
}
for (i = 0; i < pages_per_frame; i++, index++) {
- struct page *pg;
+ struct folio *f;
- pg = ntfs_lock_new_page(mapping, index, gfp_mask);
- if (IS_ERR(pg)) {
+ f = ntfs_lock_new_page(mapping, index, gfp_mask);
+ if (IS_ERR(f)) {
while (i--) {
unlock_page(pages[i]);
put_page(pages[i]);
}
- err = PTR_ERR(pg);
+ err = PTR_ERR(f);
goto out;
}
- pages[i] = pg;
+ pages[i] = &f->page;
}
err = ni_read_frame(ni, vbo, pages, pages_per_frame, 1);
base-commit: 2687c848e57820651b9f69d30c4710f4219f7dbf
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
2026-02-07 12:08 ` kernel test robot
@ 2026-02-07 14:59 ` sun jian
0 siblings, 0 replies; 6+ messages in thread
From: sun jian @ 2026-02-07 14:59 UTC (permalink / raw)
To: kernel test robot
Cc: Konstantin Komarov, llvm, oe-kbuild-all, ntfs3, linux-kernel
Hi,
Thanks for your reports! v2 has been sent to fix the issue in
ni_decompress_file().
Message-ID: 20260207144552.2322468-1-sun.jian.kdev@gmail.com
Regards,
sun jian
On Sat, Feb 7, 2026 at 8:08 PM kernel test robot <lkp@intel.com> wrote:
>
> Hi Sun,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on brauner-vfs/vfs.all]
> [also build test ERROR on linus/master v6.19-rc8]
> [cannot apply to next-20260205]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Sun-Jian/fs-ntfs3-return-folios-from-ntfs_lock_new_page/20260205-175053
> base: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
> patch link: https://lore.kernel.org/r/20260205094934.10500-1-sun.jian.kdev%40gmail.com
> patch subject: [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page()
> config: hexagon-randconfig-001-20260207 (https://download.01.org/0day-ci/archive/20260207/202602072013.jwrURE2e-lkp@intel.com/config)
> compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260207/202602072013.jwrURE2e-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202602072013.jwrURE2e-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> >> fs/ntfs3/frecord.c:2200:7: error: incompatible pointer types assigning to 'struct page *' from 'struct folio *' [-Wincompatible-pointer-types]
> 2200 | pg = ntfs_lock_new_page(mapping, index, gfp_mask);
> | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 1 error generated.
>
>
> vim +2200 fs/ntfs3/frecord.c
>
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2133
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2134 #ifdef CONFIG_NTFS3_LZX_XPRESS
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2135 /*
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2136 * ni_decompress_file - Decompress LZX/Xpress compressed file.
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2137 *
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2138 * Remove ATTR_DATA::WofCompressedData.
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2139 * Remove ATTR_REPARSE.
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2140 */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2141 int ni_decompress_file(struct ntfs_inode *ni)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2142 {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2143 struct ntfs_sb_info *sbi = ni->mi.sbi;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2144 struct inode *inode = &ni->vfs_inode;
> 4fd6c08a16d7f1b Konstantin Komarov 2024-01-26 2145 loff_t i_size = i_size_read(inode);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2146 struct address_space *mapping = inode->i_mapping;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2147 gfp_t gfp_mask = mapping_gfp_mask(mapping);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2148 struct page **pages = NULL;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2149 struct ATTR_LIST_ENTRY *le;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2150 struct ATTRIB *attr;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2151 CLST vcn, cend, lcn, clen, end;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2152 pgoff_t index;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2153 u64 vbo;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2154 u8 frame_bits;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2155 u32 i, frame_size, pages_per_frame, bytes;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2156 struct mft_inode *mi;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2157 int err;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2158
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2159 /* Clusters for decompressed data. */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2160 cend = bytes_to_cluster(sbi, i_size);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2161
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2162 if (!i_size)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2163 goto remove_wof;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2164
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2165 /* Check in advance. */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2166 if (cend > wnd_zeroes(&sbi->used.bitmap)) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2167 err = -ENOSPC;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2168 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2169 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2170
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2171 frame_bits = ni_ext_compress_bits(ni);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2172 frame_size = 1u << frame_bits;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2173 pages_per_frame = frame_size >> PAGE_SHIFT;
> 345482bc431f649 Kari Argillander 2021-08-24 2174 pages = kcalloc(pages_per_frame, sizeof(struct page *), GFP_NOFS);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2175 if (!pages) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2176 err = -ENOMEM;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2177 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2178 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2179
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2180 /*
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2181 * Step 1: Decompress data and copy to new allocated clusters.
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2182 */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2183 index = 0;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2184 for (vbo = 0; vbo < i_size; vbo += bytes) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2185 bool new;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2186
> f35590ee26f5722 Konstantin Komarov 2025-10-14 2187 bytes = vbo + frame_size > i_size ? (i_size - vbo) : frame_size;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2188 end = bytes_to_cluster(sbi, vbo + bytes);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2189
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2190 for (vcn = vbo >> sbi->cluster_bits; vcn < end; vcn += clen) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2191 err = attr_data_get_block(ni, vcn, cend - vcn, &lcn,
> c380b52f6c5702c Konstantin Komarov 2022-10-07 2192 &clen, &new, false);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2193 if (err)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2194 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2195 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2196
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2197 for (i = 0; i < pages_per_frame; i++, index++) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2198 struct page *pg;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2199
> 68f6bd128e75a03 Matthew Wilcox (Oracle 2025-07-18 @2200) pg = ntfs_lock_new_page(mapping, index, gfp_mask);
> 68f6bd128e75a03 Matthew Wilcox (Oracle 2025-07-18 2201) if (IS_ERR(pg)) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2202 while (i--) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2203 unlock_page(pages[i]);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2204 put_page(pages[i]);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2205 }
> 68f6bd128e75a03 Matthew Wilcox (Oracle 2025-07-18 2206) err = PTR_ERR(pg);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2207 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2208 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2209 pages[i] = pg;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2210 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2211
> f35590ee26f5722 Konstantin Komarov 2025-10-14 2212 err = ni_read_frame(ni, vbo, pages, pages_per_frame, 1);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2213
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2214 for (i = 0; i < pages_per_frame; i++) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2215 unlock_page(pages[i]);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2216 put_page(pages[i]);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2217 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2218
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2219 if (err)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2220 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2221
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2222 cond_resched();
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2223 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2224
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2225 remove_wof:
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2226 /*
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2227 * Step 2: Deallocate attributes ATTR_DATA::WofCompressedData
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2228 * and ATTR_REPARSE.
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2229 */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2230 attr = NULL;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2231 le = NULL;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2232 while ((attr = ni_enum_attr_ex(ni, attr, &le, NULL))) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2233 CLST svcn, evcn;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2234 u32 asize, roff;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2235
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2236 if (attr->type == ATTR_REPARSE) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2237 struct MFT_REF ref;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2238
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2239 mi_get_ref(&ni->mi, &ref);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2240 ntfs_remove_reparse(sbi, 0, &ref);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2241 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2242
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2243 if (!attr->non_res)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2244 continue;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2245
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2246 if (attr->type != ATTR_REPARSE &&
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2247 (attr->type != ATTR_DATA ||
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2248 attr->name_len != ARRAY_SIZE(WOF_NAME) ||
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2249 memcmp(attr_name(attr), WOF_NAME, sizeof(WOF_NAME))))
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2250 continue;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2251
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2252 svcn = le64_to_cpu(attr->nres.svcn);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2253 evcn = le64_to_cpu(attr->nres.evcn);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2254
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2255 if (evcn + 1 <= svcn)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2256 continue;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2257
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2258 asize = le32_to_cpu(attr->size);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2259 roff = le16_to_cpu(attr->nres.run_off);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2260
> 6db620863f8528e Edward Lo 2022-08-06 2261 if (roff > asize) {
> 6db620863f8528e Edward Lo 2022-08-06 2262 err = -EINVAL;
> 6db620863f8528e Edward Lo 2022-08-06 2263 goto out;
> 6db620863f8528e Edward Lo 2022-08-06 2264 }
> 6db620863f8528e Edward Lo 2022-08-06 2265
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2266 /*run==1 Means unpack and deallocate. */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2267 run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2268 Add2Ptr(attr, roff), asize - roff);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2269 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2270
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2271 /*
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2272 * Step 3: Remove attribute ATTR_DATA::WofCompressedData.
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2273 */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2274 err = ni_remove_attr(ni, ATTR_DATA, WOF_NAME, ARRAY_SIZE(WOF_NAME),
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2275 false, NULL);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2276 if (err)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2277 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2278
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2279 /*
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2280 * Step 4: Remove ATTR_REPARSE.
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2281 */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2282 err = ni_remove_attr(ni, ATTR_REPARSE, NULL, 0, false, NULL);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2283 if (err)
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2284 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2285
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2286 /*
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2287 * Step 5: Remove sparse flag from data attribute.
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2288 */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2289 attr = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL, &mi);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2290 if (!attr) {
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2291 err = -EINVAL;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2292 goto out;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2293 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2294
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2295 if (attr->non_res && is_attr_sparsed(attr)) {
> d3624466b56dd5b Konstantin Komarov 2021-08-31 2296 /* Sparsed attribute header is 8 bytes bigger than normal. */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2297 struct MFT_REC *rec = mi->mrec;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2298 u32 used = le32_to_cpu(rec->used);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2299 u32 asize = le32_to_cpu(attr->size);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2300 u16 roff = le16_to_cpu(attr->nres.run_off);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2301 char *rbuf = Add2Ptr(attr, roff);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2302
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2303 memmove(rbuf - 8, rbuf, used - PtrOffset(rec, rbuf));
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2304 attr->size = cpu_to_le32(asize - 8);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2305 attr->flags &= ~ATTR_FLAG_SPARSED;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2306 attr->nres.run_off = cpu_to_le16(roff - 8);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2307 attr->nres.c_unit = 0;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2308 rec->used = cpu_to_le32(used - 8);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2309 mi->dirty = true;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2310 ni->std_fa &= ~(FILE_ATTRIBUTE_SPARSE_FILE |
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2311 FILE_ATTRIBUTE_REPARSE_POINT);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2312
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2313 mark_inode_dirty(inode);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2314 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2315
> e8b8e97f91b80f0 Kari Argillander 2021-08-03 2316 /* Clear cached flag. */
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2317 ni->ni_flags &= ~NI_FLAG_COMPRESSED_MASK;
> c091354d6bf60ec Matthew Wilcox (Oracle 2024-04-22 2318) if (ni->file.offs_folio) {
> c091354d6bf60ec Matthew Wilcox (Oracle 2024-04-22 2319) folio_put(ni->file.offs_folio);
> c091354d6bf60ec Matthew Wilcox (Oracle 2024-04-22 2320) ni->file.offs_folio = NULL;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2321 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2322 mapping->a_ops = &ntfs_aops;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2323
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2324 out:
> 195c52bdd5d5ecf Kari Argillander 2021-08-24 2325 kfree(pages);
> c12df45ee690112 Konstantin Komarov 2022-07-13 2326 if (err)
> c12df45ee690112 Konstantin Komarov 2022-07-13 2327 _ntfs_bad_inode(inode);
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2328
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2329 return err;
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2330 }
> 4342306f0f0d5ff Konstantin Komarov 2021-08-13 2331
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] fs/ntfs3: return folios from ntfs_lock_new_page()
2026-02-07 14:45 ` [PATCH v2] " Sun Jian
@ 2026-02-24 18:49 ` Konstantin Komarov
0 siblings, 0 replies; 6+ messages in thread
From: Konstantin Komarov @ 2026-02-24 18:49 UTC (permalink / raw)
To: Sun Jian; +Cc: ntfs3, linux-kernel, lkp
On 2/7/26 15:45, Sun Jian wrote:
> ntfs_lock_new_page() currently returns a struct page * but it primarily
> operates on folios via __filemap_get_folio(). Convert it to return a
> struct folio * and use folio_alloc() + __folio_set_locked() for the
> temporary page used to avoid data corruption during decompression.
>
> When the cached folio is not uptodate, preserve the existing behavior by
> using folio_file_page() and converting the returned page back to a
> folio.
>
> Update ni_readpage_cmpr() and ni_decompress_file() to handle the new
> return type while keeping the existing struct page * array and the
> unlock_page()/put_page() cleanup paths unchanged.
>
> Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com>
> ---
> v2:
> - Fix build failure in ni_decompress_file() by switching the local
> pointer to struct folio * (reported by kernel test robot).
> - Reported-by: kernel test robot <lkp@intel.com>
> - Closes: https://lore.kernel.org/oe-kbuild-all/202602072013.jwrURE2e-lkp@intel.com/
> - Closes: https://lore.kernel.org/oe-kbuild-all/202602071921.nGIiI1J5-lkp@intel.com/
>
> fs/ntfs3/frecord.c | 43 ++++++++++++++++++++++++-------------------
> 1 file changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
> index 641ddaf8d4a0..6169257cf784 100644
> --- a/fs/ntfs3/frecord.c
> +++ b/fs/ntfs3/frecord.c
> @@ -2022,27 +2022,31 @@ int ni_fiemap(struct ntfs_inode *ni, struct fiemap_extent_info *fieinfo,
> return err;
> }
>
> -static struct page *ntfs_lock_new_page(struct address_space *mapping,
> - pgoff_t index, gfp_t gfp)
> +static struct folio *ntfs_lock_new_page(struct address_space *mapping,
> + pgoff_t index, gfp_t gfp)
> {
> struct folio *folio = __filemap_get_folio(mapping, index,
> FGP_LOCK | FGP_ACCESSED | FGP_CREAT, gfp);
> - struct page *page;
>
> if (IS_ERR(folio))
> - return ERR_CAST(folio);
> + return folio;
>
> - if (!folio_test_uptodate(folio))
> - return folio_file_page(folio, index);
> + if (!folio_test_uptodate(folio)) {
> + struct page *page = folio_file_page(folio, index);
> +
> + if (IS_ERR(page))
> + return ERR_CAST(page);
> + return page_folio(page);
> + }
>
> /* Use a temporary page to avoid data corruption */
> folio_unlock(folio);
> folio_put(folio);
> - page = alloc_page(gfp);
> - if (!page)
> + folio = folio_alloc(gfp, 0);
> + if (!folio)
> return ERR_PTR(-ENOMEM);
> - __SetPageLocked(page);
> - return page;
> + __folio_set_locked(folio);
> + return folio;
> }
>
> /*
> @@ -2064,6 +2068,7 @@ int ni_readpage_cmpr(struct ntfs_inode *ni, struct folio *folio)
> u32 i, idx, frame_size, pages_per_frame;
> gfp_t gfp_mask;
> struct page *pg;
> + struct folio *f;
>
> if (vbo >= i_size_read(&ni->vfs_inode)) {
> folio_zero_range(folio, 0, folio_size(folio));
> @@ -2099,12 +2104,12 @@ int ni_readpage_cmpr(struct ntfs_inode *ni, struct folio *folio)
> if (i == idx)
> continue;
>
> - pg = ntfs_lock_new_page(mapping, index, gfp_mask);
> - if (IS_ERR(pg)) {
> - err = PTR_ERR(pg);
> + f = ntfs_lock_new_page(mapping, index, gfp_mask);
> + if (IS_ERR(f)) {
> + err = PTR_ERR(f);
> goto out1;
> }
> - pages[i] = pg;
> + pages[i] = &f->page;
> }
>
> err = ni_read_frame(ni, frame_vbo, pages, pages_per_frame, 0);
> @@ -2190,18 +2195,18 @@ int ni_decompress_file(struct ntfs_inode *ni)
> }
>
> for (i = 0; i < pages_per_frame; i++, index++) {
> - struct page *pg;
> + struct folio *f;
>
> - pg = ntfs_lock_new_page(mapping, index, gfp_mask);
> - if (IS_ERR(pg)) {
> + f = ntfs_lock_new_page(mapping, index, gfp_mask);
> + if (IS_ERR(f)) {
> while (i--) {
> unlock_page(pages[i]);
> put_page(pages[i]);
> }
> - err = PTR_ERR(pg);
> + err = PTR_ERR(f);
> goto out;
> }
> - pages[i] = pg;
> + pages[i] = &f->page;
> }
>
> err = ni_read_frame(ni, vbo, pages, pages_per_frame, 1);
>
> base-commit: 2687c848e57820651b9f69d30c4710f4219f7dbf
Hello,
Applied, thanks for the patch.
Regards,
Konstantin
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-02-24 18:49 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-05 9:49 [PATCH] fs/ntfs3: return folios from ntfs_lock_new_page() Sun Jian
2026-02-07 11:58 ` kernel test robot
2026-02-07 12:08 ` kernel test robot
2026-02-07 14:59 ` sun jian
2026-02-07 14:45 ` [PATCH v2] " Sun Jian
2026-02-24 18:49 ` Konstantin Komarov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox