Hello Alistair Popple,
Commit 9c4409f51aa3 ("fs/dax: properly refcount fs dax pages") from
Jan 7, 2025 (linux-next), leads to the following Smatch static
checker warning:
fs/dax.c:379 dax_folio_share_put()
warn: unsigned 'ref' is never less than zero.
fs/dax.c
370 static inline unsigned long dax_folio_share_put(struct folio *folio)
371 {
372 unsigned long ref;
373
374 if (!dax_folio_is_shared(folio))
375 ref = 0;
376 else
377 ref = --folio->share;
378
--> 379 WARN_ON_ONCE(ref < 0);
^^^^^^^
impossible
380 if (!ref) {
381 folio->mapping = NULL;
382 if (folio_order(folio)) {
383 struct dev_pagemap *pgmap =
page_pgmap(&folio->page);
384 unsigned int order = folio_order(folio);
385 unsigned int i;
386
387 for (i = 0; i < (1UL << order); i++) {
388 struct page *page = folio_page(folio,
i);
389
390 ClearPageHead(page);
391 clear_compound_head(page);
392
393 /*
394 * Reset pgmap which was over-written by
395 * prep_compound_page().
396 */
397 page_folio(page)->pgmap = pgmap;
398
399 /* Make sure this isn't set to
TAIL_MAPPING */
400 page->mapping = NULL;
401 page->share = 0;
402 WARN_ON_ONCE(page_ref_count(page));
403 }
404 }
405 }
406
407 return ref;
408 }
regards,
dan carpenter