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]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
