From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: Re: [PATCH v2] btrfs: Only require sector size alignment for parent eb bytenr
Date: Thu, 27 Aug 2020 02:51:40 +0800 [thread overview]
Message-ID: <202008270224.NJawgSgl%lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 16716 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20200826092643.113881-1-wqu@suse.com>
References: <20200826092643.113881-1-wqu@suse.com>
TO: Qu Wenruo <wqu@suse.com>
TO: linux-btrfs(a)vger.kernel.org
Hi Qu,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kdave/for-next]
[also build test WARNING on v5.9-rc2 next-20200826]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Qu-Wenruo/btrfs-Only-require-sector-size-alignment-for-parent-eb-bytenr/20200826-172817
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
:::::: branch date: 9 hours ago
:::::: commit date: 9 hours ago
config: x86_64-randconfig-m001-20200826 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
fs/btrfs/extent-tree.c:432 btrfs_get_extent_inline_ref_type() warn: '0x' prefix is confusing together with '%lu' specifier
fs/btrfs/extent-tree.c:432 btrfs_get_extent_inline_ref_type() warn: argument 4 to %lu specifier is cast from pointer
# https://github.com/0day-ci/linux/commit/45e82350ded690823247b2902c1cca52b4a4ead8
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Qu-Wenruo/btrfs-Only-require-sector-size-alignment-for-parent-eb-bytenr/20200826-172817
git checkout 45e82350ded690823247b2902c1cca52b4a4ead8
vim +432 fs/btrfs/extent-tree.c
a22285a6a32390 Yan, Zheng 2010-05-16 274
d8d5f3e16d1ae4 Chris Mason 2007-12-11 275 /*
d8d5f3e16d1ae4 Chris Mason 2007-12-11 276 * Back reference rules. Back refs have three main goals:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 277 *
d8d5f3e16d1ae4 Chris Mason 2007-12-11 278 * 1) differentiate between all holders of references to an extent so that
d8d5f3e16d1ae4 Chris Mason 2007-12-11 279 * when a reference is dropped we can make sure it was a valid reference
d8d5f3e16d1ae4 Chris Mason 2007-12-11 280 * before freeing the extent.
d8d5f3e16d1ae4 Chris Mason 2007-12-11 281 *
d8d5f3e16d1ae4 Chris Mason 2007-12-11 282 * 2) Provide enough information to quickly find the holders of an extent
d8d5f3e16d1ae4 Chris Mason 2007-12-11 283 * if we notice a given block is corrupted or bad.
d8d5f3e16d1ae4 Chris Mason 2007-12-11 284 *
d8d5f3e16d1ae4 Chris Mason 2007-12-11 285 * 3) Make it easy to migrate blocks for FS shrinking or storage pool
d8d5f3e16d1ae4 Chris Mason 2007-12-11 286 * maintenance. This is actually the same as #2, but with a slightly
d8d5f3e16d1ae4 Chris Mason 2007-12-11 287 * different use case.
d8d5f3e16d1ae4 Chris Mason 2007-12-11 288 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 289 * There are two kinds of back refs. The implicit back refs is optimized
5d4f98a28c7d33 Yan Zheng 2009-06-10 290 * for pointers in non-shared tree blocks. For a given pointer in a block,
5d4f98a28c7d33 Yan Zheng 2009-06-10 291 * back refs of this kind provide information about the block's owner tree
5d4f98a28c7d33 Yan Zheng 2009-06-10 292 * and the pointer's key. These information allow us to find the block by
5d4f98a28c7d33 Yan Zheng 2009-06-10 293 * b-tree searching. The full back refs is for pointers in tree blocks not
5d4f98a28c7d33 Yan Zheng 2009-06-10 294 * referenced by their owner trees. The location of tree block is recorded
5d4f98a28c7d33 Yan Zheng 2009-06-10 295 * in the back refs. Actually the full back refs is generic, and can be
5d4f98a28c7d33 Yan Zheng 2009-06-10 296 * used in all cases the implicit back refs is used. The major shortcoming
5d4f98a28c7d33 Yan Zheng 2009-06-10 297 * of the full back refs is its overhead. Every time a tree block gets
5d4f98a28c7d33 Yan Zheng 2009-06-10 298 * COWed, we have to update back refs entry for all pointers in it.
5d4f98a28c7d33 Yan Zheng 2009-06-10 299 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 300 * For a newly allocated tree block, we use implicit back refs for
5d4f98a28c7d33 Yan Zheng 2009-06-10 301 * pointers in it. This means most tree related operations only involve
5d4f98a28c7d33 Yan Zheng 2009-06-10 302 * implicit back refs. For a tree block created in old transaction, the
5d4f98a28c7d33 Yan Zheng 2009-06-10 303 * only way to drop a reference to it is COW it. So we can detect the
5d4f98a28c7d33 Yan Zheng 2009-06-10 304 * event that tree block loses its owner tree's reference and do the
5d4f98a28c7d33 Yan Zheng 2009-06-10 305 * back refs conversion.
5d4f98a28c7d33 Yan Zheng 2009-06-10 306 *
0132761017e012 Nicholas D Steeves 2016-05-19 307 * When a tree block is COWed through a tree, there are four cases:
5d4f98a28c7d33 Yan Zheng 2009-06-10 308 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 309 * The reference count of the block is one and the tree is the block's
5d4f98a28c7d33 Yan Zheng 2009-06-10 310 * owner tree. Nothing to do in this case.
5d4f98a28c7d33 Yan Zheng 2009-06-10 311 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 312 * The reference count of the block is one and the tree is not the
5d4f98a28c7d33 Yan Zheng 2009-06-10 313 * block's owner tree. In this case, full back refs is used for pointers
5d4f98a28c7d33 Yan Zheng 2009-06-10 314 * in the block. Remove these full back refs, add implicit back refs for
5d4f98a28c7d33 Yan Zheng 2009-06-10 315 * every pointers in the new block.
5d4f98a28c7d33 Yan Zheng 2009-06-10 316 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 317 * The reference count of the block is greater than one and the tree is
5d4f98a28c7d33 Yan Zheng 2009-06-10 318 * the block's owner tree. In this case, implicit back refs is used for
5d4f98a28c7d33 Yan Zheng 2009-06-10 319 * pointers in the block. Add full back refs for every pointers in the
5d4f98a28c7d33 Yan Zheng 2009-06-10 320 * block, increase lower level extents' reference counts. The original
5d4f98a28c7d33 Yan Zheng 2009-06-10 321 * implicit back refs are entailed to the new block.
5d4f98a28c7d33 Yan Zheng 2009-06-10 322 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 323 * The reference count of the block is greater than one and the tree is
5d4f98a28c7d33 Yan Zheng 2009-06-10 324 * not the block's owner tree. Add implicit back refs for every pointer in
5d4f98a28c7d33 Yan Zheng 2009-06-10 325 * the new block, increase lower level extents' reference count.
5d4f98a28c7d33 Yan Zheng 2009-06-10 326 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 327 * Back Reference Key composing:
5d4f98a28c7d33 Yan Zheng 2009-06-10 328 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 329 * The key objectid corresponds to the first byte in the extent,
5d4f98a28c7d33 Yan Zheng 2009-06-10 330 * The key type is used to differentiate between types of back refs.
5d4f98a28c7d33 Yan Zheng 2009-06-10 331 * There are different meanings of the key offset for different types
5d4f98a28c7d33 Yan Zheng 2009-06-10 332 * of back refs.
5d4f98a28c7d33 Yan Zheng 2009-06-10 333 *
d8d5f3e16d1ae4 Chris Mason 2007-12-11 334 * File extents can be referenced by:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 335 *
d8d5f3e16d1ae4 Chris Mason 2007-12-11 336 * - multiple snapshots, subvolumes, or different generations in one subvol
31840ae1a6b433 Zheng Yan 2008-09-23 337 * - different files inside a single subvolume
d8d5f3e16d1ae4 Chris Mason 2007-12-11 338 * - different offsets inside a file (bookend extents in file.c)
d8d5f3e16d1ae4 Chris Mason 2007-12-11 339 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 340 * The extent ref structure for the implicit back refs has fields for:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 341 *
d8d5f3e16d1ae4 Chris Mason 2007-12-11 342 * - Objectid of the subvolume root
d8d5f3e16d1ae4 Chris Mason 2007-12-11 343 * - objectid of the file holding the reference
5d4f98a28c7d33 Yan Zheng 2009-06-10 344 * - original offset in the file
5d4f98a28c7d33 Yan Zheng 2009-06-10 345 * - how many bookend extents
d8d5f3e16d1ae4 Chris Mason 2007-12-11 346 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 347 * The key offset for the implicit back refs is hash of the first
5d4f98a28c7d33 Yan Zheng 2009-06-10 348 * three fields.
d8d5f3e16d1ae4 Chris Mason 2007-12-11 349 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 350 * The extent ref structure for the full back refs has field for:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 351 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 352 * - number of pointers in the tree leaf
d8d5f3e16d1ae4 Chris Mason 2007-12-11 353 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 354 * The key offset for the implicit back refs is the first byte of
5d4f98a28c7d33 Yan Zheng 2009-06-10 355 * the tree leaf
d8d5f3e16d1ae4 Chris Mason 2007-12-11 356 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 357 * When a file extent is allocated, The implicit back refs is used.
5d4f98a28c7d33 Yan Zheng 2009-06-10 358 * the fields are filled in:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 359 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 360 * (root_key.objectid, inode objectid, offset in file, 1)
d8d5f3e16d1ae4 Chris Mason 2007-12-11 361 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 362 * When a file extent is removed file truncation, we find the
5d4f98a28c7d33 Yan Zheng 2009-06-10 363 * corresponding implicit back refs and check the following fields:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 364 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 365 * (btrfs_header_owner(leaf), inode objectid, offset in file)
d8d5f3e16d1ae4 Chris Mason 2007-12-11 366 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 367 * Btree extents can be referenced by:
d8d5f3e16d1ae4 Chris Mason 2007-12-11 368 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 369 * - Different subvolumes
d8d5f3e16d1ae4 Chris Mason 2007-12-11 370 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 371 * Both the implicit back refs and the full back refs for tree blocks
5d4f98a28c7d33 Yan Zheng 2009-06-10 372 * only consist of key. The key offset for the implicit back refs is
5d4f98a28c7d33 Yan Zheng 2009-06-10 373 * objectid of block's owner tree. The key offset for the full back refs
5d4f98a28c7d33 Yan Zheng 2009-06-10 374 * is the first byte of parent block.
d8d5f3e16d1ae4 Chris Mason 2007-12-11 375 *
5d4f98a28c7d33 Yan Zheng 2009-06-10 376 * When implicit back refs is used, information about the lowest key and
5d4f98a28c7d33 Yan Zheng 2009-06-10 377 * level of the tree block are required. These information are stored in
5d4f98a28c7d33 Yan Zheng 2009-06-10 378 * tree block info structure.
d8d5f3e16d1ae4 Chris Mason 2007-12-11 379 */
31840ae1a6b433 Zheng Yan 2008-09-23 380
167ce953ca55bd Liu Bo 2017-08-18 381 /*
167ce953ca55bd Liu Bo 2017-08-18 382 * is_data == BTRFS_REF_TYPE_BLOCK, tree block type is required,
52042d8e82ff50 Andrea Gelmini 2018-11-28 383 * is_data == BTRFS_REF_TYPE_DATA, data type is requiried,
167ce953ca55bd Liu Bo 2017-08-18 384 * is_data == BTRFS_REF_TYPE_ANY, either type is OK.
167ce953ca55bd Liu Bo 2017-08-18 385 */
167ce953ca55bd Liu Bo 2017-08-18 386 int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb,
167ce953ca55bd Liu Bo 2017-08-18 387 struct btrfs_extent_inline_ref *iref,
167ce953ca55bd Liu Bo 2017-08-18 388 enum btrfs_inline_ref_type is_data)
167ce953ca55bd Liu Bo 2017-08-18 389 {
167ce953ca55bd Liu Bo 2017-08-18 390 int type = btrfs_extent_inline_ref_type(eb, iref);
64ecdb647ddb83 Liu Bo 2017-08-18 391 u64 offset = btrfs_extent_inline_ref_offset(eb, iref);
167ce953ca55bd Liu Bo 2017-08-18 392
167ce953ca55bd Liu Bo 2017-08-18 393 if (type == BTRFS_TREE_BLOCK_REF_KEY ||
167ce953ca55bd Liu Bo 2017-08-18 394 type == BTRFS_SHARED_BLOCK_REF_KEY ||
167ce953ca55bd Liu Bo 2017-08-18 395 type == BTRFS_SHARED_DATA_REF_KEY ||
167ce953ca55bd Liu Bo 2017-08-18 396 type == BTRFS_EXTENT_DATA_REF_KEY) {
167ce953ca55bd Liu Bo 2017-08-18 397 if (is_data == BTRFS_REF_TYPE_BLOCK) {
64ecdb647ddb83 Liu Bo 2017-08-18 398 if (type == BTRFS_TREE_BLOCK_REF_KEY)
167ce953ca55bd Liu Bo 2017-08-18 399 return type;
64ecdb647ddb83 Liu Bo 2017-08-18 400 if (type == BTRFS_SHARED_BLOCK_REF_KEY) {
64ecdb647ddb83 Liu Bo 2017-08-18 401 ASSERT(eb->fs_info);
64ecdb647ddb83 Liu Bo 2017-08-18 402 /*
64ecdb647ddb83 Liu Bo 2017-08-18 403 * Every shared one has parent tree
64ecdb647ddb83 Liu Bo 2017-08-18 404 * block, which must be aligned to
45e82350ded690 Qu Wenruo 2020-08-26 405 * sector size.
64ecdb647ddb83 Liu Bo 2017-08-18 406 */
64ecdb647ddb83 Liu Bo 2017-08-18 407 if (offset &&
45e82350ded690 Qu Wenruo 2020-08-26 408 IS_ALIGNED(offset, eb->fs_info->sectorsize))
64ecdb647ddb83 Liu Bo 2017-08-18 409 return type;
64ecdb647ddb83 Liu Bo 2017-08-18 410 }
167ce953ca55bd Liu Bo 2017-08-18 411 } else if (is_data == BTRFS_REF_TYPE_DATA) {
64ecdb647ddb83 Liu Bo 2017-08-18 412 if (type == BTRFS_EXTENT_DATA_REF_KEY)
167ce953ca55bd Liu Bo 2017-08-18 413 return type;
64ecdb647ddb83 Liu Bo 2017-08-18 414 if (type == BTRFS_SHARED_DATA_REF_KEY) {
64ecdb647ddb83 Liu Bo 2017-08-18 415 ASSERT(eb->fs_info);
64ecdb647ddb83 Liu Bo 2017-08-18 416 /*
64ecdb647ddb83 Liu Bo 2017-08-18 417 * Every shared one has parent tree
64ecdb647ddb83 Liu Bo 2017-08-18 418 * block, which must be aligned to
45e82350ded690 Qu Wenruo 2020-08-26 419 * sector size.
64ecdb647ddb83 Liu Bo 2017-08-18 420 */
64ecdb647ddb83 Liu Bo 2017-08-18 421 if (offset &&
45e82350ded690 Qu Wenruo 2020-08-26 422 IS_ALIGNED(offset, eb->fs_info->sectorsize))
64ecdb647ddb83 Liu Bo 2017-08-18 423 return type;
64ecdb647ddb83 Liu Bo 2017-08-18 424 }
167ce953ca55bd Liu Bo 2017-08-18 425 } else {
167ce953ca55bd Liu Bo 2017-08-18 426 ASSERT(is_data == BTRFS_REF_TYPE_ANY);
167ce953ca55bd Liu Bo 2017-08-18 427 return type;
167ce953ca55bd Liu Bo 2017-08-18 428 }
167ce953ca55bd Liu Bo 2017-08-18 429 }
167ce953ca55bd Liu Bo 2017-08-18 430
167ce953ca55bd Liu Bo 2017-08-18 431 btrfs_print_leaf((struct extent_buffer *)eb);
45e82350ded690 Qu Wenruo 2020-08-26 @432 btrfs_err(eb->fs_info,
45e82350ded690 Qu Wenruo 2020-08-26 433 "eb %llu iref 0x%lu invalid extent inline ref type %d",
45e82350ded690 Qu Wenruo 2020-08-26 434 eb->start, (unsigned long)iref, type);
167ce953ca55bd Liu Bo 2017-08-18 435 WARN_ON(1);
167ce953ca55bd Liu Bo 2017-08-18 436
167ce953ca55bd Liu Bo 2017-08-18 437 return BTRFS_REF_TYPE_INVALID;
167ce953ca55bd Liu Bo 2017-08-18 438 }
167ce953ca55bd Liu Bo 2017-08-18 439
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 40919 bytes --]
next reply other threads:[~2020-08-26 18:51 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-26 18:51 kernel test robot [this message]
-- strict thread matches above, loose matches on Subject: below --
2020-08-26 9:26 [PATCH v2] btrfs: Only require sector size alignment for parent eb bytenr Qu Wenruo
2020-08-26 14:18 ` Josef Bacik
2020-08-26 22:51 ` Qu Wenruo
2020-09-03 11:44 ` David Sterba
2020-09-03 11:53 ` David Sterba
2020-03-26 5:54 Qu Wenruo
2020-04-03 8:11 ` Dan Carpenter
2020-04-03 8:11 ` Dan Carpenter
2020-04-03 8:11 ` Dan Carpenter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202008270224.NJawgSgl%lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.