From: Dan Carpenter <dan.carpenter@oracle.com>
To: yuchao0@huawei.com
Cc: linux-f2fs-devel@lists.sourceforge.net
Subject: [bug report] f2fs: use rb_*_cached friends
Date: Thu, 11 Oct 2018 15:23:42 +0300 [thread overview]
Message-ID: <20181011122342.GA23299@mwanda> (raw)
Hello Chao Yu,
The patch df634f444ee9: "f2fs: use rb_*_cached friends" from Oct 4,
2018, leads to the following static checker warning:
fs/f2fs/extent_cache.c:606 f2fs_update_extent_tree_range()
error: uninitialized symbol 'leftmost'.
fs/f2fs/extent_cache.c
497 static void f2fs_update_extent_tree_range(struct inode *inode,
498 pgoff_t fofs, block_t blkaddr, unsigned int len)
499 {
500 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
501 struct extent_tree *et = F2FS_I(inode)->extent_tree;
502 struct extent_node *en = NULL, *en1 = NULL;
503 struct extent_node *prev_en = NULL, *next_en = NULL;
504 struct extent_info ei, dei, prev;
505 struct rb_node **insert_p = NULL, *insert_parent = NULL;
506 unsigned int end = fofs + len;
507 unsigned int pos = (unsigned int)fofs;
508 bool updated = false;
509 bool leftmost;
510
511 if (!et)
512 return;
513
514 trace_f2fs_update_extent_tree_range(inode, fofs, blkaddr, len);
515
516 write_lock(&et->lock);
517
518 if (is_inode_flag_set(inode, FI_NO_EXTENT)) {
519 write_unlock(&et->lock);
520 return;
521 }
522
523 prev = et->largest;
524 dei.len = 0;
525
526 /*
527 * drop largest extent before lookup, in case it's already
528 * been shrunk from extent tree
529 */
530 __drop_largest_extent(et, fofs, len);
531
532 /* 1. lookup first extent node in range [fofs, fofs + len - 1] */
533 en = (struct extent_node *)f2fs_lookup_rb_tree_ret(&et->root,
534 (struct rb_entry *)et->cached_en, fofs,
535 (struct rb_entry **)&prev_en,
536 (struct rb_entry **)&next_en,
537 &insert_p, &insert_parent, false,
538 &leftmost);
^^^^^^^^
Not always initialized in there.
539 if (!en)
540 en = next_en;
541
542 /* 2. invlidate all extent nodes in range [fofs, fofs + len - 1] */
543 while (en && en->ei.fofs < end) {
544 unsigned int org_end;
545 int parts = 0; /* # of parts current extent split into */
546
547 next_en = en1 = NULL;
548
549 dei = en->ei;
550 org_end = dei.fofs + dei.len;
551 f2fs_bug_on(sbi, pos >= org_end);
552
553 if (pos > dei.fofs && pos - dei.fofs >= F2FS_MIN_EXTENT_LEN) {
554 en->ei.len = pos - en->ei.fofs;
555 prev_en = en;
556 parts = 1;
557 }
558
559 if (end < org_end && org_end - end >= F2FS_MIN_EXTENT_LEN) {
560 if (parts) {
561 set_extent_info(&ei, end,
562 end - dei.fofs + dei.blk,
563 org_end - end);
564 en1 = __insert_extent_tree(sbi, et, &ei,
565 NULL, NULL, true);
566 next_en = en1;
567 } else {
568 en->ei.fofs = end;
569 en->ei.blk += end - dei.fofs;
570 en->ei.len -= end - dei.fofs;
571 next_en = en;
572 }
573 parts++;
574 }
575
576 if (!next_en) {
577 struct rb_node *node = rb_next(&en->rb_node);
578
579 next_en = rb_entry_safe(node, struct extent_node,
580 rb_node);
581 }
582
583 if (parts)
584 __try_update_largest_extent(et, en);
585 else
586 __release_extent_node(sbi, et, en);
587
588 /*
589 * if original extent is split into zero or two parts, extent
590 * tree has been altered by deletion or insertion, therefore
591 * invalidate pointers regard to tree.
592 */
593 if (parts != 1) {
594 insert_p = NULL;
595 insert_parent = NULL;
596 }
597 en = next_en;
598 }
599
600 /* 3. update extent in extent cache */
601 if (blkaddr) {
602
603 set_extent_info(&ei, fofs, blkaddr, len);
604 if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
605 __insert_extent_tree(sbi, et, &ei,
606 insert_p, insert_parent, leftmost);
^^^^^^^^
Smatch complains, but I'm to stupid to know if it's valid.
607
608 /* give up extent_cache, if split and small updates happen */
609 if (dei.len >= 1 &&
610 prev.len < F2FS_MIN_EXTENT_LEN &&
611 et->largest.len < F2FS_MIN_EXTENT_LEN) {
612 et->largest.len = 0;
613 et->largest_updated = true;
614 set_inode_flag(inode, FI_NO_EXTENT);
615 }
616 }
regards,
dan carpenter
next reply other threads:[~2018-10-11 12:24 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-11 12:23 Dan Carpenter [this message]
2018-10-12 14:00 ` [bug report] f2fs: use rb_*_cached friends Chao Yu
2018-10-12 14:18 ` Dan Carpenter
2018-10-12 14:31 ` Chao Yu
2019-01-10 22:51 ` Eric Biggers
2019-01-11 2:00 ` Chao Yu
2019-01-11 6:55 ` 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=20181011122342.GA23299@mwanda \
--to=dan.carpenter@oracle.com \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=yuchao0@huawei.com \
/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.