All of lore.kernel.org
 help / color / mirror / Atom feed
* [allisonhenderson-xfs-work:xfs-5.19-compose_pptrs 28/32] fs/xfs/xfs_inode.c:3329:3: warning: Value stored to 'error' is never read [clang-analyzer-deadcode.DeadStores]
@ 2022-05-11 16:16 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2022-05-11 16:16 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 49065 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: linux-kernel(a)vger.kernel.org
TO: Allison Henderson <allison.henderson@oracle.com>

tree:   https://github.com/allisonhenderson/xfs_work.git xfs-5.19-compose_pptrs
head:   74ecccf0e89a132c2490f3a63661c535974c6a08
commit: 5e63097b3f9723c46738f7a739cb982675803434 [28/32] xfs: Add parent pointers to rename
:::::: branch date: 6 days ago
:::::: commit date: 6 days ago
config: x86_64-randconfig-c007 (https://download.01.org/0day-ci/archive/20220512/202205120054.AiDLbW2t-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 5e004fb787698440a387750db7f8028e7cb14cfc)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/allisonhenderson/xfs_work/commit/5e63097b3f9723c46738f7a739cb982675803434
        git remote add allisonhenderson-xfs-work https://github.com/allisonhenderson/xfs_work.git
        git fetch --no-tags allisonhenderson-xfs-work xfs-5.19-compose_pptrs
        git checkout 5e63097b3f9723c46738f7a739cb982675803434
        # save the config file
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk'
           __underlying_##op(p, q, __fortify_size);                        \
           ^~~~~~~~~~~~~~~~~
   note: expanded from here
   include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy'
   #define __underlying_memcpy     __builtin_memcpy
                                   ^~~~~~~~~~~~~~~~
   drivers/input/keyboard/sunkbd.c:293:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
           memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode));
           ^
   include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy'
   #define memcpy(p, q, s)  __fortify_memcpy_chk(p, q, s,                  \
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk'
           __underlying_##op(p, q, __fortify_size);                        \
           ^~~~~~~~~~~~~~~~~
   note: expanded from here
   include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy'
   #define __underlying_memcpy     __builtin_memcpy
                                   ^~~~~~~~~~~~~~~~
   Suppressed 34 warnings (34 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   79 warnings generated.
   drivers/net/wireless/ti/wl1251/rx.c:40:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memset(status, 0, sizeof(struct ieee80211_rx_status));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   drivers/net/wireless/ti/wl1251/rx.c:40:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
           memset(status, 0, sizeof(struct ieee80211_rx_status));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   drivers/net/wireless/ti/wl1251/rx.c:181:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status));
           ^
   include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy'
   #define memcpy(p, q, s)  __fortify_memcpy_chk(p, q, s,                  \
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk'
           __underlying_##op(p, q, __fortify_size);                        \
           ^~~~~~~~~~~~~~~~~
   note: expanded from here
   include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy'
   #define __underlying_memcpy     __builtin_memcpy
                                   ^~~~~~~~~~~~~~~~
   drivers/net/wireless/ti/wl1251/rx.c:181:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
           memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status));
           ^
   include/linux/fortify-string.h:369:26: note: expanded from macro 'memcpy'
   #define memcpy(p, q, s)  __fortify_memcpy_chk(p, q, s,                  \
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:362:2: note: expanded from macro '__fortify_memcpy_chk'
           __underlying_##op(p, q, __fortify_size);                        \
           ^~~~~~~~~~~~~~~~~
   note: expanded from here
   include/linux/fortify-string.h:45:29: note: expanded from macro '__underlying_memcpy'
   #define __underlying_memcpy     __builtin_memcpy
                                   ^~~~~~~~~~~~~~~~
   Suppressed 77 warnings (77 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   50 warnings generated.
   fs/xfs/xfs_inode.c:3003:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   fs/xfs/xfs_inode.c:3003:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
           memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
>> fs/xfs/xfs_inode.c:3329:3: warning: Value stored to 'error' is never read [clang-analyzer-deadcode.DeadStores]
                   error = xfs_cross_rename(tp, src_dp, src_name, src_ip,
                   ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/xfs/xfs_inode.c:3329:3: note: Value stored to 'error' is never read
                   error = xfs_cross_rename(tp, src_dp, src_name, src_ip,
                   ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Suppressed 48 warnings (48 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   48 warnings generated.
   fs/xfs/xfs_itable.c:320:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memset(bs1, 0, sizeof(struct xfs_bstat));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   fs/xfs/xfs_itable.c:320:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
           memset(bs1, 0, sizeof(struct xfs_bstat));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   fs/xfs/xfs_itable.c:448:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
           memset(ig1, 0, sizeof(struct xfs_inogrp));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   fs/xfs/xfs_itable.c:448:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
           memset(ig1, 0, sizeof(struct xfs_inogrp));
           ^
   include/linux/fortify-string.h:272:25: note: expanded from macro 'memset'
   #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:265:2: note: expanded from macro '__fortify_memset_chk'
           __underlying_memset(p, c, __fortify_size);                      \
           ^~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:47:29: note: expanded from macro '__underlying_memset'
   #define __underlying_memset     __builtin_memset
                                   ^~~~~~~~~~~~~~~~
   Suppressed 46 warnings (46 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   59 warnings generated.
   fs/fat/dir.c:45:18: warning: Access to field 'b_blocknr' results in a dereference of a null pointer (loaded from variable 'bh') [clang-analyzer-core.NullDereference]
           return ((loff_t)bh->b_blocknr << MSDOS_SB(sb)->dir_per_block_bits)
                           ^
   fs/fat/dir.c:1298:9: note: Calling 'fat_get_entry'
           while (fat_get_entry(dir, &pos, &bh, &de) > -1) {
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/fat/dir.c:121:10: note: Left side of '&&' is false
           if (*bh && *de &&
                   ^
   fs/fat/dir.c:128:9: note: Calling 'fat__get_entry'
           return fat__get_entry(dir, pos, bh, de);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/fat/dir.c:95:6: note: Assuming 'err' is 0
           if (err || !phys)
               ^~~
   fs/fat/dir.c:95:6: note: Left side of '||' is false
   fs/fat/dir.c:95:13: note: Assuming 'phys' is not equal to 0
           if (err || !phys)
                      ^~~~~
   fs/fat/dir.c:95:2: note: Taking false branch
           if (err || !phys)
           ^
   fs/fat/dir.c:101:6: note: Assuming the condition is false
           if (*bh == NULL) {
               ^~~~~~~~~~~
   fs/fat/dir.c:101:2: note: Taking false branch
           if (*bh == NULL) {
           ^
   fs/fat/dir.c:128:9: note: Returning from 'fat__get_entry'
           return fat__get_entry(dir, pos, bh, de);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/fat/dir.c:1298:9: note: Returning from 'fat_get_entry'
           while (fat_get_entry(dir, &pos, &bh, &de) > -1) {
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/fat/dir.c:1298:2: note: Loop condition is true.  Entering loop body
           while (fat_get_entry(dir, &pos, &bh, &de) > -1) {
           ^
   fs/fat/dir.c:1300:3: note: Taking false branch
                   if (pos >= FAT_MAX_DIR_SIZE)
                   ^
   fs/fat/dir.c:1303:7: note: Assuming the condition is false

vim +/error +3329 fs/xfs/xfs_inode.c

7dcf5c3e4527cf Dave Chinner      2015-03-25  3194  
f6bba2017afb3b Dave Chinner      2013-08-12  3195  /*
f6bba2017afb3b Dave Chinner      2013-08-12  3196   * xfs_rename
f6bba2017afb3b Dave Chinner      2013-08-12  3197   */
f6bba2017afb3b Dave Chinner      2013-08-12  3198  int
f6bba2017afb3b Dave Chinner      2013-08-12  3199  xfs_rename(
f736d93d76d3e9 Christoph Hellwig 2021-01-21  3200  	struct user_namespace		*mnt_userns,
7dcf5c3e4527cf Dave Chinner      2015-03-25  3201  	struct xfs_inode		*src_dp,
f6bba2017afb3b Dave Chinner      2013-08-12  3202  	struct xfs_name			*src_name,
7dcf5c3e4527cf Dave Chinner      2015-03-25  3203  	struct xfs_inode		*src_ip,
7dcf5c3e4527cf Dave Chinner      2015-03-25  3204  	struct xfs_inode		*target_dp,
f6bba2017afb3b Dave Chinner      2013-08-12  3205  	struct xfs_name			*target_name,
7dcf5c3e4527cf Dave Chinner      2015-03-25  3206  	struct xfs_inode		*target_ip,
d31a1825450062 Carlos Maiolino   2014-12-24  3207  	unsigned int			flags)
f6bba2017afb3b Dave Chinner      2013-08-12  3208  {
7dcf5c3e4527cf Dave Chinner      2015-03-25  3209  	struct xfs_mount		*mp = src_dp->i_mount;
7dcf5c3e4527cf Dave Chinner      2015-03-25  3210  	struct xfs_trans		*tp;
7dcf5c3e4527cf Dave Chinner      2015-03-25  3211  	struct xfs_inode		*wip = NULL;		/* whiteout inode */
7dcf5c3e4527cf Dave Chinner      2015-03-25  3212  	struct xfs_inode		*inodes[__XFS_SORT_INODES];
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3213  	int				i;
95afcf5c7bca93 Dave Chinner      2015-03-25  3214  	int				num_inodes = __XFS_SORT_INODES;
2b93681f593577 Dave Chinner      2015-03-25  3215  	bool				new_parent = (src_dp != target_dp);
c19b3b05ae440d Dave Chinner      2016-02-09  3216  	bool				src_is_directory = S_ISDIR(VFS_I(src_ip)->i_mode);
f6bba2017afb3b Dave Chinner      2013-08-12  3217  	int				spaceres;
41667260bc84db Darrick J. Wong   2022-03-09  3218  	bool				retried = false;
41667260bc84db Darrick J. Wong   2022-03-09  3219  	int				error, nospace_error = 0;
5e63097b3f9723 Allison Henderson 2022-03-22  3220  	struct xfs_parent_name_rec	new_rec;
5e63097b3f9723 Allison Henderson 2022-03-22  3221  	struct xfs_parent_name_rec	old_rec;
5e63097b3f9723 Allison Henderson 2022-03-22  3222  	xfs_dir2_dataptr_t		new_diroffset;
5e63097b3f9723 Allison Henderson 2022-03-22  3223  	xfs_dir2_dataptr_t		old_diroffset;
5e63097b3f9723 Allison Henderson 2022-03-22  3224  	struct xfs_da_args		new_args = {
5e63097b3f9723 Allison Henderson 2022-03-22  3225  		.dp		= src_ip,
5e63097b3f9723 Allison Henderson 2022-03-22  3226  		.geo		= mp->m_attr_geo,
5e63097b3f9723 Allison Henderson 2022-03-22  3227  		.whichfork	= XFS_ATTR_FORK,
5e63097b3f9723 Allison Henderson 2022-03-22  3228  		.attr_filter	= XFS_ATTR_PARENT,
5e63097b3f9723 Allison Henderson 2022-03-22  3229  		.op_flags	= XFS_DA_OP_OKNOENT,
5e63097b3f9723 Allison Henderson 2022-03-22  3230  		.name		= (const uint8_t *)&new_rec,
5e63097b3f9723 Allison Henderson 2022-03-22  3231  		.namelen	= sizeof(new_rec),
5e63097b3f9723 Allison Henderson 2022-03-22  3232  		.value		= (void *)target_name->name,
5e63097b3f9723 Allison Henderson 2022-03-22  3233  		.valuelen	= target_name->len,
5e63097b3f9723 Allison Henderson 2022-03-22  3234  	};
5e63097b3f9723 Allison Henderson 2022-03-22  3235  	struct xfs_da_args		old_args = {
5e63097b3f9723 Allison Henderson 2022-03-22  3236  		.dp		= src_ip,
5e63097b3f9723 Allison Henderson 2022-03-22  3237  		.geo		= mp->m_attr_geo,
5e63097b3f9723 Allison Henderson 2022-03-22  3238  		.whichfork	= XFS_ATTR_FORK,
5e63097b3f9723 Allison Henderson 2022-03-22  3239  		.attr_filter	= XFS_ATTR_PARENT,
5e63097b3f9723 Allison Henderson 2022-03-22  3240  		.op_flags	= XFS_DA_OP_OKNOENT,
5e63097b3f9723 Allison Henderson 2022-03-22  3241  		.name		= (const uint8_t *)&old_rec,
5e63097b3f9723 Allison Henderson 2022-03-22  3242  		.namelen	= sizeof(old_rec),
5e63097b3f9723 Allison Henderson 2022-03-22  3243  		.value		= NULL,
5e63097b3f9723 Allison Henderson 2022-03-22  3244  		.valuelen	= 0,
5e63097b3f9723 Allison Henderson 2022-03-22  3245  	};
f6bba2017afb3b Dave Chinner      2013-08-12  3246  
f6bba2017afb3b Dave Chinner      2013-08-12  3247  	trace_xfs_rename(src_dp, target_dp, src_name, target_name);
f6bba2017afb3b Dave Chinner      2013-08-12  3248  
eeacd3217b8fa8 Dave Chinner      2015-03-25  3249  	if ((flags & RENAME_EXCHANGE) && !target_ip)
eeacd3217b8fa8 Dave Chinner      2015-03-25  3250  		return -EINVAL;
eeacd3217b8fa8 Dave Chinner      2015-03-25  3251  
7dcf5c3e4527cf Dave Chinner      2015-03-25  3252  	/*
7dcf5c3e4527cf Dave Chinner      2015-03-25  3253  	 * If we are doing a whiteout operation, allocate the whiteout inode
7dcf5c3e4527cf Dave Chinner      2015-03-25  3254  	 * we will be placing at the target and ensure the type is set
7dcf5c3e4527cf Dave Chinner      2015-03-25  3255  	 * appropriately.
7dcf5c3e4527cf Dave Chinner      2015-03-25  3256  	 */
7dcf5c3e4527cf Dave Chinner      2015-03-25  3257  	if (flags & RENAME_WHITEOUT) {
f736d93d76d3e9 Christoph Hellwig 2021-01-21  3258  		error = xfs_rename_alloc_whiteout(mnt_userns, target_dp, &wip);
7dcf5c3e4527cf Dave Chinner      2015-03-25  3259  		if (error)
7dcf5c3e4527cf Dave Chinner      2015-03-25  3260  			return error;
f6bba2017afb3b Dave Chinner      2013-08-12  3261  
7dcf5c3e4527cf Dave Chinner      2015-03-25  3262  		/* setup target dirent info as whiteout */
7dcf5c3e4527cf Dave Chinner      2015-03-25  3263  		src_name->type = XFS_DIR3_FT_CHRDEV;
7dcf5c3e4527cf Dave Chinner      2015-03-25  3264  	}
f6bba2017afb3b Dave Chinner      2013-08-12  3265  
7dcf5c3e4527cf Dave Chinner      2015-03-25  3266  	xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wip,
f6bba2017afb3b Dave Chinner      2013-08-12  3267  				inodes, &num_inodes);
5e63097b3f9723 Allison Henderson 2022-03-22  3268  	if (xfs_has_larp(mp)) {
5e63097b3f9723 Allison Henderson 2022-03-22  3269  		error = xfs_attr_use_log_assist(mp);
5e63097b3f9723 Allison Henderson 2022-03-22  3270  		if (error)
5e63097b3f9723 Allison Henderson 2022-03-22  3271  			goto out_release_wip;
5e63097b3f9723 Allison Henderson 2022-03-22  3272  	}
f6bba2017afb3b Dave Chinner      2013-08-12  3273  
41667260bc84db Darrick J. Wong   2022-03-09  3274  retry:
41667260bc84db Darrick J. Wong   2022-03-09  3275  	nospace_error = 0;
f6bba2017afb3b Dave Chinner      2013-08-12  3276  	spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
253f4911f297b8 Christoph Hellwig 2016-04-06  3277  	error = xfs_trans_alloc(mp, &M_RES(mp)->tr_rename, spaceres, 0, 0, &tp);
2451337dd04390 Dave Chinner      2014-06-25  3278  	if (error == -ENOSPC) {
41667260bc84db Darrick J. Wong   2022-03-09  3279  		nospace_error = error;
f6bba2017afb3b Dave Chinner      2013-08-12  3280  		spaceres = 0;
253f4911f297b8 Christoph Hellwig 2016-04-06  3281  		error = xfs_trans_alloc(mp, &M_RES(mp)->tr_rename, 0, 0, 0,
253f4911f297b8 Christoph Hellwig 2016-04-06  3282  				&tp);
f6bba2017afb3b Dave Chinner      2013-08-12  3283  	}
445883e8133975 Dave Chinner      2015-03-25  3284  	if (error)
5e63097b3f9723 Allison Henderson 2022-03-22  3285  		goto drop_incompat;
f6bba2017afb3b Dave Chinner      2013-08-12  3286  
f6bba2017afb3b Dave Chinner      2013-08-12  3287  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3288  	 * Attach the dquots to the inodes
f6bba2017afb3b Dave Chinner      2013-08-12  3289  	 */
f6bba2017afb3b Dave Chinner      2013-08-12  3290  	error = xfs_qm_vop_rename_dqattach(inodes);
445883e8133975 Dave Chinner      2015-03-25  3291  	if (error)
445883e8133975 Dave Chinner      2015-03-25  3292  		goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3293  
f6bba2017afb3b Dave Chinner      2013-08-12  3294  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3295  	 * Lock all the participating inodes. Depending upon whether
f6bba2017afb3b Dave Chinner      2013-08-12  3296  	 * the target_name exists in the target directory, and
f6bba2017afb3b Dave Chinner      2013-08-12  3297  	 * whether the target directory is the same as the source
f6bba2017afb3b Dave Chinner      2013-08-12  3298  	 * directory, we can lock from 2 to 4 inodes.
f6bba2017afb3b Dave Chinner      2013-08-12  3299  	 */
f6bba2017afb3b Dave Chinner      2013-08-12  3300  	xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL);
f6bba2017afb3b Dave Chinner      2013-08-12  3301  
f6bba2017afb3b Dave Chinner      2013-08-12  3302  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3303  	 * Join all the inodes to the transaction. From this point on,
f6bba2017afb3b Dave Chinner      2013-08-12  3304  	 * we can rely on either trans_commit or trans_cancel to unlock
f6bba2017afb3b Dave Chinner      2013-08-12  3305  	 * them.
f6bba2017afb3b Dave Chinner      2013-08-12  3306  	 */
5e63097b3f9723 Allison Henderson 2022-03-22  3307  	xfs_trans_ijoin(tp, src_dp, 0);
f6bba2017afb3b Dave Chinner      2013-08-12  3308  	if (new_parent)
5e63097b3f9723 Allison Henderson 2022-03-22  3309  		xfs_trans_ijoin(tp, target_dp, 0);
5e63097b3f9723 Allison Henderson 2022-03-22  3310  	xfs_trans_ijoin(tp, src_ip, 0);
f6bba2017afb3b Dave Chinner      2013-08-12  3311  	if (target_ip)
5e63097b3f9723 Allison Henderson 2022-03-22  3312  		xfs_trans_ijoin(tp, target_ip, 0);
7dcf5c3e4527cf Dave Chinner      2015-03-25  3313  	if (wip)
5e63097b3f9723 Allison Henderson 2022-03-22  3314  		xfs_trans_ijoin(tp, wip, 0);
f6bba2017afb3b Dave Chinner      2013-08-12  3315  
f6bba2017afb3b Dave Chinner      2013-08-12  3316  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3317  	 * If we are using project inheritance, we only allow renames
f6bba2017afb3b Dave Chinner      2013-08-12  3318  	 * into our tree when the project IDs are the same; else the
f6bba2017afb3b Dave Chinner      2013-08-12  3319  	 * tree quota mechanism would be circumvented.
f6bba2017afb3b Dave Chinner      2013-08-12  3320  	 */
db07349da2f564 Christoph Hellwig 2021-03-29  3321  	if (unlikely((target_dp->i_diflags & XFS_DIFLAG_PROJINHERIT) &&
ceaf603c7024d3 Christoph Hellwig 2021-03-29  3322  		     target_dp->i_projid != src_ip->i_projid)) {
2451337dd04390 Dave Chinner      2014-06-25  3323  		error = -EXDEV;
5e63097b3f9723 Allison Henderson 2022-03-22  3324  		goto out_unlock;
f6bba2017afb3b Dave Chinner      2013-08-12  3325  	}
f6bba2017afb3b Dave Chinner      2013-08-12  3326  
eeacd3217b8fa8 Dave Chinner      2015-03-25  3327  	/* RENAME_EXCHANGE is unique from here on. */
5e63097b3f9723 Allison Henderson 2022-03-22  3328  	if (flags & RENAME_EXCHANGE) {
5e63097b3f9723 Allison Henderson 2022-03-22 @3329  		error = xfs_cross_rename(tp, src_dp, src_name, src_ip,
d31a1825450062 Carlos Maiolino   2014-12-24  3330  					target_dp, target_name, target_ip,
f16dea54b789aa Brian Foster      2018-07-11  3331  					spaceres);
5e63097b3f9723 Allison Henderson 2022-03-22  3332  		goto out_pptr;
5e63097b3f9723 Allison Henderson 2022-03-22  3333  	}
41667260bc84db Darrick J. Wong   2022-03-09  3334  	/*
41667260bc84db Darrick J. Wong   2022-03-09  3335  	 * Try to reserve quota to handle an expansion of the target directory.
41667260bc84db Darrick J. Wong   2022-03-09  3336  	 * We'll allow the rename to continue in reservationless mode if we hit
41667260bc84db Darrick J. Wong   2022-03-09  3337  	 * a space usage constraint.  If we trigger reservationless mode, save
41667260bc84db Darrick J. Wong   2022-03-09  3338  	 * the errno if there isn't any free space in the target directory.
41667260bc84db Darrick J. Wong   2022-03-09  3339  	 */
41667260bc84db Darrick J. Wong   2022-03-09  3340  	if (spaceres != 0) {
41667260bc84db Darrick J. Wong   2022-03-09  3341  		error = xfs_trans_reserve_quota_nblks(tp, target_dp, spaceres,
41667260bc84db Darrick J. Wong   2022-03-09  3342  				0, false);
41667260bc84db Darrick J. Wong   2022-03-09  3343  		if (error == -EDQUOT || error == -ENOSPC) {
41667260bc84db Darrick J. Wong   2022-03-09  3344  			if (!retried) {
41667260bc84db Darrick J. Wong   2022-03-09  3345  				xfs_trans_cancel(tp);
41667260bc84db Darrick J. Wong   2022-03-09  3346  				xfs_blockgc_free_quota(target_dp, 0);
41667260bc84db Darrick J. Wong   2022-03-09  3347  				retried = true;
41667260bc84db Darrick J. Wong   2022-03-09  3348  				goto retry;
41667260bc84db Darrick J. Wong   2022-03-09  3349  			}
41667260bc84db Darrick J. Wong   2022-03-09  3350  
41667260bc84db Darrick J. Wong   2022-03-09  3351  			nospace_error = error;
41667260bc84db Darrick J. Wong   2022-03-09  3352  			spaceres = 0;
41667260bc84db Darrick J. Wong   2022-03-09  3353  			error = 0;
41667260bc84db Darrick J. Wong   2022-03-09  3354  		}
41667260bc84db Darrick J. Wong   2022-03-09  3355  		if (error)
41667260bc84db Darrick J. Wong   2022-03-09  3356  			goto out_trans_cancel;
41667260bc84db Darrick J. Wong   2022-03-09  3357  	}
41667260bc84db Darrick J. Wong   2022-03-09  3358  
f6bba2017afb3b Dave Chinner      2013-08-12  3359  	/*
bc56ad8c74b858 kaixuxia          2019-09-03  3360  	 * Check for expected errors before we dirty the transaction
bc56ad8c74b858 kaixuxia          2019-09-03  3361  	 * so we can return an error without a transaction abort.
f6bba2017afb3b Dave Chinner      2013-08-12  3362  	 */
f6bba2017afb3b Dave Chinner      2013-08-12  3363  	if (target_ip == NULL) {
f6bba2017afb3b Dave Chinner      2013-08-12  3364  		/*
f6bba2017afb3b Dave Chinner      2013-08-12  3365  		 * If there's no space reservation, check the entry will
f6bba2017afb3b Dave Chinner      2013-08-12  3366  		 * fit before actually inserting it.
f6bba2017afb3b Dave Chinner      2013-08-12  3367  		 */
94f3cad555d660 Eric Sandeen      2014-09-09  3368  		if (!spaceres) {
94f3cad555d660 Eric Sandeen      2014-09-09  3369  			error = xfs_dir_canenter(tp, target_dp, target_name);
f6bba2017afb3b Dave Chinner      2013-08-12  3370  			if (error)
445883e8133975 Dave Chinner      2015-03-25  3371  				goto out_trans_cancel;
94f3cad555d660 Eric Sandeen      2014-09-09  3372  		}
bc56ad8c74b858 kaixuxia          2019-09-03  3373  	} else {
bc56ad8c74b858 kaixuxia          2019-09-03  3374  		/*
bc56ad8c74b858 kaixuxia          2019-09-03  3375  		 * If target exists and it's a directory, check that whether
bc56ad8c74b858 kaixuxia          2019-09-03  3376  		 * it can be destroyed.
bc56ad8c74b858 kaixuxia          2019-09-03  3377  		 */
bc56ad8c74b858 kaixuxia          2019-09-03  3378  		if (S_ISDIR(VFS_I(target_ip)->i_mode) &&
bc56ad8c74b858 kaixuxia          2019-09-03  3379  		    (!xfs_dir_isempty(target_ip) ||
bc56ad8c74b858 kaixuxia          2019-09-03  3380  		     (VFS_I(target_ip)->i_nlink > 2))) {
bc56ad8c74b858 kaixuxia          2019-09-03  3381  			error = -EEXIST;
bc56ad8c74b858 kaixuxia          2019-09-03  3382  			goto out_trans_cancel;
bc56ad8c74b858 kaixuxia          2019-09-03  3383  		}
bc56ad8c74b858 kaixuxia          2019-09-03  3384  	}
bc56ad8c74b858 kaixuxia          2019-09-03  3385  
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3386  	/*
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3387  	 * Lock the AGI buffers we need to handle bumping the nlink of the
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3388  	 * whiteout inode off the unlinked list and to handle dropping the
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3389  	 * nlink of the target inode.  Per locking order rules, do this in
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3390  	 * increasing AG order and before directory block allocation tries to
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3391  	 * grab AGFs because we grab AGIs before AGFs.
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3392  	 *
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3393  	 * The (vfs) caller must ensure that if src is a directory then
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3394  	 * target_ip is either null or an empty directory.
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3395  	 */
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3396  	for (i = 0; i < num_inodes && inodes[i] != NULL; i++) {
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3397  		if (inodes[i] == wip ||
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3398  		    (inodes[i] == target_ip &&
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3399  		     (VFS_I(target_ip)->i_nlink == 1 || src_is_directory))) {
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3400  			struct xfs_buf	*bp;
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3401  			xfs_agnumber_t	agno;
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3402  
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3403  			agno = XFS_INO_TO_AGNO(mp, inodes[i]->i_ino);
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3404  			error = xfs_read_agi(mp, tp, agno, &bp);
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3405  			if (error)
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3406  				goto out_trans_cancel;
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3407  		}
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3408  	}
6da1b4b1ab36d8 Darrick J. Wong   2021-01-22  3409  
bc56ad8c74b858 kaixuxia          2019-09-03  3410  	/*
bc56ad8c74b858 kaixuxia          2019-09-03  3411  	 * Directory entry creation below may acquire the AGF. Remove
bc56ad8c74b858 kaixuxia          2019-09-03  3412  	 * the whiteout from the unlinked list first to preserve correct
bc56ad8c74b858 kaixuxia          2019-09-03  3413  	 * AGI/AGF locking order. This dirties the transaction so failures
bc56ad8c74b858 kaixuxia          2019-09-03  3414  	 * after this point will abort and log recovery will clean up the
bc56ad8c74b858 kaixuxia          2019-09-03  3415  	 * mess.
bc56ad8c74b858 kaixuxia          2019-09-03  3416  	 *
bc56ad8c74b858 kaixuxia          2019-09-03  3417  	 * For whiteouts, we need to bump the link count on the whiteout
bc56ad8c74b858 kaixuxia          2019-09-03  3418  	 * inode. After this point, we have a real link, clear the tmpfile
bc56ad8c74b858 kaixuxia          2019-09-03  3419  	 * state flag from the inode so it doesn't accidentally get misused
bc56ad8c74b858 kaixuxia          2019-09-03  3420  	 * in future.
bc56ad8c74b858 kaixuxia          2019-09-03  3421  	 */
bc56ad8c74b858 kaixuxia          2019-09-03  3422  	if (wip) {
f40aadb2bb64fe Dave Chinner      2021-06-02  3423  		struct xfs_perag	*pag;
f40aadb2bb64fe Dave Chinner      2021-06-02  3424  
bc56ad8c74b858 kaixuxia          2019-09-03  3425  		ASSERT(VFS_I(wip)->i_nlink == 0);
f40aadb2bb64fe Dave Chinner      2021-06-02  3426  
f40aadb2bb64fe Dave Chinner      2021-06-02  3427  		pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, wip->i_ino));
f40aadb2bb64fe Dave Chinner      2021-06-02  3428  		error = xfs_iunlink_remove(tp, pag, wip);
f40aadb2bb64fe Dave Chinner      2021-06-02  3429  		xfs_perag_put(pag);
bc56ad8c74b858 kaixuxia          2019-09-03  3430  		if (error)
bc56ad8c74b858 kaixuxia          2019-09-03  3431  			goto out_trans_cancel;
bc56ad8c74b858 kaixuxia          2019-09-03  3432  
bc56ad8c74b858 kaixuxia          2019-09-03  3433  		xfs_bumplink(tp, wip);
bc56ad8c74b858 kaixuxia          2019-09-03  3434  		VFS_I(wip)->i_state &= ~I_LINKABLE;
bc56ad8c74b858 kaixuxia          2019-09-03  3435  	}
bc56ad8c74b858 kaixuxia          2019-09-03  3436  
bc56ad8c74b858 kaixuxia          2019-09-03  3437  	/*
bc56ad8c74b858 kaixuxia          2019-09-03  3438  	 * Set up the target.
bc56ad8c74b858 kaixuxia          2019-09-03  3439  	 */
bc56ad8c74b858 kaixuxia          2019-09-03  3440  	if (target_ip == NULL) {
f6bba2017afb3b Dave Chinner      2013-08-12  3441  		/*
f6bba2017afb3b Dave Chinner      2013-08-12  3442  		 * If target does not exist and the rename crosses
f6bba2017afb3b Dave Chinner      2013-08-12  3443  		 * directories, adjust the target directory link count
f6bba2017afb3b Dave Chinner      2013-08-12  3444  		 * to account for the ".." reference from the new entry.
f6bba2017afb3b Dave Chinner      2013-08-12  3445  		 */
f6bba2017afb3b Dave Chinner      2013-08-12  3446  		error = xfs_dir_createname(tp, target_dp, target_name,
5e63097b3f9723 Allison Henderson 2022-03-22  3447  					   src_ip->i_ino, spaceres, &new_diroffset);
f6bba2017afb3b Dave Chinner      2013-08-12  3448  		if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3449  			goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3450  
f6bba2017afb3b Dave Chinner      2013-08-12  3451  		xfs_trans_ichgtime(tp, target_dp,
f6bba2017afb3b Dave Chinner      2013-08-12  3452  					XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
f6bba2017afb3b Dave Chinner      2013-08-12  3453  
f6bba2017afb3b Dave Chinner      2013-08-12  3454  		if (new_parent && src_is_directory) {
910832697cf855 Eric Sandeen      2019-05-01  3455  			xfs_bumplink(tp, target_dp);
f6bba2017afb3b Dave Chinner      2013-08-12  3456  		}
f6bba2017afb3b Dave Chinner      2013-08-12  3457  	} else { /* target_ip != NULL */
f6bba2017afb3b Dave Chinner      2013-08-12  3458  		/*
f6bba2017afb3b Dave Chinner      2013-08-12  3459  		 * Link the source inode under the target name.
f6bba2017afb3b Dave Chinner      2013-08-12  3460  		 * If the source inode is a directory and we are moving
f6bba2017afb3b Dave Chinner      2013-08-12  3461  		 * it across directories, its ".." entry will be
f6bba2017afb3b Dave Chinner      2013-08-12  3462  		 * inconsistent until we replace that down below.
f6bba2017afb3b Dave Chinner      2013-08-12  3463  		 *
f6bba2017afb3b Dave Chinner      2013-08-12  3464  		 * In case there is already an entry with the same
f6bba2017afb3b Dave Chinner      2013-08-12  3465  		 * name at the destination directory, remove it first.
f6bba2017afb3b Dave Chinner      2013-08-12  3466  		 */
f6bba2017afb3b Dave Chinner      2013-08-12  3467  		error = xfs_dir_replace(tp, target_dp, target_name,
5e63097b3f9723 Allison Henderson 2022-03-22  3468  					src_ip->i_ino, spaceres, &new_diroffset);
f6bba2017afb3b Dave Chinner      2013-08-12  3469  		if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3470  			goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3471  
f6bba2017afb3b Dave Chinner      2013-08-12  3472  		xfs_trans_ichgtime(tp, target_dp,
f6bba2017afb3b Dave Chinner      2013-08-12  3473  					XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
f6bba2017afb3b Dave Chinner      2013-08-12  3474  
f6bba2017afb3b Dave Chinner      2013-08-12  3475  		/*
f6bba2017afb3b Dave Chinner      2013-08-12  3476  		 * Decrement the link count on the target since the target
f6bba2017afb3b Dave Chinner      2013-08-12  3477  		 * dir no longer points to it.
f6bba2017afb3b Dave Chinner      2013-08-12  3478  		 */
f6bba2017afb3b Dave Chinner      2013-08-12  3479  		error = xfs_droplink(tp, target_ip);
f6bba2017afb3b Dave Chinner      2013-08-12  3480  		if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3481  			goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3482  
f6bba2017afb3b Dave Chinner      2013-08-12  3483  		if (src_is_directory) {
f6bba2017afb3b Dave Chinner      2013-08-12  3484  			/*
f6bba2017afb3b Dave Chinner      2013-08-12  3485  			 * Drop the link from the old "." entry.
f6bba2017afb3b Dave Chinner      2013-08-12  3486  			 */
f6bba2017afb3b Dave Chinner      2013-08-12  3487  			error = xfs_droplink(tp, target_ip);
f6bba2017afb3b Dave Chinner      2013-08-12  3488  			if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3489  				goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3490  		}
f6bba2017afb3b Dave Chinner      2013-08-12  3491  	} /* target_ip != NULL */
f6bba2017afb3b Dave Chinner      2013-08-12  3492  
f6bba2017afb3b Dave Chinner      2013-08-12  3493  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3494  	 * Remove the source.
f6bba2017afb3b Dave Chinner      2013-08-12  3495  	 */
f6bba2017afb3b Dave Chinner      2013-08-12  3496  	if (new_parent && src_is_directory) {
f6bba2017afb3b Dave Chinner      2013-08-12  3497  		/*
f6bba2017afb3b Dave Chinner      2013-08-12  3498  		 * Rewrite the ".." entry to point to the new
f6bba2017afb3b Dave Chinner      2013-08-12  3499  		 * directory.
f6bba2017afb3b Dave Chinner      2013-08-12  3500  		 */
f6bba2017afb3b Dave Chinner      2013-08-12  3501  		error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
5e63097b3f9723 Allison Henderson 2022-03-22  3502  					target_dp->i_ino, spaceres, &new_diroffset);
2451337dd04390 Dave Chinner      2014-06-25  3503  		ASSERT(error != -EEXIST);
f6bba2017afb3b Dave Chinner      2013-08-12  3504  		if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3505  			goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3506  	}
f6bba2017afb3b Dave Chinner      2013-08-12  3507  
f6bba2017afb3b Dave Chinner      2013-08-12  3508  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3509  	 * We always want to hit the ctime on the source inode.
f6bba2017afb3b Dave Chinner      2013-08-12  3510  	 *
f6bba2017afb3b Dave Chinner      2013-08-12  3511  	 * This isn't strictly required by the standards since the source
f6bba2017afb3b Dave Chinner      2013-08-12  3512  	 * inode isn't really being changed, but old unix file systems did
f6bba2017afb3b Dave Chinner      2013-08-12  3513  	 * it and some incremental backup programs won't work without it.
f6bba2017afb3b Dave Chinner      2013-08-12  3514  	 */
f6bba2017afb3b Dave Chinner      2013-08-12  3515  	xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG);
f6bba2017afb3b Dave Chinner      2013-08-12  3516  	xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE);
f6bba2017afb3b Dave Chinner      2013-08-12  3517  
f6bba2017afb3b Dave Chinner      2013-08-12  3518  	/*
f6bba2017afb3b Dave Chinner      2013-08-12  3519  	 * Adjust the link count on src_dp.  This is necessary when
f6bba2017afb3b Dave Chinner      2013-08-12  3520  	 * renaming a directory, either within one parent when
f6bba2017afb3b Dave Chinner      2013-08-12  3521  	 * the target existed, or across two parent directories.
f6bba2017afb3b Dave Chinner      2013-08-12  3522  	 */
f6bba2017afb3b Dave Chinner      2013-08-12  3523  	if (src_is_directory && (new_parent || target_ip != NULL)) {
f6bba2017afb3b Dave Chinner      2013-08-12  3524  
f6bba2017afb3b Dave Chinner      2013-08-12  3525  		/*
f6bba2017afb3b Dave Chinner      2013-08-12  3526  		 * Decrement link count on src_directory since the
f6bba2017afb3b Dave Chinner      2013-08-12  3527  		 * entry that's moved no longer points to it.
f6bba2017afb3b Dave Chinner      2013-08-12  3528  		 */
f6bba2017afb3b Dave Chinner      2013-08-12  3529  		error = xfs_droplink(tp, src_dp);
f6bba2017afb3b Dave Chinner      2013-08-12  3530  		if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3531  			goto out_trans_cancel;
f6bba2017afb3b Dave Chinner      2013-08-12  3532  	}
f6bba2017afb3b Dave Chinner      2013-08-12  3533  
7dcf5c3e4527cf Dave Chinner      2015-03-25  3534  	/*
7dcf5c3e4527cf Dave Chinner      2015-03-25  3535  	 * For whiteouts, we only need to update the source dirent with the
7dcf5c3e4527cf Dave Chinner      2015-03-25  3536  	 * inode number of the whiteout inode rather than removing it
7dcf5c3e4527cf Dave Chinner      2015-03-25  3537  	 * altogether.
7dcf5c3e4527cf Dave Chinner      2015-03-25  3538  	 */
49076df67754f5 Chandan Babu R    2022-04-11  3539  	if (wip)
7dcf5c3e4527cf Dave Chinner      2015-03-25  3540  		error = xfs_dir_replace(tp, src_dp, src_name, wip->i_ino,
5e63097b3f9723 Allison Henderson 2022-03-22  3541  					spaceres, &old_diroffset);
49076df67754f5 Chandan Babu R    2022-04-11  3542  	else
f6bba2017afb3b Dave Chinner      2013-08-12  3543  		error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
5e63097b3f9723 Allison Henderson 2022-03-22  3544  					   spaceres, &old_diroffset);
5e63097b3f9723 Allison Henderson 2022-03-22  3545  
5e63097b3f9723 Allison Henderson 2022-03-22  3546  	if (error)
5e63097b3f9723 Allison Henderson 2022-03-22  3547  		goto out_trans_cancel;
5e63097b3f9723 Allison Henderson 2022-03-22  3548  
5e63097b3f9723 Allison Henderson 2022-03-22  3549  out_pptr:
5e63097b3f9723 Allison Henderson 2022-03-22  3550  	if (xfs_sb_version_hasparent(&mp->m_sb)) {
5e63097b3f9723 Allison Henderson 2022-03-22  3551  		new_args.trans	= tp;
5e63097b3f9723 Allison Henderson 2022-03-22  3552  		xfs_init_parent_name_rec(&new_rec, target_dp, new_diroffset);
5e63097b3f9723 Allison Henderson 2022-03-22  3553  		new_args.hashval = xfs_da_hashname(new_args.name,
5e63097b3f9723 Allison Henderson 2022-03-22  3554  						   new_args.namelen);
5e63097b3f9723 Allison Henderson 2022-03-22  3555  		error =  xfs_attr_defer_add(&new_args);
5e63097b3f9723 Allison Henderson 2022-03-22  3556  		if (error)
5e63097b3f9723 Allison Henderson 2022-03-22  3557  			goto out_trans_cancel;
02092a2f034fde Chandan Babu R    2021-01-22  3558  
5e63097b3f9723 Allison Henderson 2022-03-22  3559  		old_args.trans	= tp;
5e63097b3f9723 Allison Henderson 2022-03-22  3560  		xfs_init_parent_name_rec(&old_rec, src_dp, old_diroffset);
5e63097b3f9723 Allison Henderson 2022-03-22  3561  		old_args.hashval = xfs_da_hashname(old_args.name,
5e63097b3f9723 Allison Henderson 2022-03-22  3562  						   old_args.namelen);
5e63097b3f9723 Allison Henderson 2022-03-22  3563  		error = xfs_attr_defer_remove(&old_args);
f6bba2017afb3b Dave Chinner      2013-08-12  3564  		if (error)
c8eac49ef798a7 Brian Foster      2018-07-24  3565  			goto out_trans_cancel;
5e63097b3f9723 Allison Henderson 2022-03-22  3566  	}
f6bba2017afb3b Dave Chinner      2013-08-12  3567  
f6bba2017afb3b Dave Chinner      2013-08-12  3568  	xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
f6bba2017afb3b Dave Chinner      2013-08-12  3569  	xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE);
f6bba2017afb3b Dave Chinner      2013-08-12  3570  	if (new_parent)
f6bba2017afb3b Dave Chinner      2013-08-12  3571  		xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE);
f6bba2017afb3b Dave Chinner      2013-08-12  3572  
c9cfdb38117217 Brian Foster      2018-07-11  3573  	error = xfs_finish_rename(tp);
5e63097b3f9723 Allison Henderson 2022-03-22  3574  
5e63097b3f9723 Allison Henderson 2022-03-22  3575  out_unlock:
7dcf5c3e4527cf Dave Chinner      2015-03-25  3576  	if (wip)
44a8736bd20a08 Darrick J. Wong   2018-07-25  3577  		xfs_irele(wip);
5e63097b3f9723 Allison Henderson 2022-03-22  3578  	if (wip)
5e63097b3f9723 Allison Henderson 2022-03-22  3579  		xfs_iunlock(wip, XFS_ILOCK_EXCL);
5e63097b3f9723 Allison Henderson 2022-03-22  3580  	if (target_ip)
5e63097b3f9723 Allison Henderson 2022-03-22  3581  		xfs_iunlock(target_ip, XFS_ILOCK_EXCL);
5e63097b3f9723 Allison Henderson 2022-03-22  3582  	xfs_iunlock(src_ip, XFS_ILOCK_EXCL);
5e63097b3f9723 Allison Henderson 2022-03-22  3583  	if (new_parent)
5e63097b3f9723 Allison Henderson 2022-03-22  3584  		xfs_iunlock(target_dp, XFS_ILOCK_EXCL);
5e63097b3f9723 Allison Henderson 2022-03-22  3585  	xfs_iunlock(src_dp, XFS_ILOCK_EXCL);
5e63097b3f9723 Allison Henderson 2022-03-22  3586  
7dcf5c3e4527cf Dave Chinner      2015-03-25  3587  	return error;
f6bba2017afb3b Dave Chinner      2013-08-12  3588  
445883e8133975 Dave Chinner      2015-03-25  3589  out_trans_cancel:
4906e21545814e Christoph Hellwig 2015-06-04  3590  	xfs_trans_cancel(tp);
5e63097b3f9723 Allison Henderson 2022-03-22  3591  drop_incompat:
5e63097b3f9723 Allison Henderson 2022-03-22  3592  	if (xfs_has_larp(mp))
5e63097b3f9723 Allison Henderson 2022-03-22  3593  		xlog_drop_incompat_feat(mp->m_log);
253f4911f297b8 Christoph Hellwig 2016-04-06  3594  out_release_wip:
7dcf5c3e4527cf Dave Chinner      2015-03-25  3595  	if (wip)
44a8736bd20a08 Darrick J. Wong   2018-07-25  3596  		xfs_irele(wip);
41667260bc84db Darrick J. Wong   2022-03-09  3597  	if (error == -ENOSPC && nospace_error)
41667260bc84db Darrick J. Wong   2022-03-09  3598  		error = nospace_error;
f6bba2017afb3b Dave Chinner      2013-08-12  3599  	return error;
f6bba2017afb3b Dave Chinner      2013-08-12  3600  }
f6bba2017afb3b Dave Chinner      2013-08-12  3601  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-11 16:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-11 16:16 [allisonhenderson-xfs-work:xfs-5.19-compose_pptrs 28/32] fs/xfs/xfs_inode.c:3329:3: warning: Value stored to 'error' is never read [clang-analyzer-deadcode.DeadStores] kernel test robot

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.