[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202503030642.jn4Teav7-lkp@intel.com>
Date: Mon, 3 Mar 2025 06:23:28 +0800
From: kernel test robot <lkp@...el.com>
To: Suchit Karunakaran <suchitkarunakaran@...il.com>, shaggy@...nel.org,
jfs-discussion@...ts.sourceforge.net
Cc: llvm@...ts.linux.dev, oe-kbuild-all@...ts.linux.dev,
linux-kernel@...r.kernel.org, skhan@...uxfoundation.org,
Suchit Karunakaran <suchitkarunakaran@...il.com>
Subject: Re: [PATCH] jfs: jfs_xtree: replace XT_GETPAGE macro with
xt_getpage() function
Hi Suchit,
kernel test robot noticed the following build errors:
[auto build test ERROR on kleikamp-shaggy/jfs-next]
[also build test ERROR on linus/master v6.14-rc5 next-20250228]
[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/Suchit-Karunakaran/jfs-jfs_xtree-replace-XT_GETPAGE-macro-with-xt_getpage-function/20250303-031811
base: https://github.com/kleikamp/linux-shaggy jfs-next
patch link: https://lore.kernel.org/r/20250302191558.47180-1-suchitkarunakaran%40gmail.com
patch subject: [PATCH] jfs: jfs_xtree: replace XT_GETPAGE macro with xt_getpage() function
config: arm-randconfig-001-20250303 (https://download.01.org/0day-ci/archive/20250303/202503030642.jn4Teav7-lkp@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250303/202503030642.jn4Teav7-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@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503030642.jn4Teav7-lkp@intel.com/
All errors (new ones prefixed by >>):
>> fs/jfs/jfs_xtree.c:118:13: error: incompatible pointer types passing 'struct inode **' to parameter of type 'struct inode *'; dereference with * [-Werror,-Wincompatible-pointer-types]
BT_GETPAGE(ip, bn, *mp, xtpage_t, size, *p, rc, i_xtroot);
^~
*
fs/jfs/jfs_btree.h:58:35: note: expanded from macro 'BT_GETPAGE'
MP = (struct metapage *)&JFS_IP(IP)->bxflag;\
^~
fs/jfs/jfs_incore.h:205:59: note: passing argument to parameter 'inode' here
static inline struct jfs_inode_info *JFS_IP(struct inode *inode)
^
>> fs/jfs/jfs_xtree.c:118:13: error: incompatible pointer types passing 'struct inode **' to parameter of type 'struct inode *'; dereference with * [-Werror,-Wincompatible-pointer-types]
BT_GETPAGE(ip, bn, *mp, xtpage_t, size, *p, rc, i_xtroot);
^~
*
fs/jfs/jfs_btree.h:59:23: note: expanded from macro 'BT_GETPAGE'
P = (TYPE *)&JFS_IP(IP)->ROOT;\
^~
fs/jfs/jfs_incore.h:205:59: note: passing argument to parameter 'inode' here
static inline struct jfs_inode_info *JFS_IP(struct inode *inode)
^
fs/jfs/jfs_xtree.c:118:2: error: incompatible pointer types passing 'struct inode **' to parameter of type 'struct inode *'; dereference with * [-Werror,-Wincompatible-pointer-types]
BT_GETPAGE(ip, bn, *mp, xtpage_t, size, *p, rc, i_xtroot);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/jfs/jfs_btree.h:64:22: note: expanded from macro 'BT_GETPAGE'
MP = read_metapage((IP), BN, SIZE, 1);\
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
fs/jfs/jfs_metapage.h:55:18: note: expanded from macro 'read_metapage'
__get_metapage(inode, lblock, size, absolute, false)
^~~~~
fs/jfs/jfs_metapage.h:50:54: note: passing argument to parameter 'inode' here
extern struct metapage *__get_metapage(struct inode *inode,
^
>> fs/jfs/jfs_xtree.c:126:16: error: member reference base type 'struct inode *' is not a structure or union
jfs_error(ip->i_sb, "xt_getpage: xtree page corrupt\n");
~~^ ~~~~
>> fs/jfs/jfs_xtree.c:273:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:828:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, parent->bn, &smp, PSIZE, &sp);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1083:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, nextbn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1438:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1454:20: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1732:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1748:20: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1809:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1885:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:1902:20: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:2289:18: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:2527:18: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:2812:19: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
fs/jfs/jfs_xtree.c:2857:18: error: incompatible pointer types passing 'struct inode *' to parameter of type 'struct inode **'; take the address with & [-Werror,-Wincompatible-pointer-types]
rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
^~
&
fs/jfs/jfs_xtree.c:113:45: note: passing argument to parameter 'ip' here
static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
^
18 errors generated.
vim +118 fs/jfs/jfs_xtree.c
79
80
81 /*
82 * forward references
83 */
84 static int xtSearch(struct inode *ip, s64 xoff, s64 *next, int *cmpp,
85 struct btstack * btstack, int flag);
86
87 static int xtSplitUp(tid_t tid,
88 struct inode *ip,
89 struct xtsplit * split, struct btstack * btstack);
90
91 static int xtSplitPage(tid_t tid, struct inode *ip, struct xtsplit * split,
92 struct metapage ** rmpp, s64 * rbnp);
93
94 static int xtSplitRoot(tid_t tid, struct inode *ip,
95 struct xtsplit * split, struct metapage ** rmpp);
96
97 /*
98 * xt_getpage()
99 *
100 * function: get the page buffer for a specified block address.
101 *
102 * parameters:
103 * ip - pointer to the inode
104 * bn - block number (s64) of the xtree page to be retrieved;
105 * mp - pointer to a metapage pointer where the page buffer is returned;
106 * size - size parameter to pass to BT_GETPAGE;
107 * p - pointer to an xtpage_t pointer mapping the page's data.
108 *
109 * returns:
110 * 0 on success, or -EIO if the page is corrupt or an error occurs.
111 */
112
113 static inline int xt_getpage(struct inode **ip, s64 bn, struct metapage **mp,
114 unsigned int size, xtpage_t **p)
115 {
116 int rc;
117
> 118 BT_GETPAGE(ip, bn, *mp, xtpage_t, size, *p, rc, i_xtroot);
119
120 if (!rc) {
121 if ((le16_to_cpu((*p)->header.nextindex) < XTENTRYSTART) ||
122 (le16_to_cpu((*p)->header.nextindex) >
123 le16_to_cpu((*p)->header.maxentry)) ||
124 (le16_to_cpu((*p)->header.maxentry) >
125 ((bn == 0) ? XTROOTMAXSLOT : PSIZE >> L2XTSLOTSIZE))) {
> 126 jfs_error(ip->i_sb, "xt_getpage: xtree page corrupt\n");
127 BT_PUTPAGE(*mp);
128 *mp = NULL;
129 rc = -EIO;
130 }
131 }
132 return rc;
133 }
134
135 /*
136 * xtLookup()
137 *
138 * function: map a single page into a physical extent;
139 */
140 int xtLookup(struct inode *ip, s64 lstart,
141 s64 llen, int *pflag, s64 * paddr, s32 * plen, int no_check)
142 {
143 int rc = 0;
144 struct btstack btstack;
145 int cmp;
146 s64 bn;
147 struct metapage *mp;
148 xtpage_t *p;
149 int index;
150 xad_t *xad;
151 s64 next, size, xoff, xend;
152 int xlen;
153 s64 xaddr;
154
155 *paddr = 0;
156 *plen = llen;
157
158 if (!no_check) {
159 /* is lookup offset beyond eof ? */
160 size = ((u64) ip->i_size + (JFS_SBI(ip->i_sb)->bsize - 1)) >>
161 JFS_SBI(ip->i_sb)->l2bsize;
162 if (lstart >= size)
163 return 0;
164 }
165
166 /*
167 * search for the xad entry covering the logical extent
168 */
169 //search:
170 if ((rc = xtSearch(ip, lstart, &next, &cmp, &btstack, 0))) {
171 jfs_err("xtLookup: xtSearch returned %d", rc);
172 return rc;
173 }
174
175 /*
176 * compute the physical extent covering logical extent
177 *
178 * N.B. search may have failed (e.g., hole in sparse file),
179 * and returned the index of the next entry.
180 */
181 /* retrieve search result */
182 XT_GETSEARCH(ip, btstack.top, bn, mp, p, index);
183
184 /* is xad found covering start of logical extent ?
185 * lstart is a page start address,
186 * i.e., lstart cannot start in a hole;
187 */
188 if (cmp) {
189 if (next)
190 *plen = min(next - lstart, llen);
191 goto out;
192 }
193
194 /*
195 * lxd covered by xad
196 */
197 xad = &p->xad[index];
198 xoff = offsetXAD(xad);
199 xlen = lengthXAD(xad);
200 xend = xoff + xlen;
201 xaddr = addressXAD(xad);
202
203 /* initialize new pxd */
204 *pflag = xad->flag;
205 *paddr = xaddr + (lstart - xoff);
206 /* a page must be fully covered by an xad */
207 *plen = min(xend - lstart, llen);
208
209 out:
210 XT_PUTPAGE(mp);
211
212 return rc;
213 }
214
215 /*
216 * xtSearch()
217 *
218 * function: search for the xad entry covering specified offset.
219 *
220 * parameters:
221 * ip - file object;
222 * xoff - extent offset;
223 * nextp - address of next extent (if any) for search miss
224 * cmpp - comparison result:
225 * btstack - traverse stack;
226 * flag - search process flag (XT_INSERT);
227 *
228 * returns:
229 * btstack contains (bn, index) of search path traversed to the entry.
230 * *cmpp is set to result of comparison with the entry returned.
231 * the page containing the entry is pinned at exit.
232 */
233 static int xtSearch(struct inode *ip, s64 xoff, s64 *nextp,
234 int *cmpp, struct btstack * btstack, int flag)
235 {
236 struct jfs_inode_info *jfs_ip = JFS_IP(ip);
237 int rc = 0;
238 int cmp = 1; /* init for empty page */
239 s64 bn; /* block number */
240 struct metapage *mp; /* page buffer */
241 xtpage_t *p; /* page */
242 xad_t *xad;
243 int base, index, lim, btindex;
244 struct btframe *btsp;
245 int nsplit = 0; /* number of pages to split */
246 s64 t64;
247 s64 next = 0;
248
249 INCREMENT(xtStat.search);
250
251 BT_CLR(btstack);
252
253 btstack->nsplit = 0;
254
255 /*
256 * search down tree from root:
257 *
258 * between two consecutive entries of <Ki, Pi> and <Kj, Pj> of
259 * internal page, child page Pi contains entry with k, Ki <= K < Kj.
260 *
261 * if entry with search key K is not found
262 * internal page search find the entry with largest key Ki
263 * less than K which point to the child page to search;
264 * leaf page search find the entry with smallest key Kj
265 * greater than K so that the returned index is the position of
266 * the entry to be shifted right for insertion of new entry.
267 * for empty tree, search key is greater than any key of the tree.
268 *
269 * by convention, root bn = 0.
270 */
271 for (bn = 0;;) {
272 /* get/pin the page to search */
> 273 rc = xt_getpage(ip, bn, &mp, PSIZE, &p);
274 if (rc)
275 return rc;
276
277 /* try sequential access heuristics with the previous
278 * access entry in target leaf page:
279 * once search narrowed down into the target leaf,
280 * key must either match an entry in the leaf or
281 * key entry does not exist in the tree;
282 */
283 //fastSearch:
284 if ((jfs_ip->btorder & BT_SEQUENTIAL) &&
285 (p->header.flag & BT_LEAF) &&
286 (index = jfs_ip->btindex) <
287 le16_to_cpu(p->header.nextindex)) {
288 xad = &p->xad[index];
289 t64 = offsetXAD(xad);
290 if (xoff < t64 + lengthXAD(xad)) {
291 if (xoff >= t64) {
292 *cmpp = 0;
293 goto out;
294 }
295
296 /* stop sequential access heuristics */
297 goto binarySearch;
298 } else { /* (t64 + lengthXAD(xad)) <= xoff */
299
300 /* try next sequential entry */
301 index++;
302 if (index <
303 le16_to_cpu(p->header.nextindex)) {
304 xad++;
305 t64 = offsetXAD(xad);
306 if (xoff < t64 + lengthXAD(xad)) {
307 if (xoff >= t64) {
308 *cmpp = 0;
309 goto out;
310 }
311
312 /* miss: key falls between
313 * previous and this entry
314 */
315 *cmpp = 1;
316 next = t64;
317 goto out;
318 }
319
320 /* (xoff >= t64 + lengthXAD(xad));
321 * matching entry may be further out:
322 * stop heuristic search
323 */
324 /* stop sequential access heuristics */
325 goto binarySearch;
326 }
327
328 /* (index == p->header.nextindex);
329 * miss: key entry does not exist in
330 * the target leaf/tree
331 */
332 *cmpp = 1;
333 goto out;
334 }
335
336 /*
337 * if hit, return index of the entry found, and
338 * if miss, where new entry with search key is
339 * to be inserted;
340 */
341 out:
342 /* compute number of pages to split */
343 if (flag & XT_INSERT) {
344 if (p->header.nextindex == /* little-endian */
345 p->header.maxentry)
346 nsplit++;
347 else
348 nsplit = 0;
349 btstack->nsplit = nsplit;
350 }
351
352 /* save search result */
353 btsp = btstack->top;
354 btsp->bn = bn;
355 btsp->index = index;
356 btsp->mp = mp;
357
358 /* update sequential access heuristics */
359 jfs_ip->btindex = index;
360
361 if (nextp)
362 *nextp = next;
363
364 INCREMENT(xtStat.fastSearch);
365 return 0;
366 }
367
368 /* well, ... full search now */
369 binarySearch:
370 lim = le16_to_cpu(p->header.nextindex) - XTENTRYSTART;
371
372 /*
373 * binary search with search key K on the current page
374 */
375 for (base = XTENTRYSTART; lim; lim >>= 1) {
376 index = base + (lim >> 1);
377
378 XT_CMP(cmp, xoff, &p->xad[index], t64);
379 if (cmp == 0) {
380 /*
381 * search hit
382 */
383 /* search hit - leaf page:
384 * return the entry found
385 */
386 if (p->header.flag & BT_LEAF) {
387 *cmpp = cmp;
388
389 /* compute number of pages to split */
390 if (flag & XT_INSERT) {
391 if (p->header.nextindex ==
392 p->header.maxentry)
393 nsplit++;
394 else
395 nsplit = 0;
396 btstack->nsplit = nsplit;
397 }
398
399 /* save search result */
400 btsp = btstack->top;
401 btsp->bn = bn;
402 btsp->index = index;
403 btsp->mp = mp;
404
405 /* init sequential access heuristics */
406 btindex = jfs_ip->btindex;
407 if (index == btindex ||
408 index == btindex + 1)
409 jfs_ip->btorder = BT_SEQUENTIAL;
410 else
411 jfs_ip->btorder = BT_RANDOM;
412 jfs_ip->btindex = index;
413
414 return 0;
415 }
416 /* search hit - internal page:
417 * descend/search its child page
418 */
419 if (index < le16_to_cpu(p->header.nextindex)-1)
420 next = offsetXAD(&p->xad[index + 1]);
421 goto next;
422 }
423
424 if (cmp > 0) {
425 base = index + 1;
426 --lim;
427 }
428 }
429
430 /*
431 * search miss
432 *
433 * base is the smallest index with key (Kj) greater than
434 * search key (K) and may be zero or maxentry index.
435 */
436 if (base < le16_to_cpu(p->header.nextindex))
437 next = offsetXAD(&p->xad[base]);
438 /*
439 * search miss - leaf page:
440 *
441 * return location of entry (base) where new entry with
442 * search key K is to be inserted.
443 */
444 if (p->header.flag & BT_LEAF) {
445 *cmpp = cmp;
446
447 /* compute number of pages to split */
448 if (flag & XT_INSERT) {
449 if (p->header.nextindex ==
450 p->header.maxentry)
451 nsplit++;
452 else
453 nsplit = 0;
454 btstack->nsplit = nsplit;
455 }
456
457 /* save search result */
458 btsp = btstack->top;
459 btsp->bn = bn;
460 btsp->index = base;
461 btsp->mp = mp;
462
463 /* init sequential access heuristics */
464 btindex = jfs_ip->btindex;
465 if (base == btindex || base == btindex + 1)
466 jfs_ip->btorder = BT_SEQUENTIAL;
467 else
468 jfs_ip->btorder = BT_RANDOM;
469 jfs_ip->btindex = base;
470
471 if (nextp)
472 *nextp = next;
473
474 return 0;
475 }
476
477 /*
478 * search miss - non-leaf page:
479 *
480 * if base is non-zero, decrement base by one to get the parent
481 * entry of the child page to search.
482 */
483 index = base ? base - 1 : base;
484
485 /*
486 * go down to child page
487 */
488 next:
489 /* update number of pages to split */
490 if (p->header.nextindex == p->header.maxentry)
491 nsplit++;
492 else
493 nsplit = 0;
494
495 /* push (bn, index) of the parent page/entry */
496 if (BT_STACK_FULL(btstack)) {
497 jfs_error(ip->i_sb, "stack overrun!\n");
498 XT_PUTPAGE(mp);
499 return -EIO;
500 }
501 BT_PUSH(btstack, bn, index);
502
503 /* get the child page block number */
504 bn = addressXAD(&p->xad[index]);
505
506 /* unpin the parent page */
507 XT_PUTPAGE(mp);
508 }
509 }
510
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists