From: kernel test robot <lkp@intel.com>
To: Roman Anasal <roman.anasal@bdsu.de>, linux-btrfs@vger.kernel.org
Cc: kbuild-all@lists.01.org, Roman Anasal <roman.anasal@bdsu.de>
Subject: Re: [PATCH 2/2] btrfs: send: fix invalid commands for inodes with changed type but same gen
Date: Tue, 12 Jan 2021 05:19:57 +0800 [thread overview]
Message-ID: <202101120515.FJAsu4W6-lkp@intel.com> (raw)
In-Reply-To: <20210111190243.4152-3-roman.anasal@bdsu.de>
[-- Attachment #1: Type: text/plain, Size: 9020 bytes --]
Hi Roman,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on kdave/for-next]
[also build test WARNING on btrfs/next v5.11-rc3 next-20210111]
[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/Roman-Anasal/btrfs-send-correctly-recreate-changed-inodes/20210112-030653
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/0day-ci/linux/commit/2993e0e565f9215fc3e4cedd9b1b9bc8df6dbdad
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Roman-Anasal/btrfs-send-correctly-recreate-changed-inodes/20210112-030653
git checkout 2993e0e565f9215fc3e4cedd9b1b9bc8df6dbdad
# save the attached .config to linux build tree
make W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
fs/btrfs/send.c: In function 'changed_inode':
>> fs/btrfs/send.c:6289:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
6289 | u64 left_type = S_IFMT & btrfs_inode_mode(
| ^~~
vim +6289 fs/btrfs/send.c
6243
6244 static int changed_inode(struct send_ctx *sctx,
6245 enum btrfs_compare_tree_result result)
6246 {
6247 int ret = 0;
6248 struct btrfs_key *key = sctx->cmp_key;
6249 struct btrfs_inode_item *left_ii = NULL;
6250 struct btrfs_inode_item *right_ii = NULL;
6251 u64 left_gen = 0;
6252 u64 right_gen = 0;
6253
6254 sctx->cur_ino = key->objectid;
6255 sctx->cur_inode_recreated = 0;
6256 sctx->cur_inode_last_extent = (u64)-1;
6257 sctx->cur_inode_next_write_offset = 0;
6258 sctx->ignore_cur_inode = false;
6259
6260 /*
6261 * Set send_progress to current inode. This will tell all get_cur_xxx
6262 * functions that the current inode's refs are not updated yet. Later,
6263 * when process_recorded_refs is finished, it is set to cur_ino + 1.
6264 */
6265 sctx->send_progress = sctx->cur_ino;
6266
6267 if (result == BTRFS_COMPARE_TREE_NEW ||
6268 result == BTRFS_COMPARE_TREE_CHANGED) {
6269 left_ii = btrfs_item_ptr(sctx->left_path->nodes[0],
6270 sctx->left_path->slots[0],
6271 struct btrfs_inode_item);
6272 left_gen = btrfs_inode_generation(sctx->left_path->nodes[0],
6273 left_ii);
6274 } else {
6275 right_ii = btrfs_item_ptr(sctx->right_path->nodes[0],
6276 sctx->right_path->slots[0],
6277 struct btrfs_inode_item);
6278 right_gen = btrfs_inode_generation(sctx->right_path->nodes[0],
6279 right_ii);
6280 }
6281 if (result == BTRFS_COMPARE_TREE_CHANGED) {
6282 right_ii = btrfs_item_ptr(sctx->right_path->nodes[0],
6283 sctx->right_path->slots[0],
6284 struct btrfs_inode_item);
6285
6286 right_gen = btrfs_inode_generation(sctx->right_path->nodes[0],
6287 right_ii);
6288
> 6289 u64 left_type = S_IFMT & btrfs_inode_mode(
6290 sctx->left_path->nodes[0], left_ii);
6291 u64 right_type = S_IFMT & btrfs_inode_mode(
6292 sctx->right_path->nodes[0], right_ii);
6293
6294
6295 /*
6296 * The cur_ino = root dir case is special here. We can't treat
6297 * the inode as deleted+reused because it would generate a
6298 * stream that tries to delete/mkdir the root dir.
6299 */
6300 if ((left_gen != right_gen || left_type != right_type) &&
6301 sctx->cur_ino != BTRFS_FIRST_FREE_OBJECTID)
6302 sctx->cur_inode_recreated = 1;
6303 }
6304
6305 /*
6306 * Normally we do not find inodes with a link count of zero (orphans)
6307 * because the most common case is to create a snapshot and use it
6308 * for a send operation. However other less common use cases involve
6309 * using a subvolume and send it after turning it to RO mode just
6310 * after deleting all hard links of a file while holding an open
6311 * file descriptor against it or turning a RO snapshot into RW mode,
6312 * keep an open file descriptor against a file, delete it and then
6313 * turn the snapshot back to RO mode before using it for a send
6314 * operation. So if we find such cases, ignore the inode and all its
6315 * items completely if it's a new inode, or if it's a changed inode
6316 * make sure all its previous paths (from the parent snapshot) are all
6317 * unlinked and all other the inode items are ignored.
6318 */
6319 if (result == BTRFS_COMPARE_TREE_NEW ||
6320 result == BTRFS_COMPARE_TREE_CHANGED) {
6321 u32 nlinks;
6322
6323 nlinks = btrfs_inode_nlink(sctx->left_path->nodes[0], left_ii);
6324 if (nlinks == 0) {
6325 sctx->ignore_cur_inode = true;
6326 if (result == BTRFS_COMPARE_TREE_CHANGED)
6327 ret = btrfs_unlink_all_paths(sctx);
6328 goto out;
6329 }
6330 }
6331
6332 if (result == BTRFS_COMPARE_TREE_NEW) {
6333 sctx->cur_inode_gen = left_gen;
6334 sctx->cur_inode_new = 1;
6335 sctx->cur_inode_deleted = 0;
6336 sctx->cur_inode_size = btrfs_inode_size(
6337 sctx->left_path->nodes[0], left_ii);
6338 sctx->cur_inode_mode = btrfs_inode_mode(
6339 sctx->left_path->nodes[0], left_ii);
6340 sctx->cur_inode_rdev = btrfs_inode_rdev(
6341 sctx->left_path->nodes[0], left_ii);
6342 if (sctx->cur_ino != BTRFS_FIRST_FREE_OBJECTID)
6343 ret = send_create_inode_if_needed(sctx);
6344 } else if (result == BTRFS_COMPARE_TREE_DELETED) {
6345 sctx->cur_inode_gen = right_gen;
6346 sctx->cur_inode_new = 0;
6347 sctx->cur_inode_deleted = 1;
6348 sctx->cur_inode_size = btrfs_inode_size(
6349 sctx->right_path->nodes[0], right_ii);
6350 sctx->cur_inode_mode = btrfs_inode_mode(
6351 sctx->right_path->nodes[0], right_ii);
6352 } else if (result == BTRFS_COMPARE_TREE_CHANGED) {
6353 /*
6354 * We need to do some special handling in case the inode was
6355 * reported as changed with a changed generation number or
6356 * changed inode type. This means that the original inode was
6357 * deleted and new inode reused the same inum. So we have to
6358 * treat the old inode as deleted and the new one as new.
6359 */
6360 if (sctx->cur_inode_recreated) {
6361 /*
6362 * First, process the inode as if it was deleted.
6363 */
6364 sctx->cur_inode_gen = right_gen;
6365 sctx->cur_inode_new = 0;
6366 sctx->cur_inode_deleted = 1;
6367 sctx->cur_inode_size = btrfs_inode_size(
6368 sctx->right_path->nodes[0], right_ii);
6369 sctx->cur_inode_mode = btrfs_inode_mode(
6370 sctx->right_path->nodes[0], right_ii);
6371 ret = process_all_refs(sctx,
6372 BTRFS_COMPARE_TREE_DELETED);
6373 if (ret < 0)
6374 goto out;
6375
6376 /*
6377 * Now process the inode as if it was new.
6378 */
6379 sctx->cur_inode_gen = left_gen;
6380 sctx->cur_inode_new = 1;
6381 sctx->cur_inode_deleted = 0;
6382 sctx->cur_inode_size = btrfs_inode_size(
6383 sctx->left_path->nodes[0], left_ii);
6384 sctx->cur_inode_mode = btrfs_inode_mode(
6385 sctx->left_path->nodes[0], left_ii);
6386 sctx->cur_inode_rdev = btrfs_inode_rdev(
6387 sctx->left_path->nodes[0], left_ii);
6388 ret = send_create_inode_if_needed(sctx);
6389 if (ret < 0)
6390 goto out;
6391
6392 ret = process_all_refs(sctx, BTRFS_COMPARE_TREE_NEW);
6393 if (ret < 0)
6394 goto out;
6395 /*
6396 * Advance send_progress now as we did not get into
6397 * process_recorded_refs_if_needed in the
6398 * cur_inode_recreated case.
6399 */
6400 sctx->send_progress = sctx->cur_ino + 1;
6401
6402 /*
6403 * Now process all extents and xattrs of the inode as if
6404 * they were all new.
6405 */
6406 ret = process_all_extents(sctx);
6407 if (ret < 0)
6408 goto out;
6409 ret = process_all_new_xattrs(sctx);
6410 if (ret < 0)
6411 goto out;
6412 } else {
6413 sctx->cur_inode_gen = left_gen;
6414 sctx->cur_inode_new = 0;
6415 sctx->cur_inode_recreated = 0;
6416 sctx->cur_inode_deleted = 0;
6417 sctx->cur_inode_size = btrfs_inode_size(
6418 sctx->left_path->nodes[0], left_ii);
6419 sctx->cur_inode_mode = btrfs_inode_mode(
6420 sctx->left_path->nodes[0], left_ii);
6421 }
6422 }
6423
6424 out:
6425 return ret;
6426 }
6427
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 75883 bytes --]
prev parent reply other threads:[~2021-01-11 21:20 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-11 19:02 [PATCH 0/2] btrfs: send: correctly recreate changed inodes Roman Anasal
2021-01-11 19:02 ` [PATCH 1/2] btrfs: send: rename send_ctx.cur_inode_new_gen to cur_inode_recreated Roman Anasal
2021-01-11 19:02 ` [PATCH 2/2] btrfs: send: fix invalid commands for inodes with changed type but same gen Roman Anasal
2021-01-11 19:30 ` Andrei Borzenkov
2021-01-11 20:53 ` Roman Anasal | BDSU
2021-01-12 11:27 ` Filipe Manana
2021-01-12 12:07 ` Graham Cobb
2021-01-12 12:30 ` Filipe Manana
2021-01-12 13:10 ` Roman Anasal | BDSU
2021-01-12 13:54 ` Filipe Manana
2021-01-12 14:37 ` Roman Anasal | BDSU
2021-01-12 15:08 ` Filipe Manana
2021-01-11 21:15 ` David Sterba
2021-01-11 21:31 ` Roman Anasal | BDSU
2021-01-11 21:19 ` kernel test robot [this message]
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=202101120515.FJAsu4W6-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=roman.anasal@bdsu.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox