在 8/18/2025 5:52 PM, Dan Carpenter 写道:
Hello Dongsheng Yang,

Commit 6fb8fbbaf147 ("dm-pcache: add persistent cache target in
device-mapper") from Aug 12, 2025 (linux-next), leads to the
following Smatch static checker warning:

        drivers/md/dm-pcache/cache_req.c:60 cache_data_alloc()
        error: uninitialized symbol 'to_alloc'.


Hi Dan,

    Thanx for your report, I did fix it in my local tree, and testing is running now. If all tests pass, I will send the patch out tomorrow.


Thanx

Dongsheng


drivers/md/dm-pcache/cache_req.c
     36 static int cache_data_alloc(struct pcache_cache *cache, struct 
pcache_cache_key *key)
     37 {
     38         struct pcache_cache_data_head *data_head;
     39         struct pcache_cache_pos *head_pos;
     40         struct pcache_cache_segment *cache_seg;
     41         u32 seg_remain;
     42         u32 allocated = 0, to_alloc;
     43         int ret = 0;
     44
     45         preempt_disable();
     46         data_head = get_data_head(cache);
     47 again:
     48         if (!data_head->head_pos.cache_seg) {
     49                 seg_remain = 0;

to_alloc isn't initialized on this path.

     50         } else {
     51                 cache_pos_copy(&key->cache_pos, &data_head->head_pos);
     52                 key->seg_gen = key->cache_pos.cache_seg->gen;
     53
     54                 head_pos = &data_head->head_pos;
     55                 cache_seg = head_pos->cache_seg;
     56                 seg_remain = cache_seg_remain(head_pos);
     57                 to_alloc = key->len - allocated;
     58         }
     59
--> 60         if (seg_remain > to_alloc) {
                                 ^^^^^^^^

     61                 /* If remaining space in segment is sufficient for the 
cache key, allocate it. */
     62                 cache_pos_advance(head_pos, to_alloc);
     63                 allocated += to_alloc;
     64                 cache_seg_get(cache_seg);
     65         } else if (seg_remain) {
     66                 /* If remaining space is not enough, allocate the 
remaining space and adjust the cache key length. */
     67                 cache_pos_advance(head_pos, seg_remain);
     68                 key->len = seg_remain;
     69
     70                 /* Get for key: obtain a reference to the cache segment 
for the key. */
     71                 cache_seg_get(cache_seg);
     72                 /* Put for head_pos->cache_seg: release the reference 
for the current head's segment. */
     73                 cache_seg_put(head_pos->cache_seg);
     74                 head_pos->cache_seg = NULL;
     75         } else {
     76                 /* Initialize a new data head if no segment is 
available. */
     77                 ret = cache_data_head_init(cache);
     78                 if (ret)
     79                         goto out;
     80
     81                 goto again;
     82         }
     83
     84 out:
     85         preempt_enable();
     86
     87         return ret;
     88 }

regards,
dan carpenter

Reply via email to