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