CC: [email protected] BCC: [email protected] CC: [email protected] TO: Qu Wenruo <[email protected]> CC: David Sterba <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 68453767131a5deec1e8f9ac92a9042f929e585d commit: e65f152e43484807b4caf7300e70d882e4652566 btrfs: refactor how we finish ordered extent io for endio functions date: 9 months ago :::::: branch date: 18 hours ago :::::: commit date: 9 months ago compiler: microblaze-linux-gcc (GCC) 11.2.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> cppcheck warnings: (new ones prefixed by >>) >> fs/btrfs/sysfs.c:1260:4: warning: %u in format string (no. 2) requires >> 'unsigned int' but the argument type is 'signed int'. >> [invalidPrintfArgType_uint] snprintf(name, BTRFS_FEATURE_NAME_MAX, "%s:%u", ^ >> kernel/trace/trace_events_synth.c:531:22: warning: Pointer addition with >> NULL pointer. [nullPointerArithmetic] pos += snprintf(buf + pos, LEN_OR_ZERO, """); ^ kernel/trace/trace_events_synth.c:563:43: note: Calling function '__set_synth_event_print_fmt', 2nd argument 'NULL' value is 0 len = __set_synth_event_print_fmt(event, NULL, 0); ^ kernel/trace/trace_events_synth.c:531:22: note: Null pointer addition pos += snprintf(buf + pos, LEN_OR_ZERO, """); ^ kernel/trace/trace_events_synth.c:538:22: warning: Pointer addition with NULL pointer. [nullPointerArithmetic] pos += snprintf(buf + pos, LEN_OR_ZERO, """); ^ kernel/trace/trace_events_synth.c:563:43: note: Calling function '__set_synth_event_print_fmt', 2nd argument 'NULL' value is 0 len = __set_synth_event_print_fmt(event, NULL, 0); ^ kernel/trace/trace_events_synth.c:538:22: note: Null pointer addition pos += snprintf(buf + pos, LEN_OR_ZERO, """); ^ cppcheck possible warnings: (new ones prefixed by >>, may not real problems) >> fs/btrfs/sysfs.c:1260:4: warning: %u in format string (no. 2) requires >> 'unsigned int' but the argument type is 'signed int'. >> [invalidPrintfArgType_uint] snprintf(name, BTRFS_FEATURE_NAME_MAX, "%s:%u", ^ >> fs/btrfs/ordered-data.c:341:7: warning: Local variable entry_end shadows >> outer function [shadowFunction] u64 entry_end; ^ fs/btrfs/ordered-data.c:22:12: note: Shadowed declaration static u64 entry_end(struct btrfs_ordered_extent *entry) ^ fs/btrfs/ordered-data.c:341:7: note: Shadow variable u64 entry_end; ^ vim +341 fs/btrfs/ordered-data.c dc17ff8f11d129 Chris Mason 2008-01-08 301 163cf09c2a0ee5 Chris Mason 2010-11-28 302 /* e65f152e434848 Qu Wenruo 2021-04-01 303 * Mark all ordered extents io inside the specified range finished. 163cf09c2a0ee5 Chris Mason 2010-11-28 304 * e65f152e434848 Qu Wenruo 2021-04-01 305 * @page: The invovled page for the opeartion. e65f152e434848 Qu Wenruo 2021-04-01 306 * For uncompressed buffered IO, the page status also needs to be e65f152e434848 Qu Wenruo 2021-04-01 307 * updated to indicate whether the pending ordered io is finished. e65f152e434848 Qu Wenruo 2021-04-01 308 * Can be NULL for direct IO and compressed write. e65f152e434848 Qu Wenruo 2021-04-01 309 * For these cases, callers are ensured they won't execute the e65f152e434848 Qu Wenruo 2021-04-01 310 * endio function twice. e65f152e434848 Qu Wenruo 2021-04-01 311 * @finish_func: The function to be executed when all the IO of an ordered e65f152e434848 Qu Wenruo 2021-04-01 312 * extent are finished. 163cf09c2a0ee5 Chris Mason 2010-11-28 313 * e65f152e434848 Qu Wenruo 2021-04-01 314 * This function is called for endio, thus the range must have ordered e65f152e434848 Qu Wenruo 2021-04-01 315 * extent(s) coveri it. 163cf09c2a0ee5 Chris Mason 2010-11-28 316 */ e65f152e434848 Qu Wenruo 2021-04-01 317 void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode, e65f152e434848 Qu Wenruo 2021-04-01 318 struct page *page, u64 file_offset, e65f152e434848 Qu Wenruo 2021-04-01 319 u64 num_bytes, btrfs_func_t finish_func, e65f152e434848 Qu Wenruo 2021-04-01 320 bool uptodate) 163cf09c2a0ee5 Chris Mason 2010-11-28 321 { 7095821ee1f57d Nikolay Borisov 2020-06-03 322 struct btrfs_ordered_inode_tree *tree = &inode->ordered_tree; e65f152e434848 Qu Wenruo 2021-04-01 323 struct btrfs_fs_info *fs_info = inode->root->fs_info; e65f152e434848 Qu Wenruo 2021-04-01 324 struct btrfs_workqueue *wq; 163cf09c2a0ee5 Chris Mason 2010-11-28 325 struct rb_node *node; 163cf09c2a0ee5 Chris Mason 2010-11-28 326 struct btrfs_ordered_extent *entry = NULL; 5fd02043553b02 Josef Bacik 2012-05-02 327 unsigned long flags; e65f152e434848 Qu Wenruo 2021-04-01 328 u64 cur = file_offset; e65f152e434848 Qu Wenruo 2021-04-01 329 e65f152e434848 Qu Wenruo 2021-04-01 330 if (btrfs_is_free_space_inode(inode)) e65f152e434848 Qu Wenruo 2021-04-01 331 wq = fs_info->endio_freespace_worker; e65f152e434848 Qu Wenruo 2021-04-01 332 else e65f152e434848 Qu Wenruo 2021-04-01 333 wq = fs_info->endio_write_workers; e65f152e434848 Qu Wenruo 2021-04-01 334 e65f152e434848 Qu Wenruo 2021-04-01 335 if (page) e65f152e434848 Qu Wenruo 2021-04-01 336 ASSERT(page->mapping && page_offset(page) <= file_offset && e65f152e434848 Qu Wenruo 2021-04-01 337 file_offset + num_bytes <= page_offset(page) + PAGE_SIZE); 163cf09c2a0ee5 Chris Mason 2010-11-28 338 5fd02043553b02 Josef Bacik 2012-05-02 339 spin_lock_irqsave(&tree->lock, flags); e65f152e434848 Qu Wenruo 2021-04-01 340 while (cur < file_offset + num_bytes) { e65f152e434848 Qu Wenruo 2021-04-01 @341 u64 entry_end; e65f152e434848 Qu Wenruo 2021-04-01 342 u64 end; e65f152e434848 Qu Wenruo 2021-04-01 343 u32 len; e65f152e434848 Qu Wenruo 2021-04-01 344 e65f152e434848 Qu Wenruo 2021-04-01 345 node = tree_search(tree, cur); e65f152e434848 Qu Wenruo 2021-04-01 346 /* No ordered extents at all */ 58f74b2203d786 Qu Wenruo 2020-12-22 347 if (!node) e65f152e434848 Qu Wenruo 2021-04-01 348 break; 163cf09c2a0ee5 Chris Mason 2010-11-28 349 163cf09c2a0ee5 Chris Mason 2010-11-28 350 entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); e65f152e434848 Qu Wenruo 2021-04-01 351 entry_end = entry->file_offset + entry->num_bytes; e65f152e434848 Qu Wenruo 2021-04-01 352 /* e65f152e434848 Qu Wenruo 2021-04-01 353 * |<-- OE --->| | e65f152e434848 Qu Wenruo 2021-04-01 354 * cur e65f152e434848 Qu Wenruo 2021-04-01 355 * Go to next OE. e65f152e434848 Qu Wenruo 2021-04-01 356 */ e65f152e434848 Qu Wenruo 2021-04-01 357 if (cur >= entry_end) { e65f152e434848 Qu Wenruo 2021-04-01 358 node = rb_next(node); e65f152e434848 Qu Wenruo 2021-04-01 359 /* No more ordered extents, exit */ e65f152e434848 Qu Wenruo 2021-04-01 360 if (!node) e65f152e434848 Qu Wenruo 2021-04-01 361 break; e65f152e434848 Qu Wenruo 2021-04-01 362 entry = rb_entry(node, struct btrfs_ordered_extent, e65f152e434848 Qu Wenruo 2021-04-01 363 rb_node); e65f152e434848 Qu Wenruo 2021-04-01 364 e65f152e434848 Qu Wenruo 2021-04-01 365 /* Go to next ordered extent and continue */ e65f152e434848 Qu Wenruo 2021-04-01 366 cur = entry->file_offset; e65f152e434848 Qu Wenruo 2021-04-01 367 continue; e65f152e434848 Qu Wenruo 2021-04-01 368 } e65f152e434848 Qu Wenruo 2021-04-01 369 /* e65f152e434848 Qu Wenruo 2021-04-01 370 * | |<--- OE --->| e65f152e434848 Qu Wenruo 2021-04-01 371 * cur e65f152e434848 Qu Wenruo 2021-04-01 372 * Go to the start of OE. e65f152e434848 Qu Wenruo 2021-04-01 373 */ e65f152e434848 Qu Wenruo 2021-04-01 374 if (cur < entry->file_offset) { e65f152e434848 Qu Wenruo 2021-04-01 375 cur = entry->file_offset; e65f152e434848 Qu Wenruo 2021-04-01 376 continue; 163cf09c2a0ee5 Chris Mason 2010-11-28 377 } e65f152e434848 Qu Wenruo 2021-04-01 378 e65f152e434848 Qu Wenruo 2021-04-01 379 /* e65f152e434848 Qu Wenruo 2021-04-01 380 * Now we are definitely inside one ordered extent. e65f152e434848 Qu Wenruo 2021-04-01 381 * e65f152e434848 Qu Wenruo 2021-04-01 382 * |<--- OE --->| e65f152e434848 Qu Wenruo 2021-04-01 383 * | e65f152e434848 Qu Wenruo 2021-04-01 384 * cur e65f152e434848 Qu Wenruo 2021-04-01 385 */ e65f152e434848 Qu Wenruo 2021-04-01 386 end = min(entry->file_offset + entry->num_bytes, e65f152e434848 Qu Wenruo 2021-04-01 387 file_offset + num_bytes) - 1; e65f152e434848 Qu Wenruo 2021-04-01 388 ASSERT(end + 1 - cur < U32_MAX); e65f152e434848 Qu Wenruo 2021-04-01 389 len = end + 1 - cur; e65f152e434848 Qu Wenruo 2021-04-01 390 e65f152e434848 Qu Wenruo 2021-04-01 391 if (page) { e65f152e434848 Qu Wenruo 2021-04-01 392 /* e65f152e434848 Qu Wenruo 2021-04-01 393 * Private2 bit indicates whether we still have pending e65f152e434848 Qu Wenruo 2021-04-01 394 * io unfinished for the ordered extent. e65f152e434848 Qu Wenruo 2021-04-01 395 * e65f152e434848 Qu Wenruo 2021-04-01 396 * If there's no such bit, we need to skip to next range. e65f152e434848 Qu Wenruo 2021-04-01 397 */ e65f152e434848 Qu Wenruo 2021-04-01 398 if (!PagePrivate2(page)) { e65f152e434848 Qu Wenruo 2021-04-01 399 cur += len; e65f152e434848 Qu Wenruo 2021-04-01 400 continue; e65f152e434848 Qu Wenruo 2021-04-01 401 } e65f152e434848 Qu Wenruo 2021-04-01 402 ClearPagePrivate2(page); e65f152e434848 Qu Wenruo 2021-04-01 403 } e65f152e434848 Qu Wenruo 2021-04-01 404 e65f152e434848 Qu Wenruo 2021-04-01 405 /* Now we're fine to update the accounting */ e65f152e434848 Qu Wenruo 2021-04-01 406 if (unlikely(len > entry->bytes_left)) { e65f152e434848 Qu Wenruo 2021-04-01 407 WARN_ON(1); 0b246afa62b0cf Jeff Mahoney 2016-06-22 408 btrfs_crit(fs_info, e65f152e434848 Qu Wenruo 2021-04-01 409 "bad ordered extent accounting, root=%llu ino=%llu OE offset=%llu OE len=%llu to_dec=%u left=%llu", e65f152e434848 Qu Wenruo 2021-04-01 410 inode->root->root_key.objectid, e65f152e434848 Qu Wenruo 2021-04-01 411 btrfs_ino(inode), e65f152e434848 Qu Wenruo 2021-04-01 412 entry->file_offset, e65f152e434848 Qu Wenruo 2021-04-01 413 entry->num_bytes, e65f152e434848 Qu Wenruo 2021-04-01 414 len, entry->bytes_left); e65f152e434848 Qu Wenruo 2021-04-01 415 entry->bytes_left = 0; e65f152e434848 Qu Wenruo 2021-04-01 416 } else { e65f152e434848 Qu Wenruo 2021-04-01 417 entry->bytes_left -= len; 163cf09c2a0ee5 Chris Mason 2010-11-28 418 } e65f152e434848 Qu Wenruo 2021-04-01 419 5fd02043553b02 Josef Bacik 2012-05-02 420 if (!uptodate) 5fd02043553b02 Josef Bacik 2012-05-02 421 set_bit(BTRFS_ORDERED_IOERR, &entry->flags); 5fd02043553b02 Josef Bacik 2012-05-02 422 58f74b2203d786 Qu Wenruo 2020-12-22 423 /* e65f152e434848 Qu Wenruo 2021-04-01 424 * All the IO of the ordered extent is finished, we need to queue e65f152e434848 Qu Wenruo 2021-04-01 425 * the finish_func to be executed. 58f74b2203d786 Qu Wenruo 2020-12-22 426 */ e65f152e434848 Qu Wenruo 2021-04-01 427 if (entry->bytes_left == 0) { e65f152e434848 Qu Wenruo 2021-04-01 428 set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); e65f152e434848 Qu Wenruo 2021-04-01 429 cond_wake_up(&entry->wait); e76edab7f059bc Elena Reshetova 2017-03-03 430 refcount_inc(&entry->refs); e65f152e434848 Qu Wenruo 2021-04-01 431 spin_unlock_irqrestore(&tree->lock, flags); e65f152e434848 Qu Wenruo 2021-04-01 432 btrfs_init_work(&entry->work, finish_func, NULL, NULL); e65f152e434848 Qu Wenruo 2021-04-01 433 btrfs_queue_work(wq, &entry->work); e65f152e434848 Qu Wenruo 2021-04-01 434 spin_lock_irqsave(&tree->lock, flags); e65f152e434848 Qu Wenruo 2021-04-01 435 } e65f152e434848 Qu Wenruo 2021-04-01 436 cur += len; 163cf09c2a0ee5 Chris Mason 2010-11-28 437 } 5fd02043553b02 Josef Bacik 2012-05-02 438 spin_unlock_irqrestore(&tree->lock, flags); 163cf09c2a0ee5 Chris Mason 2010-11-28 439 } 163cf09c2a0ee5 Chris Mason 2010-11-28 440 --- 0-DAY CI Kernel Test Service https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
