Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

cachefiles: change cachefiles_bury_object to use start_renaming_dentry()

Rather then using lock_rename() and lookup_one() etc we can use
the new start_renaming_dentry(). This is part of centralising dir
locking and lookup so that locking rules can be changed.

Some error check are removed as not necessary. Checks for rep being a
non-dir or IS_DEADDIR and the check that ->graveyard is still a
directory only provide slightly more informative errors and have been
dropped.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: NeilBrown <neil@brown.name>
Link: https://patch.msgid.link/20260224222542.3458677-11-neilb@ownmail.net
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

NeilBrown and committed by
Christian Brauner
deef0499 2c3a9eb1

+34 -63
+34 -63
fs/cachefiles/namei.c
··· 270 270 struct dentry *rep, 271 271 enum fscache_why_object_killed why) 272 272 { 273 - struct dentry *grave, *trap; 273 + struct dentry *grave; 274 + struct renamedata rd = {}; 274 275 struct path path, path_to_graveyard; 275 276 char nbuffer[8 + 8 + 1]; 276 277 int ret; ··· 303 302 (uint32_t) ktime_get_real_seconds(), 304 303 (uint32_t) atomic_inc_return(&cache->gravecounter)); 305 304 306 - /* do the multiway lock magic */ 307 - trap = lock_rename(cache->graveyard, dir); 308 - if (IS_ERR(trap)) 309 - return PTR_ERR(trap); 310 - 311 - /* do some checks before getting the grave dentry */ 312 - if (rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) { 313 - /* the entry was probably culled when we dropped the parent dir 314 - * lock */ 315 - unlock_rename(cache->graveyard, dir); 316 - _leave(" = 0 [culled?]"); 317 - return 0; 318 - } 319 - 320 - if (!d_can_lookup(cache->graveyard)) { 321 - unlock_rename(cache->graveyard, dir); 322 - cachefiles_io_error(cache, "Graveyard no longer a directory"); 323 - return -EIO; 324 - } 325 - 326 - if (trap == rep) { 327 - unlock_rename(cache->graveyard, dir); 328 - cachefiles_io_error(cache, "May not make directory loop"); 329 - return -EIO; 330 - } 331 - 332 - if (d_mountpoint(rep)) { 333 - unlock_rename(cache->graveyard, dir); 334 - cachefiles_io_error(cache, "Mountpoint in cache"); 335 - return -EIO; 336 - } 337 - 338 - grave = lookup_one(&nop_mnt_idmap, &QSTR(nbuffer), cache->graveyard); 339 - if (IS_ERR(grave)) { 340 - unlock_rename(cache->graveyard, dir); 341 - trace_cachefiles_vfs_error(object, d_inode(cache->graveyard), 342 - PTR_ERR(grave), 343 - cachefiles_trace_lookup_error); 344 - 345 - if (PTR_ERR(grave) == -ENOMEM) { 305 + rd.mnt_idmap = &nop_mnt_idmap; 306 + rd.old_parent = dir; 307 + rd.new_parent = cache->graveyard; 308 + rd.flags = 0; 309 + ret = start_renaming_dentry(&rd, 0, rep, &QSTR(nbuffer)); 310 + if (ret) { 311 + /* Some errors aren't fatal */ 312 + if (ret == -EXDEV) 313 + /* double-lock failed */ 314 + return ret; 315 + if (d_unhashed(rep) || rep->d_parent != dir || IS_DEADDIR(d_inode(rep))) { 316 + /* the entry was probably culled when we dropped the parent dir 317 + * lock */ 318 + _leave(" = 0 [culled?]"); 319 + return 0; 320 + } 321 + if (ret == -EINVAL || ret == -ENOTEMPTY) { 322 + cachefiles_io_error(cache, "May not make directory loop"); 323 + return -EIO; 324 + } 325 + if (ret == -ENOMEM) { 346 326 _leave(" = -ENOMEM"); 347 327 return -ENOMEM; 348 328 } 349 329 350 - cachefiles_io_error(cache, "Lookup error %ld", PTR_ERR(grave)); 330 + cachefiles_io_error(cache, "Lookup error %d", ret); 351 331 return -EIO; 352 332 } 353 333 334 + if (d_mountpoint(rep)) { 335 + end_renaming(&rd); 336 + cachefiles_io_error(cache, "Mountpoint in cache"); 337 + return -EIO; 338 + } 339 + 340 + grave = rd.new_dentry; 354 341 if (d_is_positive(grave)) { 355 - unlock_rename(cache->graveyard, dir); 356 - dput(grave); 342 + end_renaming(&rd); 357 343 grave = NULL; 358 344 cond_resched(); 359 345 goto try_again; 360 346 } 361 347 362 348 if (d_mountpoint(grave)) { 363 - unlock_rename(cache->graveyard, dir); 364 - dput(grave); 349 + end_renaming(&rd); 365 350 cachefiles_io_error(cache, "Mountpoint in graveyard"); 366 - return -EIO; 367 - } 368 - 369 - /* target should not be an ancestor of source */ 370 - if (trap == grave) { 371 - unlock_rename(cache->graveyard, dir); 372 - dput(grave); 373 - cachefiles_io_error(cache, "May not make directory loop"); 374 351 return -EIO; 375 352 } 376 353 ··· 361 382 if (ret < 0) { 362 383 cachefiles_io_error(cache, "Rename security error %d", ret); 363 384 } else { 364 - struct renamedata rd = { 365 - .mnt_idmap = &nop_mnt_idmap, 366 - .old_parent = dir, 367 - .old_dentry = rep, 368 - .new_parent = cache->graveyard, 369 - .new_dentry = grave, 370 - }; 371 385 trace_cachefiles_rename(object, d_inode(rep)->i_ino, why); 372 386 ret = cachefiles_inject_read_error(); 373 387 if (ret == 0) ··· 374 402 } 375 403 376 404 __cachefiles_unmark_inode_in_use(object, d_inode(rep)); 377 - unlock_rename(cache->graveyard, dir); 378 - dput(grave); 405 + end_renaming(&rd); 379 406 _leave(" = 0"); 380 407 return 0; 381 408 }