CC: [email protected]
CC: Linux Memory Management List <[email protected]>
TO: Naohiro Aota <[email protected]>
CC: David Sterba <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 
master
head:   7c8ca8129ee9724cb1527895fe6dec942ef07f19
commit: 90ab5c54fc1f6c02bd55472fc2a5f069244ed806 [5635/6320] btrfs: implement 
log-structured superblock for ZONED mode
:::::: branch date: 5 hours ago
:::::: commit date: 17 hours ago
config: nds32-randconfig-m031-20201113 (attached as .config)
compiler: nds32le-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

smatch warnings:
fs/btrfs/zoned.c:234 btrfs_get_dev_zone_info() warn: should 'sb_zone << 
(zone_info->zone_size_shift - 9)' be a 64 bit type?
fs/btrfs/zoned.c:518 btrfs_sb_log_location_bdev() warn: should 'zone_sectors << 
9' be a 64 bit type?
fs/btrfs/zoned.c:526 btrfs_sb_log_location_bdev() warn: should 'sb_zone << 
zone_sectors_shift' be a 64 bit type?
fs/btrfs/zoned.c:625 btrfs_reset_sb_log_zones() warn: should 'sb_zone << 
zone_sectors_shift' be a 64 bit type?

vim +234 fs/btrfs/zoned.c

72f34dade8b1e1a Naohiro Aota 2020-11-10  145  
72f34dade8b1e1a Naohiro Aota 2020-11-10  146  int 
btrfs_get_dev_zone_info(struct btrfs_device *device)
72f34dade8b1e1a Naohiro Aota 2020-11-10  147  {
72f34dade8b1e1a Naohiro Aota 2020-11-10  148    struct btrfs_zoned_device_info 
*zone_info = NULL;
72f34dade8b1e1a Naohiro Aota 2020-11-10  149    struct block_device *bdev = 
device->bdev;
ac8176028782f26 Naohiro Aota 2020-11-10  150    struct request_queue *queue = 
bdev_get_queue(bdev);
72f34dade8b1e1a Naohiro Aota 2020-11-10  151    sector_t nr_sectors = 
bdev->bd_part->nr_sects;
72f34dade8b1e1a Naohiro Aota 2020-11-10  152    sector_t sector = 0;
72f34dade8b1e1a Naohiro Aota 2020-11-10  153    struct blk_zone *zones = NULL;
72f34dade8b1e1a Naohiro Aota 2020-11-10  154    unsigned int i, nreported = 0, 
nr_zones;
72f34dade8b1e1a Naohiro Aota 2020-11-10  155    unsigned int zone_sectors;
72f34dade8b1e1a Naohiro Aota 2020-11-10  156    int ret;
72f34dade8b1e1a Naohiro Aota 2020-11-10  157  
72f34dade8b1e1a Naohiro Aota 2020-11-10  158    if (!bdev_is_zoned(bdev))
72f34dade8b1e1a Naohiro Aota 2020-11-10  159            return 0;
72f34dade8b1e1a Naohiro Aota 2020-11-10  160  
72f34dade8b1e1a Naohiro Aota 2020-11-10  161    if (device->zone_info)
72f34dade8b1e1a Naohiro Aota 2020-11-10  162            return 0;
72f34dade8b1e1a Naohiro Aota 2020-11-10  163  
72f34dade8b1e1a Naohiro Aota 2020-11-10  164    zone_info = 
kzalloc(sizeof(*zone_info), GFP_KERNEL);
72f34dade8b1e1a Naohiro Aota 2020-11-10  165    if (!zone_info)
72f34dade8b1e1a Naohiro Aota 2020-11-10  166            return -ENOMEM;
72f34dade8b1e1a Naohiro Aota 2020-11-10  167  
72f34dade8b1e1a Naohiro Aota 2020-11-10  168    zone_sectors = 
bdev_zone_sectors(bdev);
72f34dade8b1e1a Naohiro Aota 2020-11-10  169    
ASSERT(is_power_of_2(zone_sectors));
72f34dade8b1e1a Naohiro Aota 2020-11-10  170    zone_info->zone_size = 
(u64)zone_sectors << SECTOR_SHIFT;
72f34dade8b1e1a Naohiro Aota 2020-11-10  171    zone_info->zone_size_shift = 
ilog2(zone_info->zone_size);
ac8176028782f26 Naohiro Aota 2020-11-10  172    zone_info->max_zone_append_size 
=
ac8176028782f26 Naohiro Aota 2020-11-10  173            
(u64)queue_max_zone_append_sectors(queue) << SECTOR_SHIFT;
72f34dade8b1e1a Naohiro Aota 2020-11-10  174    zone_info->nr_zones = 
nr_sectors >> ilog2(bdev_zone_sectors(bdev));
72f34dade8b1e1a Naohiro Aota 2020-11-10  175    if (!IS_ALIGNED(nr_sectors, 
zone_sectors))
72f34dade8b1e1a Naohiro Aota 2020-11-10  176            zone_info->nr_zones++;
72f34dade8b1e1a Naohiro Aota 2020-11-10  177  
72f34dade8b1e1a Naohiro Aota 2020-11-10  178    zone_info->seq_zones = 
bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
72f34dade8b1e1a Naohiro Aota 2020-11-10  179    if (!zone_info->seq_zones) {
72f34dade8b1e1a Naohiro Aota 2020-11-10  180            ret = -ENOMEM;
72f34dade8b1e1a Naohiro Aota 2020-11-10  181            goto out;
72f34dade8b1e1a Naohiro Aota 2020-11-10  182    }
72f34dade8b1e1a Naohiro Aota 2020-11-10  183  
72f34dade8b1e1a Naohiro Aota 2020-11-10  184    zone_info->empty_zones = 
bitmap_zalloc(zone_info->nr_zones, GFP_KERNEL);
72f34dade8b1e1a Naohiro Aota 2020-11-10  185    if (!zone_info->empty_zones) {
72f34dade8b1e1a Naohiro Aota 2020-11-10  186            ret = -ENOMEM;
72f34dade8b1e1a Naohiro Aota 2020-11-10  187            goto out;
72f34dade8b1e1a Naohiro Aota 2020-11-10  188    }
72f34dade8b1e1a Naohiro Aota 2020-11-10  189  
72f34dade8b1e1a Naohiro Aota 2020-11-10  190    zones = 
kcalloc(BTRFS_REPORT_NR_ZONES, sizeof(struct blk_zone), GFP_KERNEL);
72f34dade8b1e1a Naohiro Aota 2020-11-10  191    if (!zones) {
72f34dade8b1e1a Naohiro Aota 2020-11-10  192            ret = -ENOMEM;
72f34dade8b1e1a Naohiro Aota 2020-11-10  193            goto out;
72f34dade8b1e1a Naohiro Aota 2020-11-10  194    }
72f34dade8b1e1a Naohiro Aota 2020-11-10  195  
72f34dade8b1e1a Naohiro Aota 2020-11-10  196    /* Get zones type */
72f34dade8b1e1a Naohiro Aota 2020-11-10  197    while (sector < nr_sectors) {
72f34dade8b1e1a Naohiro Aota 2020-11-10  198            nr_zones = 
BTRFS_REPORT_NR_ZONES;
72f34dade8b1e1a Naohiro Aota 2020-11-10  199            ret = 
btrfs_get_dev_zones(device, sector << SECTOR_SHIFT, zones,
72f34dade8b1e1a Naohiro Aota 2020-11-10  200                                    
  &nr_zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  201            if (ret)
72f34dade8b1e1a Naohiro Aota 2020-11-10  202                    goto out;
72f34dade8b1e1a Naohiro Aota 2020-11-10  203  
72f34dade8b1e1a Naohiro Aota 2020-11-10  204            for (i = 0; i < 
nr_zones; i++) {
72f34dade8b1e1a Naohiro Aota 2020-11-10  205                    if 
(zones[i].type == BLK_ZONE_TYPE_SEQWRITE_REQ)
72f34dade8b1e1a Naohiro Aota 2020-11-10  206                            
set_bit(nreported, zone_info->seq_zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  207                    if 
(zones[i].cond == BLK_ZONE_COND_EMPTY)
72f34dade8b1e1a Naohiro Aota 2020-11-10  208                            
set_bit(nreported, zone_info->empty_zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  209                    nreported++;
72f34dade8b1e1a Naohiro Aota 2020-11-10  210            }
72f34dade8b1e1a Naohiro Aota 2020-11-10  211            sector = zones[nr_zones 
- 1].start + zones[nr_zones - 1].len;
72f34dade8b1e1a Naohiro Aota 2020-11-10  212    }
72f34dade8b1e1a Naohiro Aota 2020-11-10  213  
72f34dade8b1e1a Naohiro Aota 2020-11-10  214    if (nreported != 
zone_info->nr_zones) {
72f34dade8b1e1a Naohiro Aota 2020-11-10  215            
btrfs_err_in_rcu(device->fs_info,
72f34dade8b1e1a Naohiro Aota 2020-11-10  216                             
"inconsistent number of zones on %s (%u/%u)",
72f34dade8b1e1a Naohiro Aota 2020-11-10  217                             
rcu_str_deref(device->name), nreported,
72f34dade8b1e1a Naohiro Aota 2020-11-10  218                             
zone_info->nr_zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  219            ret = -EIO;
72f34dade8b1e1a Naohiro Aota 2020-11-10  220            goto out;
72f34dade8b1e1a Naohiro Aota 2020-11-10  221    }
72f34dade8b1e1a Naohiro Aota 2020-11-10  222  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  223    /* Validate superblock log */
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  224    nr_zones = 
BTRFS_NR_SB_LOG_ZONES;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  225    for (i = 0; i < 
BTRFS_SUPER_MIRROR_MAX; i++) {
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  226            u32 sb_zone;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  227            u64 sb_wp;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  228            int sb_pos = 
BTRFS_NR_SB_LOG_ZONES * i;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  229  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  230            sb_zone = 
sb_zone_number(zone_info->zone_size_shift, i);
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  231            if (sb_zone + 1 >= 
zone_info->nr_zones)
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  232                    continue;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  233  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10 @234            sector = sb_zone << 
(zone_info->zone_size_shift - SECTOR_SHIFT);
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  235            ret = 
btrfs_get_dev_zones(device, sector << SECTOR_SHIFT,
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  236                                    
  &zone_info->sb_zones[sb_pos],
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  237                                    
  &nr_zones);
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  238            if (ret)
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  239                    goto out;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  240  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  241            if (nr_zones != 
BTRFS_NR_SB_LOG_ZONES) {
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  242                    
btrfs_err_in_rcu(device->fs_info,
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  243    "zoned: failed to read super 
block log zone info at devid %llu zone %u",
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  244                                    
 device->devid, sb_zone);
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  245                    ret = -EUCLEAN;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  246                    goto out;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  247            }
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  248  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  249            /*
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  250             * If zones[0] is 
conventional, always use the beggining of the
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  251             * zone to record 
superblock. No need to validate in that case.
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  252             */
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  253            if 
(zone_info->sb_zones[BTRFS_NR_SB_LOG_ZONES * i].type ==
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  254                
BLK_ZONE_TYPE_CONVENTIONAL)
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  255                    continue;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  256  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  257            ret = 
sb_write_pointer(device->bdev,
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  258                                   
&zone_info->sb_zones[sb_pos], &sb_wp);
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  259            if (ret != -ENOENT && 
ret) {
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  260                    
btrfs_err_in_rcu(device->fs_info,
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  261                    "zoned: super 
block log zone corrupted devid %llu zone %u",
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  262                                    
 device->devid, sb_zone);
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  263                    ret = -EUCLEAN;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  264                    goto out;
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  265            }
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  266    }
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  267  
90ab5c54fc1f6c0 Naohiro Aota 2020-11-10  268  
72f34dade8b1e1a Naohiro Aota 2020-11-10  269    kfree(zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  270  
72f34dade8b1e1a Naohiro Aota 2020-11-10  271    device->zone_info = zone_info;
72f34dade8b1e1a Naohiro Aota 2020-11-10  272  
72f34dade8b1e1a Naohiro Aota 2020-11-10  273    /*
72f34dade8b1e1a Naohiro Aota 2020-11-10  274     * This function is called from 
open_fs_devices(), which is before
72f34dade8b1e1a Naohiro Aota 2020-11-10  275     * we set the device->fs_info. 
So, we use pr_info instead of
72f34dade8b1e1a Naohiro Aota 2020-11-10  276     * btrfs_info to avoid printing 
confusing message like "BTRFS info
72f34dade8b1e1a Naohiro Aota 2020-11-10  277     * (device <unknown>) ..."
72f34dade8b1e1a Naohiro Aota 2020-11-10  278     */
72f34dade8b1e1a Naohiro Aota 2020-11-10  279  
72f34dade8b1e1a Naohiro Aota 2020-11-10  280    rcu_read_lock();
72f34dade8b1e1a Naohiro Aota 2020-11-10  281    if (device->fs_info)
72f34dade8b1e1a Naohiro Aota 2020-11-10  282            
btrfs_info(device->fs_info,
72f34dade8b1e1a Naohiro Aota 2020-11-10  283                    "host-%s zoned 
block device %s, %u zones of %llu bytes",
72f34dade8b1e1a Naohiro Aota 2020-11-10  284                    
bdev_zoned_model(bdev) == BLK_ZONED_HM ? "managed" : "aware",
72f34dade8b1e1a Naohiro Aota 2020-11-10  285                    
rcu_str_deref(device->name), zone_info->nr_zones,
72f34dade8b1e1a Naohiro Aota 2020-11-10  286                    
zone_info->zone_size);
72f34dade8b1e1a Naohiro Aota 2020-11-10  287    else
72f34dade8b1e1a Naohiro Aota 2020-11-10  288            pr_info("BTRFS info: 
host-%s zoned block device %s, %u zones of %llu bytes",
72f34dade8b1e1a Naohiro Aota 2020-11-10  289                    
bdev_zoned_model(bdev) == BLK_ZONED_HM ? "managed" : "aware",
72f34dade8b1e1a Naohiro Aota 2020-11-10  290                    
rcu_str_deref(device->name), zone_info->nr_zones,
72f34dade8b1e1a Naohiro Aota 2020-11-10  291                    
zone_info->zone_size);
72f34dade8b1e1a Naohiro Aota 2020-11-10  292    rcu_read_unlock();
72f34dade8b1e1a Naohiro Aota 2020-11-10  293  
72f34dade8b1e1a Naohiro Aota 2020-11-10  294    return 0;
72f34dade8b1e1a Naohiro Aota 2020-11-10  295  
72f34dade8b1e1a Naohiro Aota 2020-11-10  296  out:
72f34dade8b1e1a Naohiro Aota 2020-11-10  297    kfree(zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  298    
bitmap_free(zone_info->empty_zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  299    
bitmap_free(zone_info->seq_zones);
72f34dade8b1e1a Naohiro Aota 2020-11-10  300    kfree(zone_info);
72f34dade8b1e1a Naohiro Aota 2020-11-10  301  
72f34dade8b1e1a Naohiro Aota 2020-11-10  302    return ret;
72f34dade8b1e1a Naohiro Aota 2020-11-10  303  }
72f34dade8b1e1a Naohiro Aota 2020-11-10  304  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to