tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
master
head:   a1d21081a60dfb7fddf4a38b66d9cef603b317a9
commit: c17af96554a8a8777cbb0fd53b8497250e548b43 btrfs: raid56: simplify 
tracking of Q stripe presence
date:   5 months ago
config: ia64-randconfig-m031-20200811 (attached as .config)
compiler: ia64-linux-gcc (GCC) 9.3.0

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

New smatch warnings:
fs/btrfs/raid56.c:1255 finish_rmw() error: uninitialized symbol 'has_qstripe'.
fs/btrfs/raid56.c:2390 finish_parity_scrub() error: uninitialized symbol 
'has_qstripe'.

Old smatch warnings:
fs/btrfs/raid56.c:2431 finish_parity_scrub() error: memcmp() 'parity' too small 
(4096 vs 16384)

vim +/has_qstripe +1255 fs/btrfs/raid56.c

  1183  
  1184  /*
  1185   * this is called from one of two situations.  We either
  1186   * have a full stripe from the higher layers, or we've read all
  1187   * the missing bits off disk.
  1188   *
  1189   * This will calculate the parity and then send down any
  1190   * changed blocks.
  1191   */
  1192  static noinline void finish_rmw(struct btrfs_raid_bio *rbio)
  1193  {
  1194          struct btrfs_bio *bbio = rbio->bbio;
  1195          void **pointers = rbio->finish_pointers;
  1196          int nr_data = rbio->nr_data;
  1197          int stripe;
  1198          int pagenr;
  1199          bool has_qstripe;
  1200          struct bio_list bio_list;
  1201          struct bio *bio;
  1202          int ret;
  1203  
  1204          bio_list_init(&bio_list);
  1205  
  1206          if (rbio->real_stripes - rbio->nr_data == 1)
  1207                  has_qstripe = false;
  1208          else if (rbio->real_stripes - rbio->nr_data == 2)
  1209                  has_qstripe = true;
  1210          else
  1211                  BUG();
  1212  
  1213          /* at this point we either have a full stripe,
  1214           * or we've read the full stripe from the drive.
  1215           * recalculate the parity and write the new results.
  1216           *
  1217           * We're not allowed to add any new bios to the
  1218           * bio list here, anyone else that wants to
  1219           * change this stripe needs to do their own rmw.
  1220           */
  1221          spin_lock_irq(&rbio->bio_list_lock);
  1222          set_bit(RBIO_RMW_LOCKED_BIT, &rbio->flags);
  1223          spin_unlock_irq(&rbio->bio_list_lock);
  1224  
  1225          atomic_set(&rbio->error, 0);
  1226  
  1227          /*
  1228           * now that we've set rmw_locked, run through the
  1229           * bio list one last time and map the page pointers
  1230           *
  1231           * We don't cache full rbios because we're assuming
  1232           * the higher layers are unlikely to use this area of
  1233           * the disk again soon.  If they do use it again,
  1234           * hopefully they will send another full bio.
  1235           */
  1236          index_rbio_pages(rbio);
  1237          if (!rbio_is_full(rbio))
  1238                  cache_rbio_pages(rbio);
  1239          else
  1240                  clear_bit(RBIO_CACHE_READY_BIT, &rbio->flags);
  1241  
  1242          for (pagenr = 0; pagenr < rbio->stripe_npages; pagenr++) {
  1243                  struct page *p;
  1244                  /* first collect one page from each data stripe */
  1245                  for (stripe = 0; stripe < nr_data; stripe++) {
  1246                          p = page_in_rbio(rbio, stripe, pagenr, 0);
  1247                          pointers[stripe] = kmap(p);
  1248                  }
  1249  
  1250                  /* then add the parity stripe */
  1251                  p = rbio_pstripe_page(rbio, pagenr);
  1252                  SetPageUptodate(p);
  1253                  pointers[stripe++] = kmap(p);
  1254  
> 1255                  if (has_qstripe) {
  1256  
  1257                          /*
  1258                           * raid6, add the qstripe and call the
  1259                           * library function to fill in our p/q
  1260                           */
  1261                          p = rbio_qstripe_page(rbio, pagenr);
  1262                          SetPageUptodate(p);
  1263                          pointers[stripe++] = kmap(p);
  1264  
  1265                          raid6_call.gen_syndrome(rbio->real_stripes, 
PAGE_SIZE,
  1266                                                  pointers);
  1267                  } else {
  1268                          /* raid5 */
  1269                          copy_page(pointers[nr_data], pointers[0]);
  1270                          run_xor(pointers + 1, nr_data - 1, PAGE_SIZE);
  1271                  }
  1272  
  1273  
  1274                  for (stripe = 0; stripe < rbio->real_stripes; stripe++)
  1275                          kunmap(page_in_rbio(rbio, stripe, pagenr, 0));
  1276          }
  1277  
  1278          /*
  1279           * time to start writing.  Make bios for everything from the
  1280           * higher layers (the bio_list in our rbio) and our p/q.  Ignore
  1281           * everything else.
  1282           */
  1283          for (stripe = 0; stripe < rbio->real_stripes; stripe++) {
  1284                  for (pagenr = 0; pagenr < rbio->stripe_npages; 
pagenr++) {
  1285                          struct page *page;
  1286                          if (stripe < rbio->nr_data) {
  1287                                  page = page_in_rbio(rbio, stripe, 
pagenr, 1);
  1288                                  if (!page)
  1289                                          continue;
  1290                          } else {
  1291                                 page = rbio_stripe_page(rbio, stripe, 
pagenr);
  1292                          }
  1293  
  1294                          ret = rbio_add_io_page(rbio, &bio_list,
  1295                                         page, stripe, pagenr, 
rbio->stripe_len);
  1296                          if (ret)
  1297                                  goto cleanup;
  1298                  }
  1299          }
  1300  
  1301          if (likely(!bbio->num_tgtdevs))
  1302                  goto write_data;
  1303  
  1304          for (stripe = 0; stripe < rbio->real_stripes; stripe++) {
  1305                  if (!bbio->tgtdev_map[stripe])
  1306                          continue;
  1307  
  1308                  for (pagenr = 0; pagenr < rbio->stripe_npages; 
pagenr++) {
  1309                          struct page *page;
  1310                          if (stripe < rbio->nr_data) {
  1311                                  page = page_in_rbio(rbio, stripe, 
pagenr, 1);
  1312                                  if (!page)
  1313                                          continue;
  1314                          } else {
  1315                                 page = rbio_stripe_page(rbio, stripe, 
pagenr);
  1316                          }
  1317  
  1318                          ret = rbio_add_io_page(rbio, &bio_list, page,
  1319                                                 
rbio->bbio->tgtdev_map[stripe],
  1320                                                 pagenr, 
rbio->stripe_len);
  1321                          if (ret)
  1322                                  goto cleanup;
  1323                  }
  1324          }
  1325  
  1326  write_data:
  1327          atomic_set(&rbio->stripes_pending, bio_list_size(&bio_list));
  1328          BUG_ON(atomic_read(&rbio->stripes_pending) == 0);
  1329  
  1330          while (1) {
  1331                  bio = bio_list_pop(&bio_list);
  1332                  if (!bio)
  1333                          break;
  1334  
  1335                  bio->bi_private = rbio;
  1336                  bio->bi_end_io = raid_write_end_io;
  1337                  bio->bi_opf = REQ_OP_WRITE;
  1338  
  1339                  submit_bio(bio);
  1340          }
  1341          return;
  1342  
  1343  cleanup:
  1344          rbio_orig_end_io(rbio, BLK_STS_IOERR);
  1345  
  1346          while ((bio = bio_list_pop(&bio_list)))
  1347                  bio_put(bio);
  1348  }
  1349  

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

Attachment: .config.gz
Description: application/gzip

Reply via email to