CC: [email protected] In-Reply-To: <35bfc17e94d10d179574a47550a4fdcfa4e4fe9a.1642676248.git.fdman...@suse.com> References: <35bfc17e94d10d179574a47550a4fdcfa4e4fe9a.1642676248.git.fdman...@suse.com> TO: [email protected]
Hi, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on kdave/for-next] [also build test WARNING on next-20220121] [cannot apply to v5.16] [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/fdmanana-kernel-org/btrfs-speedup-and-avoid-inode-logging-during-rename-link/20220120-190150 base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next :::::: branch date: 28 hours ago :::::: commit date: 28 hours ago config: x86_64-rhel-8.3-kselftests (https://download.01.org/0day-ci/archive/20220121/[email protected]/config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> New smatch warnings: fs/btrfs/tree-log.c:5940 btrfs_log_inode() warn: inconsistent returns '&inode->log_mutex'. Old smatch warnings: fs/btrfs/tree-log.c:3279 btrfs_sync_log() error: we previously assumed 'log_root_tree->node' could be null (see line 3168) vim +5940 fs/btrfs/tree-log.c da447009a25609 Filipe Manana 2020-03-09 5656 e02119d5a7b439 Chris Mason 2008-09-05 5657 /* log a single inode in the tree log. e02119d5a7b439 Chris Mason 2008-09-05 5658 * At least one parent directory for this inode must exist in the tree e02119d5a7b439 Chris Mason 2008-09-05 5659 * or be logged already. e02119d5a7b439 Chris Mason 2008-09-05 5660 * e02119d5a7b439 Chris Mason 2008-09-05 5661 * Any items from this inode changed by the current transaction are copied e02119d5a7b439 Chris Mason 2008-09-05 5662 * to the log tree. An extra reference is taken on any extents in this e02119d5a7b439 Chris Mason 2008-09-05 5663 * file, allowing us to avoid a whole pile of corner cases around logging e02119d5a7b439 Chris Mason 2008-09-05 5664 * blocks that have been removed from the tree. e02119d5a7b439 Chris Mason 2008-09-05 5665 * e02119d5a7b439 Chris Mason 2008-09-05 5666 * See LOG_INODE_ALL and related defines for a description of what inode_only e02119d5a7b439 Chris Mason 2008-09-05 5667 * does. e02119d5a7b439 Chris Mason 2008-09-05 5668 * e02119d5a7b439 Chris Mason 2008-09-05 5669 * This handles both files and directories. e02119d5a7b439 Chris Mason 2008-09-05 5670 */ 12fcfd22fe5bf4 Chris Mason 2009-03-24 5671 static int btrfs_log_inode(struct btrfs_trans_handle *trans, 90d04510a774a8 Filipe Manana 2021-09-16 5672 struct btrfs_inode *inode, 49dae1bc1c6658 Filipe Manana 2014-09-06 5673 int inode_only, 8407f553268a46 Filipe Manana 2014-09-05 5674 struct btrfs_log_ctx *ctx) e02119d5a7b439 Chris Mason 2008-09-05 5675 { e02119d5a7b439 Chris Mason 2008-09-05 5676 struct btrfs_path *path; e02119d5a7b439 Chris Mason 2008-09-05 5677 struct btrfs_path *dst_path; e02119d5a7b439 Chris Mason 2008-09-05 5678 struct btrfs_key min_key; e02119d5a7b439 Chris Mason 2008-09-05 5679 struct btrfs_key max_key; 90d04510a774a8 Filipe Manana 2021-09-16 5680 struct btrfs_root *log = inode->root->log_root; d5c4823408c725 Filipe Manana 2022-01-20 5681 int ret; 5dc562c541e102 Josef Bacik 2012-08-17 5682 bool fast_search = false; a59108a73f347d Nikolay Borisov 2017-01-18 5683 u64 ino = btrfs_ino(inode); a59108a73f347d Nikolay Borisov 2017-01-18 5684 struct extent_map_tree *em_tree = &inode->extent_tree; 1a4bcf470c886b Filipe Manana 2015-02-13 5685 u64 logged_isize = 0; e4545de5b035c7 Filipe Manana 2015-06-17 5686 bool need_log_inode_item = true; 9a8fca62aacc15 Filipe Manana 2018-05-11 5687 bool xattrs_logged = false; a3baaf0d786e22 Filipe Manana 2019-02-13 5688 bool recursive_logging = false; 2ac691d8b3b1dd Filipe Manana 2021-07-20 5689 bool inode_item_dropped = true; 1aad8afed702d4 Filipe Manana 2022-01-20 5690 const bool orig_logged_before = ctx->logged_before; e02119d5a7b439 Chris Mason 2008-09-05 5691 e02119d5a7b439 Chris Mason 2008-09-05 5692 path = btrfs_alloc_path(); 5df67083488ccb Tsutomu Itoh 2011-02-01 5693 if (!path) 5df67083488ccb Tsutomu Itoh 2011-02-01 5694 return -ENOMEM; e02119d5a7b439 Chris Mason 2008-09-05 5695 dst_path = btrfs_alloc_path(); 5df67083488ccb Tsutomu Itoh 2011-02-01 5696 if (!dst_path) { 5df67083488ccb Tsutomu Itoh 2011-02-01 5697 btrfs_free_path(path); 5df67083488ccb Tsutomu Itoh 2011-02-01 5698 return -ENOMEM; 5df67083488ccb Tsutomu Itoh 2011-02-01 5699 } e02119d5a7b439 Chris Mason 2008-09-05 5700 33345d01522f81 Li Zefan 2011-04-20 5701 min_key.objectid = ino; e02119d5a7b439 Chris Mason 2008-09-05 5702 min_key.type = BTRFS_INODE_ITEM_KEY; e02119d5a7b439 Chris Mason 2008-09-05 5703 min_key.offset = 0; e02119d5a7b439 Chris Mason 2008-09-05 5704 33345d01522f81 Li Zefan 2011-04-20 5705 max_key.objectid = ino; 12fcfd22fe5bf4 Chris Mason 2009-03-24 5706 12fcfd22fe5bf4 Chris Mason 2009-03-24 5707 5dc562c541e102 Josef Bacik 2012-08-17 5708 /* today the code can only do partial logging of directories */ a59108a73f347d Nikolay Borisov 2017-01-18 5709 if (S_ISDIR(inode->vfs_inode.i_mode) || 5269b67e3d809d Miao Xie 2012-11-01 5710 (!test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, a59108a73f347d Nikolay Borisov 2017-01-18 5711 &inode->runtime_flags) && 781feef7e6befa Liu Bo 2016-11-30 5712 inode_only >= LOG_INODE_EXISTS)) e02119d5a7b439 Chris Mason 2008-09-05 5713 max_key.type = BTRFS_XATTR_ITEM_KEY; e02119d5a7b439 Chris Mason 2008-09-05 5714 else e02119d5a7b439 Chris Mason 2008-09-05 5715 max_key.type = (u8)-1; e02119d5a7b439 Chris Mason 2008-09-05 5716 max_key.offset = (u64)-1; e02119d5a7b439 Chris Mason 2008-09-05 5717 2c2c452b0cafdc Filipe Manana 2015-01-13 5718 /* 5aa7d1a7f4a2f8 Filipe Manana 2020-07-02 5719 * Only run delayed items if we are a directory. We want to make sure 5aa7d1a7f4a2f8 Filipe Manana 2020-07-02 5720 * all directory indexes hit the fs/subvolume tree so we can find them 5aa7d1a7f4a2f8 Filipe Manana 2020-07-02 5721 * and figure out which index ranges have to be logged. 2c2c452b0cafdc Filipe Manana 2015-01-13 5722 */ f6df27dd2707b9 Filipe Manana 2021-08-31 5723 if (S_ISDIR(inode->vfs_inode.i_mode)) { d5c4823408c725 Filipe Manana 2022-01-20 5724 ret = btrfs_commit_inode_delayed_items(trans, inode); d5c4823408c725 Filipe Manana 2022-01-20 5725 if (ret) f6df27dd2707b9 Filipe Manana 2021-08-31 5726 goto out; 16cdcec736cd21 Miao Xie 2011-04-22 5727 } 16cdcec736cd21 Miao Xie 2011-04-22 5728 a3baaf0d786e22 Filipe Manana 2019-02-13 5729 if (inode_only == LOG_OTHER_INODE || inode_only == LOG_OTHER_INODE_ALL) { a3baaf0d786e22 Filipe Manana 2019-02-13 5730 recursive_logging = true; a3baaf0d786e22 Filipe Manana 2019-02-13 5731 if (inode_only == LOG_OTHER_INODE) 781feef7e6befa Liu Bo 2016-11-30 5732 inode_only = LOG_INODE_EXISTS; a3baaf0d786e22 Filipe Manana 2019-02-13 5733 else a3baaf0d786e22 Filipe Manana 2019-02-13 5734 inode_only = LOG_INODE_ALL; a59108a73f347d Nikolay Borisov 2017-01-18 5735 mutex_lock_nested(&inode->log_mutex, SINGLE_DEPTH_NESTING); 781feef7e6befa Liu Bo 2016-11-30 5736 } else { a59108a73f347d Nikolay Borisov 2017-01-18 5737 mutex_lock(&inode->log_mutex); 781feef7e6befa Liu Bo 2016-11-30 5738 } e02119d5a7b439 Chris Mason 2008-09-05 5739 1aad8afed702d4 Filipe Manana 2022-01-20 5740 /* 1aad8afed702d4 Filipe Manana 2022-01-20 5741 * Before logging the inode item, cache the value returned by 1aad8afed702d4 Filipe Manana 2022-01-20 5742 * inode_logged(), because after that we have the need to figure out if 1aad8afed702d4 Filipe Manana 2022-01-20 5743 * the inode was previously logged in this transaction. 1aad8afed702d4 Filipe Manana 2022-01-20 5744 */ 1aad8afed702d4 Filipe Manana 2022-01-20 5745 ret = inode_logged(trans, inode, path); d5c4823408c725 Filipe Manana 2022-01-20 5746 if (ret < 0) 1aad8afed702d4 Filipe Manana 2022-01-20 5747 goto out; 1aad8afed702d4 Filipe Manana 2022-01-20 5748 ctx->logged_before = (ret == 1); d5c4823408c725 Filipe Manana 2022-01-20 5749 ret = 0; 1aad8afed702d4 Filipe Manana 2022-01-20 5750 64d6b281ba4db0 Filipe Manana 2021-01-27 5751 /* 64d6b281ba4db0 Filipe Manana 2021-01-27 5752 * This is for cases where logging a directory could result in losing a 64d6b281ba4db0 Filipe Manana 2021-01-27 5753 * a file after replaying the log. For example, if we move a file from a 64d6b281ba4db0 Filipe Manana 2021-01-27 5754 * directory A to a directory B, then fsync directory A, we have no way 64d6b281ba4db0 Filipe Manana 2021-01-27 5755 * to known the file was moved from A to B, so logging just A would 64d6b281ba4db0 Filipe Manana 2021-01-27 5756 * result in losing the file after a log replay. 64d6b281ba4db0 Filipe Manana 2021-01-27 5757 */ 64d6b281ba4db0 Filipe Manana 2021-01-27 5758 if (S_ISDIR(inode->vfs_inode.i_mode) && 64d6b281ba4db0 Filipe Manana 2021-01-27 5759 inode_only == LOG_INODE_ALL && 64d6b281ba4db0 Filipe Manana 2021-01-27 5760 inode->last_unlink_trans >= trans->transid) { 64d6b281ba4db0 Filipe Manana 2021-01-27 5761 btrfs_set_log_full_commit(trans); d5c4823408c725 Filipe Manana 2022-01-20 5762 ret = 1; 64d6b281ba4db0 Filipe Manana 2021-01-27 5763 goto out_unlock; 64d6b281ba4db0 Filipe Manana 2021-01-27 5764 } 64d6b281ba4db0 Filipe Manana 2021-01-27 5765 e02119d5a7b439 Chris Mason 2008-09-05 5766 /* e02119d5a7b439 Chris Mason 2008-09-05 5767 * a brute force approach to making sure we get the most uptodate e02119d5a7b439 Chris Mason 2008-09-05 5768 * copies of everything. e02119d5a7b439 Chris Mason 2008-09-05 5769 */ a59108a73f347d Nikolay Borisov 2017-01-18 5770 if (S_ISDIR(inode->vfs_inode.i_mode)) { e02119d5a7b439 Chris Mason 2008-09-05 5771 int max_key_type = BTRFS_DIR_LOG_INDEX_KEY; e02119d5a7b439 Chris Mason 2008-09-05 5772 ab12313a9f56b9 Filipe Manana 2021-01-27 5773 clear_bit(BTRFS_INODE_COPY_EVERYTHING, &inode->runtime_flags); 4f764e5153616f Filipe Manana 2015-02-23 5774 if (inode_only == LOG_INODE_EXISTS) 4f764e5153616f Filipe Manana 2015-02-23 5775 max_key_type = BTRFS_XATTR_ITEM_KEY; 1aad8afed702d4 Filipe Manana 2022-01-20 5776 if (ctx->logged_before) 1aad8afed702d4 Filipe Manana 2022-01-20 5777 ret = drop_inode_items(trans, log, path, inode, 1aad8afed702d4 Filipe Manana 2022-01-20 5778 max_key_type); e02119d5a7b439 Chris Mason 2008-09-05 5779 } else { 1aad8afed702d4 Filipe Manana 2022-01-20 5780 if (inode_only == LOG_INODE_EXISTS && ctx->logged_before) { 1a4bcf470c886b Filipe Manana 2015-02-13 5781 /* 1a4bcf470c886b Filipe Manana 2015-02-13 5782 * Make sure the new inode item we write to the log has 1a4bcf470c886b Filipe Manana 2015-02-13 5783 * the same isize as the current one (if it exists). 1a4bcf470c886b Filipe Manana 2015-02-13 5784 * This is necessary to prevent data loss after log 1a4bcf470c886b Filipe Manana 2015-02-13 5785 * replay, and also to prevent doing a wrong expanding 1a4bcf470c886b Filipe Manana 2015-02-13 5786 * truncate - for e.g. create file, write 4K into offset 1a4bcf470c886b Filipe Manana 2015-02-13 5787 * 0, fsync, write 4K into offset 4096, add hard link, 1a4bcf470c886b Filipe Manana 2015-02-13 5788 * fsync some other file (to sync log), power fail - if 1a4bcf470c886b Filipe Manana 2015-02-13 5789 * we use the inode's current i_size, after log replay 1a4bcf470c886b Filipe Manana 2015-02-13 5790 * we get a 8Kb file, with the last 4Kb extent as a hole 1a4bcf470c886b Filipe Manana 2015-02-13 5791 * (zeroes), as if an expanding truncate happened, 1a4bcf470c886b Filipe Manana 2015-02-13 5792 * instead of getting a file of 4Kb only. 1a4bcf470c886b Filipe Manana 2015-02-13 5793 */ d5c4823408c725 Filipe Manana 2022-01-20 5794 ret = logged_inode_size(log, inode, path, &logged_isize); d5c4823408c725 Filipe Manana 2022-01-20 5795 if (ret) 1a4bcf470c886b Filipe Manana 2015-02-13 5796 goto out_unlock; 1a4bcf470c886b Filipe Manana 2015-02-13 5797 } a742994aa2e271 Filipe Manana 2015-02-13 5798 if (test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, a59108a73f347d Nikolay Borisov 2017-01-18 5799 &inode->runtime_flags)) { a742994aa2e271 Filipe Manana 2015-02-13 5800 if (inode_only == LOG_INODE_EXISTS) { 4f764e5153616f Filipe Manana 2015-02-23 5801 max_key.type = BTRFS_XATTR_ITEM_KEY; 1aad8afed702d4 Filipe Manana 2022-01-20 5802 if (ctx->logged_before) 1aad8afed702d4 Filipe Manana 2022-01-20 5803 ret = drop_inode_items(trans, log, path, 1aad8afed702d4 Filipe Manana 2022-01-20 5804 inode, max_key.type); a742994aa2e271 Filipe Manana 2015-02-13 5805 } else { a742994aa2e271 Filipe Manana 2015-02-13 5806 clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, a59108a73f347d Nikolay Borisov 2017-01-18 5807 &inode->runtime_flags); e99761514999f6 Josef Bacik 2012-10-11 5808 clear_bit(BTRFS_INODE_COPY_EVERYTHING, a59108a73f347d Nikolay Borisov 2017-01-18 5809 &inode->runtime_flags); 1aad8afed702d4 Filipe Manana 2022-01-20 5810 if (ctx->logged_before) 4934a8150214c3 Filipe Manana 2021-08-31 5811 ret = truncate_inode_items(trans, log, 4934a8150214c3 Filipe Manana 2021-08-31 5812 inode, 0, 0); a742994aa2e271 Filipe Manana 2015-02-13 5813 } 4f764e5153616f Filipe Manana 2015-02-23 5814 } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, a59108a73f347d Nikolay Borisov 2017-01-18 5815 &inode->runtime_flags) || 6cfab851f42edc Josef Bacik 2013-11-12 5816 inode_only == LOG_INODE_EXISTS) { 4f764e5153616f Filipe Manana 2015-02-23 5817 if (inode_only == LOG_INODE_ALL) 5dc562c541e102 Josef Bacik 2012-08-17 5818 fast_search = true; 5dc562c541e102 Josef Bacik 2012-08-17 5819 max_key.type = BTRFS_XATTR_ITEM_KEY; 1aad8afed702d4 Filipe Manana 2022-01-20 5820 if (ctx->logged_before) 88e221cdacc528 Filipe Manana 2021-08-31 5821 ret = drop_inode_items(trans, log, path, inode, e99761514999f6 Josef Bacik 2012-10-11 5822 max_key.type); a95249b392c3ab Josef Bacik 2012-10-11 5823 } else { a95249b392c3ab Josef Bacik 2012-10-11 5824 if (inode_only == LOG_INODE_ALL) a95249b392c3ab Josef Bacik 2012-10-11 5825 fast_search = true; 2ac691d8b3b1dd Filipe Manana 2021-07-20 5826 inode_item_dropped = false; a95249b392c3ab Josef Bacik 2012-10-11 5827 goto log_extents; a95249b392c3ab Josef Bacik 2012-10-11 5828 } a95249b392c3ab Josef Bacik 2012-10-11 5829 e02119d5a7b439 Chris Mason 2008-09-05 5830 } d5c4823408c725 Filipe Manana 2022-01-20 5831 if (ret) 4a500fd178c89b Yan, Zheng 2010-05-16 5832 goto out_unlock; e02119d5a7b439 Chris Mason 2008-09-05 5833 d5c4823408c725 Filipe Manana 2022-01-20 5834 ret = copy_inode_items_to_log(trans, inode, &min_key, &max_key, da447009a25609 Filipe Manana 2020-03-09 5835 path, dst_path, logged_isize, 7af597433d435b Filipe Manana 2020-04-07 5836 recursive_logging, inode_only, ctx, 7af597433d435b Filipe Manana 2020-04-07 5837 &need_log_inode_item); d5c4823408c725 Filipe Manana 2022-01-20 5838 if (ret) 44f714dae50a2e Filipe Manana 2016-06-06 5839 goto out_unlock; 5dc562c541e102 Josef Bacik 2012-08-17 5840 36283bf777d963 Filipe Manana 2015-06-20 5841 btrfs_release_path(path); 36283bf777d963 Filipe Manana 2015-06-20 5842 btrfs_release_path(dst_path); d5c4823408c725 Filipe Manana 2022-01-20 5843 ret = btrfs_log_all_xattrs(trans, inode, path, dst_path); d5c4823408c725 Filipe Manana 2022-01-20 5844 if (ret) 36283bf777d963 Filipe Manana 2015-06-20 5845 goto out_unlock; 9a8fca62aacc15 Filipe Manana 2018-05-11 5846 xattrs_logged = true; a89ca6f24ffe43 Filipe Manana 2015-06-25 5847 if (max_key.type >= BTRFS_EXTENT_DATA_KEY && !fast_search) { a89ca6f24ffe43 Filipe Manana 2015-06-25 5848 btrfs_release_path(path); a89ca6f24ffe43 Filipe Manana 2015-06-25 5849 btrfs_release_path(dst_path); d5c4823408c725 Filipe Manana 2022-01-20 5850 ret = btrfs_log_holes(trans, inode, path); d5c4823408c725 Filipe Manana 2022-01-20 5851 if (ret) a89ca6f24ffe43 Filipe Manana 2015-06-25 5852 goto out_unlock; a89ca6f24ffe43 Filipe Manana 2015-06-25 5853 } a95249b392c3ab Josef Bacik 2012-10-11 5854 log_extents: f3b15ccdbb9a79 Josef Bacik 2013-07-22 5855 btrfs_release_path(path); 5dc562c541e102 Josef Bacik 2012-08-17 5856 btrfs_release_path(dst_path); e4545de5b035c7 Filipe Manana 2015-06-17 5857 if (need_log_inode_item) { d5c4823408c725 Filipe Manana 2022-01-20 5858 ret = log_inode_item(trans, log, dst_path, inode, inode_item_dropped); d5c4823408c725 Filipe Manana 2022-01-20 5859 if (ret) b590b839720cf4 Filipe Manana 2021-05-28 5860 goto out_unlock; b590b839720cf4 Filipe Manana 2021-05-28 5861 /* b590b839720cf4 Filipe Manana 2021-05-28 5862 * If we are doing a fast fsync and the inode was logged before b590b839720cf4 Filipe Manana 2021-05-28 5863 * in this transaction, we don't need to log the xattrs because b590b839720cf4 Filipe Manana 2021-05-28 5864 * they were logged before. If xattrs were added, changed or b590b839720cf4 Filipe Manana 2021-05-28 5865 * deleted since the last time we logged the inode, then we have b590b839720cf4 Filipe Manana 2021-05-28 5866 * already logged them because the inode had the runtime flag b590b839720cf4 Filipe Manana 2021-05-28 5867 * BTRFS_INODE_COPY_EVERYTHING set. b590b839720cf4 Filipe Manana 2021-05-28 5868 */ b590b839720cf4 Filipe Manana 2021-05-28 5869 if (!xattrs_logged && inode->logged_trans < trans->transid) { d5c4823408c725 Filipe Manana 2022-01-20 5870 ret = btrfs_log_all_xattrs(trans, inode, path, dst_path); d5c4823408c725 Filipe Manana 2022-01-20 5871 if (ret) e4545de5b035c7 Filipe Manana 2015-06-17 5872 goto out_unlock; b590b839720cf4 Filipe Manana 2021-05-28 5873 btrfs_release_path(path); b590b839720cf4 Filipe Manana 2021-05-28 5874 } e4545de5b035c7 Filipe Manana 2015-06-17 5875 } f3b15ccdbb9a79 Josef Bacik 2013-07-22 5876 if (fast_search) { 90d04510a774a8 Filipe Manana 2021-09-16 5877 ret = btrfs_log_changed_extents(trans, inode, dst_path, ctx); d5c4823408c725 Filipe Manana 2022-01-20 5878 if (ret) 5dc562c541e102 Josef Bacik 2012-08-17 5879 goto out_unlock; d006a04816a306 Josef Bacik 2013-11-12 5880 } else if (inode_only == LOG_INODE_ALL) { 06d3d22b456c2f Liu Bo 2012-08-27 5881 struct extent_map *em, *n; 06d3d22b456c2f Liu Bo 2012-08-27 5882 49dae1bc1c6658 Filipe Manana 2014-09-06 5883 write_lock(&em_tree->lock); 487781796d3022 Filipe Manana 2020-08-11 5884 list_for_each_entry_safe(em, n, &em_tree->modified_extents, list) 06d3d22b456c2f Liu Bo 2012-08-27 5885 list_del_init(&em->list); 49dae1bc1c6658 Filipe Manana 2014-09-06 5886 write_unlock(&em_tree->lock); 5dc562c541e102 Josef Bacik 2012-08-17 5887 } 5dc562c541e102 Josef Bacik 2012-08-17 5888 a59108a73f347d Nikolay Borisov 2017-01-18 5889 if (inode_only == LOG_INODE_ALL && S_ISDIR(inode->vfs_inode.i_mode)) { 90d04510a774a8 Filipe Manana 2021-09-16 5890 ret = log_directory_changes(trans, inode, path, dst_path, ctx); d5c4823408c725 Filipe Manana 2022-01-20 5891 if (ret) 4a500fd178c89b Yan, Zheng 2010-05-16 5892 goto out_unlock; 4a500fd178c89b Yan, Zheng 2010-05-16 5893 } 49dae1bc1c6658 Filipe Manana 2014-09-06 5894 a59108a73f347d Nikolay Borisov 2017-01-18 5895 spin_lock(&inode->lock); a59108a73f347d Nikolay Borisov 2017-01-18 5896 inode->logged_trans = trans->transid; 75b463d2b47aef Filipe Manana 2020-08-11 5897 /* 9acc8103ab594f Filipe Manana 2021-07-06 5898 * Don't update last_log_commit if we logged that an inode exists. 130341be7ffaed Filipe Manana 2021-08-31 5899 * We do this for three reasons: 9acc8103ab594f Filipe Manana 2021-07-06 5900 * 9acc8103ab594f Filipe Manana 2021-07-06 5901 * 1) We might have had buffered writes to this inode that were 9acc8103ab594f Filipe Manana 2021-07-06 5902 * flushed and had their ordered extents completed in this 9acc8103ab594f Filipe Manana 2021-07-06 5903 * transaction, but we did not previously log the inode with 9acc8103ab594f Filipe Manana 2021-07-06 5904 * LOG_INODE_ALL. Later the inode was evicted and after that 9acc8103ab594f Filipe Manana 2021-07-06 5905 * it was loaded again and this LOG_INODE_EXISTS log operation 9acc8103ab594f Filipe Manana 2021-07-06 5906 * happened. We must make sure that if an explicit fsync against 9acc8103ab594f Filipe Manana 2021-07-06 5907 * the inode is performed later, it logs the new extents, an 9acc8103ab594f Filipe Manana 2021-07-06 5908 * updated inode item, etc, and syncs the log. The same logic 9acc8103ab594f Filipe Manana 2021-07-06 5909 * applies to direct IO writes instead of buffered writes. 9acc8103ab594f Filipe Manana 2021-07-06 5910 * 9acc8103ab594f Filipe Manana 2021-07-06 5911 * 2) When we log the inode with LOG_INODE_EXISTS, its inode item 9acc8103ab594f Filipe Manana 2021-07-06 5912 * is logged with an i_size of 0 or whatever value was logged 9acc8103ab594f Filipe Manana 2021-07-06 5913 * before. If later the i_size of the inode is increased by a 9acc8103ab594f Filipe Manana 2021-07-06 5914 * truncate operation, the log is synced through an fsync of 9acc8103ab594f Filipe Manana 2021-07-06 5915 * some other inode and then finally an explicit fsync against 9acc8103ab594f Filipe Manana 2021-07-06 5916 * this inode is made, we must make sure this fsync logs the 9acc8103ab594f Filipe Manana 2021-07-06 5917 * inode with the new i_size, the hole between old i_size and 9acc8103ab594f Filipe Manana 2021-07-06 5918 * the new i_size, and syncs the log. 130341be7ffaed Filipe Manana 2021-08-31 5919 * 130341be7ffaed Filipe Manana 2021-08-31 5920 * 3) If we are logging that an ancestor inode exists as part of 130341be7ffaed Filipe Manana 2021-08-31 5921 * logging a new name from a link or rename operation, don't update 130341be7ffaed Filipe Manana 2021-08-31 5922 * its last_log_commit - otherwise if an explicit fsync is made 130341be7ffaed Filipe Manana 2021-08-31 5923 * against an ancestor, the fsync considers the inode in the log 130341be7ffaed Filipe Manana 2021-08-31 5924 * and doesn't sync the log, resulting in the ancestor missing after 130341be7ffaed Filipe Manana 2021-08-31 5925 * a power failure unless the log was synced as part of an fsync 130341be7ffaed Filipe Manana 2021-08-31 5926 * against any other unrelated inode. 9acc8103ab594f Filipe Manana 2021-07-06 5927 */ 9acc8103ab594f Filipe Manana 2021-07-06 5928 if (inode_only != LOG_INODE_EXISTS) a59108a73f347d Nikolay Borisov 2017-01-18 5929 inode->last_log_commit = inode->last_sub_trans; a59108a73f347d Nikolay Borisov 2017-01-18 5930 spin_unlock(&inode->lock); 4a500fd178c89b Yan, Zheng 2010-05-16 5931 out_unlock: a59108a73f347d Nikolay Borisov 2017-01-18 5932 mutex_unlock(&inode->log_mutex); f6df27dd2707b9 Filipe Manana 2021-08-31 5933 out: e02119d5a7b439 Chris Mason 2008-09-05 5934 btrfs_free_path(path); e02119d5a7b439 Chris Mason 2008-09-05 5935 btrfs_free_path(dst_path); 1aad8afed702d4 Filipe Manana 2022-01-20 5936 1aad8afed702d4 Filipe Manana 2022-01-20 5937 if (recursive_logging) 1aad8afed702d4 Filipe Manana 2022-01-20 5938 ctx->logged_before = orig_logged_before; 1aad8afed702d4 Filipe Manana 2022-01-20 5939 d5c4823408c725 Filipe Manana 2022-01-20 @5940 return ret; e02119d5a7b439 Chris Mason 2008-09-05 5941 } e02119d5a7b439 Chris Mason 2008-09-05 5942 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
