[bug report] ceph: Convert ceph_readdir_cache_control to store a folio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Matthew Wilcox (Oracle),

Commit baff9740bc8f ("ceph: Convert ceph_readdir_cache_control to
store a folio") from Feb 17, 2025 (linux-next), leads to the
following Smatch static checker warning:

	fs/ceph/inode.c:1873 fill_readdir_cache()
	warn: 'ctl->folio' is an error pointer or valid

fs/ceph/inode.c
    1854 static int fill_readdir_cache(struct inode *dir, struct dentry *dn,
    1855                               struct ceph_readdir_cache_control *ctl,
    1856                               struct ceph_mds_request *req)
    1857 {
    1858         struct ceph_client *cl = ceph_inode_to_client(dir);
    1859         struct ceph_inode_info *ci = ceph_inode(dir);
    1860         unsigned nsize = PAGE_SIZE / sizeof(struct dentry*);
    1861         unsigned idx = ctl->index % nsize;
    1862         pgoff_t pgoff = ctl->index / nsize;
    1863 
    1864         if (!ctl->folio || pgoff != ctl->folio->index) {
    1865                 ceph_readdir_cache_release(ctl);
    1866                 fgf_t fgf = FGP_LOCK;
    1867 
    1868                 if (idx == 0)
    1869                         fgf |= FGP_ACCESSED | FGP_CREAT;
    1870 
    1871                 ctl->folio = __filemap_get_folio(&dir->i_data, pgoff,
    1872                                 fgf, mapping_gfp_mask(&dir->i_data));
--> 1873                 if (!ctl->folio) {
    1874                         ctl->index = -1;
    1875                         return idx == 0 ? -ENOMEM : 0;

The __filemap_get_folio() never returns NULL, it returns error pointers.

    1876                 }
    1877                 /* reading/filling the cache are serialized by
    1878                  * i_rwsem, no need to use folio lock */
    1879                 folio_unlock(ctl->folio);
    1880                 ctl->dentries = kmap_local_folio(ctl->folio, 0);
    1881                 if (idx == 0)
    1882                         memset(ctl->dentries, 0, PAGE_SIZE);
    1883         }
    1884 
    1885         if (req->r_dir_release_cnt == atomic64_read(&ci->i_release_count) &&
    1886             req->r_dir_ordered_cnt == atomic64_read(&ci->i_ordered_count)) {
    1887                 doutc(cl, "dn %p idx %d\n", dn, ctl->index);
    1888                 ctl->dentries[idx] = dn;
    1889                 ctl->index++;
    1890         } else {
    1891                 doutc(cl, "disable readdir cache\n");
    1892                 ctl->index = -1;
    1893         }
    1894         return 0;
    1895 }

regards,
dan carpenter




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux