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

Merge tag 'ovl-update-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs

Pull overlayfs updates from Miklos Szeredi:
"A mix of fixes and cleanups"

* tag 'ovl-update-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs:
ovl: automatically enable redirect_dir on metacopy=on
ovl: check whiteout in ovl_create_over_whiteout()
ovl: using posix_acl_xattr_size() to get size instead of posix_acl_to_xattr()
ovl: abstract ovl_inode lock with a helper
ovl: remove the 'locked' argument of ovl_nlink_{start,end}
ovl: relax requirement for non null uuid of lower fs
ovl: fold copy-up helpers into callers
ovl: untangle copy up call chain
ovl: relax permission checking on underlying layers
ovl: fix recursive oi->lock in ovl_link()
vfs: fix FIGETBSZ ioctl on an overlayfs file
ovl: clean up error handling in ovl_get_tmpfile()
ovl: fix error handling in ovl_verify_set_fh()

+267 -152
+6
Documentation/filesystems/overlayfs.txt
··· 286 286 "trusted." xattrs will require CAP_SYS_ADMIN. But it should be possible 287 287 for untrusted layers like from a pen drive. 288 288 289 + Note: redirect_dir={off|nofollow|follow(*)} conflicts with metacopy=on, and 290 + results in an error. 291 + 292 + (*) redirect_dir=follow only conflicts with metacopy=on if upperdir=... is 293 + given. 294 + 289 295 Sharing and copying layers 290 296 -------------------------- 291 297
+3
fs/ioctl.c
··· 669 669 return ioctl_fiemap(filp, arg); 670 670 671 671 case FIGETBSZ: 672 + /* anon_bdev filesystems may not have a block size */ 673 + if (!inode->i_sb->s_blocksize) 674 + return -EINVAL; 672 675 return put_user(inode->i_sb->s_blocksize, argp); 673 676 674 677 case FICLONE:
+128 -97
fs/overlayfs/copy_up.c
··· 395 395 struct dentry *destdir; 396 396 struct qstr destname; 397 397 struct dentry *workdir; 398 - bool tmpfile; 399 398 bool origin; 400 399 bool indexed; 401 400 bool metacopy; ··· 437 438 err = ovl_set_nlink_upper(c->dentry); 438 439 439 440 return err; 440 - } 441 - 442 - static int ovl_install_temp(struct ovl_copy_up_ctx *c, struct dentry *temp, 443 - struct dentry **newdentry) 444 - { 445 - int err; 446 - struct dentry *upper; 447 - struct inode *udir = d_inode(c->destdir); 448 - 449 - upper = lookup_one_len(c->destname.name, c->destdir, c->destname.len); 450 - if (IS_ERR(upper)) 451 - return PTR_ERR(upper); 452 - 453 - if (c->tmpfile) 454 - err = ovl_do_link(temp, udir, upper); 455 - else 456 - err = ovl_do_rename(d_inode(c->workdir), temp, udir, upper, 0); 457 - 458 - if (!err) 459 - *newdentry = dget(c->tmpfile ? upper : temp); 460 - dput(upper); 461 - 462 - return err; 463 - } 464 - 465 - static struct dentry *ovl_get_tmpfile(struct ovl_copy_up_ctx *c) 466 - { 467 - int err; 468 - struct dentry *temp; 469 - const struct cred *old_creds = NULL; 470 - struct cred *new_creds = NULL; 471 - struct ovl_cattr cattr = { 472 - /* Can't properly set mode on creation because of the umask */ 473 - .mode = c->stat.mode & S_IFMT, 474 - .rdev = c->stat.rdev, 475 - .link = c->link 476 - }; 477 - 478 - err = security_inode_copy_up(c->dentry, &new_creds); 479 - temp = ERR_PTR(err); 480 - if (err < 0) 481 - goto out; 482 - 483 - if (new_creds) 484 - old_creds = override_creds(new_creds); 485 - 486 - if (c->tmpfile) 487 - temp = ovl_do_tmpfile(c->workdir, c->stat.mode); 488 - else 489 - temp = ovl_create_temp(c->workdir, &cattr); 490 - out: 491 - if (new_creds) { 492 - revert_creds(old_creds); 493 - put_cred(new_creds); 494 - } 495 - 496 - return temp; 497 441 } 498 442 499 443 static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp) ··· 490 548 return err; 491 549 } 492 550 493 - static int ovl_copy_up_locked(struct ovl_copy_up_ctx *c) 551 + struct ovl_cu_creds { 552 + const struct cred *old; 553 + struct cred *new; 554 + }; 555 + 556 + static int ovl_prep_cu_creds(struct dentry *dentry, struct ovl_cu_creds *cc) 494 557 { 495 - struct inode *udir = c->destdir->d_inode; 496 - struct inode *inode; 497 - struct dentry *newdentry = NULL; 498 - struct dentry *temp; 499 558 int err; 500 559 501 - temp = ovl_get_tmpfile(c); 560 + cc->old = cc->new = NULL; 561 + err = security_inode_copy_up(dentry, &cc->new); 562 + if (err < 0) 563 + return err; 564 + 565 + if (cc->new) 566 + cc->old = override_creds(cc->new); 567 + 568 + return 0; 569 + } 570 + 571 + static void ovl_revert_cu_creds(struct ovl_cu_creds *cc) 572 + { 573 + if (cc->new) { 574 + revert_creds(cc->old); 575 + put_cred(cc->new); 576 + } 577 + } 578 + 579 + /* 580 + * Copyup using workdir to prepare temp file. Used when copying up directories, 581 + * special files or when upper fs doesn't support O_TMPFILE. 582 + */ 583 + static int ovl_copy_up_workdir(struct ovl_copy_up_ctx *c) 584 + { 585 + struct inode *inode; 586 + struct inode *udir = d_inode(c->destdir), *wdir = d_inode(c->workdir); 587 + struct dentry *temp, *upper; 588 + struct ovl_cu_creds cc; 589 + int err; 590 + struct ovl_cattr cattr = { 591 + /* Can't properly set mode on creation because of the umask */ 592 + .mode = c->stat.mode & S_IFMT, 593 + .rdev = c->stat.rdev, 594 + .link = c->link 595 + }; 596 + 597 + err = ovl_lock_rename_workdir(c->workdir, c->destdir); 598 + if (err) 599 + return err; 600 + 601 + err = ovl_prep_cu_creds(c->dentry, &cc); 602 + if (err) 603 + goto unlock; 604 + 605 + temp = ovl_create_temp(c->workdir, &cattr); 606 + ovl_revert_cu_creds(&cc); 607 + 608 + err = PTR_ERR(temp); 609 + if (IS_ERR(temp)) 610 + goto unlock; 611 + 612 + err = ovl_copy_up_inode(c, temp); 613 + if (err) 614 + goto cleanup; 615 + 616 + if (S_ISDIR(c->stat.mode) && c->indexed) { 617 + err = ovl_create_index(c->dentry, c->lowerpath.dentry, temp); 618 + if (err) 619 + goto cleanup; 620 + } 621 + 622 + upper = lookup_one_len(c->destname.name, c->destdir, c->destname.len); 623 + err = PTR_ERR(upper); 624 + if (IS_ERR(upper)) 625 + goto cleanup; 626 + 627 + err = ovl_do_rename(wdir, temp, udir, upper, 0); 628 + dput(upper); 629 + if (err) 630 + goto cleanup; 631 + 632 + if (!c->metacopy) 633 + ovl_set_upperdata(d_inode(c->dentry)); 634 + inode = d_inode(c->dentry); 635 + ovl_inode_update(inode, temp); 636 + if (S_ISDIR(inode->i_mode)) 637 + ovl_set_flag(OVL_WHITEOUTS, inode); 638 + unlock: 639 + unlock_rename(c->workdir, c->destdir); 640 + 641 + return err; 642 + 643 + cleanup: 644 + ovl_cleanup(wdir, temp); 645 + dput(temp); 646 + goto unlock; 647 + } 648 + 649 + /* Copyup using O_TMPFILE which does not require cross dir locking */ 650 + static int ovl_copy_up_tmpfile(struct ovl_copy_up_ctx *c) 651 + { 652 + struct inode *udir = d_inode(c->destdir); 653 + struct dentry *temp, *upper; 654 + struct ovl_cu_creds cc; 655 + int err; 656 + 657 + err = ovl_prep_cu_creds(c->dentry, &cc); 658 + if (err) 659 + return err; 660 + 661 + temp = ovl_do_tmpfile(c->workdir, c->stat.mode); 662 + ovl_revert_cu_creds(&cc); 663 + 502 664 if (IS_ERR(temp)) 503 665 return PTR_ERR(temp); 504 666 505 667 err = ovl_copy_up_inode(c, temp); 506 668 if (err) 507 - goto out; 669 + goto out_dput; 508 670 509 - if (S_ISDIR(c->stat.mode) && c->indexed) { 510 - err = ovl_create_index(c->dentry, c->lowerpath.dentry, temp); 511 - if (err) 512 - goto out; 513 - } 671 + inode_lock_nested(udir, I_MUTEX_PARENT); 514 672 515 - if (c->tmpfile) { 516 - inode_lock_nested(udir, I_MUTEX_PARENT); 517 - err = ovl_install_temp(c, temp, &newdentry); 518 - inode_unlock(udir); 519 - } else { 520 - err = ovl_install_temp(c, temp, &newdentry); 673 + upper = lookup_one_len(c->destname.name, c->destdir, c->destname.len); 674 + err = PTR_ERR(upper); 675 + if (!IS_ERR(upper)) { 676 + err = ovl_do_link(temp, udir, upper); 677 + dput(upper); 521 678 } 679 + inode_unlock(udir); 680 + 522 681 if (err) 523 - goto out; 682 + goto out_dput; 524 683 525 684 if (!c->metacopy) 526 685 ovl_set_upperdata(d_inode(c->dentry)); 527 - inode = d_inode(c->dentry); 528 - ovl_inode_update(inode, newdentry); 529 - if (S_ISDIR(inode->i_mode)) 530 - ovl_set_flag(OVL_WHITEOUTS, inode); 686 + ovl_inode_update(d_inode(c->dentry), temp); 531 687 532 - out: 533 - if (err && !c->tmpfile) 534 - ovl_cleanup(d_inode(c->workdir), temp); 688 + return 0; 689 + 690 + out_dput: 535 691 dput(temp); 536 692 return err; 537 - 538 693 } 539 694 540 695 /* ··· 685 646 } 686 647 687 648 /* Should we copyup with O_TMPFILE or with workdir? */ 688 - if (S_ISREG(c->stat.mode) && ofs->tmpfile) { 689 - c->tmpfile = true; 690 - err = ovl_copy_up_locked(c); 691 - } else { 692 - err = ovl_lock_rename_workdir(c->workdir, c->destdir); 693 - if (!err) { 694 - err = ovl_copy_up_locked(c); 695 - unlock_rename(c->workdir, c->destdir); 696 - } 697 - } 698 - 699 - 649 + if (S_ISREG(c->stat.mode) && ofs->tmpfile) 650 + err = ovl_copy_up_tmpfile(c); 651 + else 652 + err = ovl_copy_up_workdir(c); 700 653 if (err) 701 654 goto out; 702 655
+21 -13
fs/overlayfs/dir.c
··· 414 414 if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !acl) 415 415 return 0; 416 416 417 - size = posix_acl_to_xattr(NULL, acl, NULL, 0); 417 + size = posix_acl_xattr_size(acl->a_count); 418 418 buffer = kmalloc(size, GFP_KERNEL); 419 419 if (!buffer) 420 420 return -ENOMEM; 421 421 422 - size = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); 423 - err = size; 422 + err = posix_acl_to_xattr(&init_user_ns, acl, buffer, size); 424 423 if (err < 0) 425 424 goto out_free; 426 425 ··· 461 462 err = PTR_ERR(upper); 462 463 if (IS_ERR(upper)) 463 464 goto out_unlock; 465 + 466 + err = -ESTALE; 467 + if (d_is_negative(upper) || !IS_WHITEOUT(d_inode(upper))) 468 + goto out_dput; 464 469 465 470 newdentry = ovl_create_temp(workdir, cattr); 466 471 err = PTR_ERR(newdentry); ··· 655 652 struct dentry *new) 656 653 { 657 654 int err; 658 - bool locked = false; 659 655 struct inode *inode; 660 656 661 657 err = ovl_want_write(old); ··· 665 663 if (err) 666 664 goto out_drop_write; 667 665 666 + err = ovl_copy_up(new->d_parent); 667 + if (err) 668 + goto out_drop_write; 669 + 668 670 if (ovl_is_metacopy_dentry(old)) { 669 671 err = ovl_set_redirect(old, false); 670 672 if (err) 671 673 goto out_drop_write; 672 674 } 673 675 674 - err = ovl_nlink_start(old, &locked); 676 + err = ovl_nlink_start(old); 675 677 if (err) 676 678 goto out_drop_write; 677 679 ··· 688 682 if (err) 689 683 iput(inode); 690 684 691 - ovl_nlink_end(old, locked); 685 + ovl_nlink_end(old); 692 686 out_drop_write: 693 687 ovl_drop_write(old); 694 688 out: ··· 813 807 static int ovl_do_remove(struct dentry *dentry, bool is_dir) 814 808 { 815 809 int err; 816 - bool locked = false; 817 810 const struct cred *old_cred; 818 811 struct dentry *upperdentry; 819 812 bool lower_positive = ovl_lower_positive(dentry); ··· 833 828 if (err) 834 829 goto out_drop_write; 835 830 836 - err = ovl_nlink_start(dentry, &locked); 831 + err = ovl_nlink_start(dentry); 837 832 if (err) 838 833 goto out_drop_write; 839 834 ··· 849 844 else 850 845 drop_nlink(dentry->d_inode); 851 846 } 852 - ovl_nlink_end(dentry, locked); 847 + ovl_nlink_end(dentry); 853 848 854 849 /* 855 850 * Copy ctime ··· 1013 1008 unsigned int flags) 1014 1009 { 1015 1010 int err; 1016 - bool locked = false; 1017 1011 struct dentry *old_upperdir; 1018 1012 struct dentry *new_upperdir; 1019 1013 struct dentry *olddentry; ··· 1021 1017 bool old_opaque; 1022 1018 bool new_opaque; 1023 1019 bool cleanup_whiteout = false; 1020 + bool update_nlink = false; 1024 1021 bool overwrite = !(flags & RENAME_EXCHANGE); 1025 1022 bool is_dir = d_is_dir(old); 1026 1023 bool new_is_dir = d_is_dir(new); ··· 1079 1074 err = ovl_copy_up(new); 1080 1075 if (err) 1081 1076 goto out_drop_write; 1082 - } else { 1083 - err = ovl_nlink_start(new, &locked); 1077 + } else if (d_inode(new)) { 1078 + err = ovl_nlink_start(new); 1084 1079 if (err) 1085 1080 goto out_drop_write; 1081 + 1082 + update_nlink = true; 1086 1083 } 1087 1084 1088 1085 old_cred = ovl_override_creds(old->d_sb); ··· 1213 1206 unlock_rename(new_upperdir, old_upperdir); 1214 1207 out_revert_creds: 1215 1208 revert_creds(old_cred); 1216 - ovl_nlink_end(new, locked); 1209 + if (update_nlink) 1210 + ovl_nlink_end(new); 1217 1211 out_drop_write: 1218 1212 ovl_drop_write(old); 1219 1213 out:
+13 -4
fs/overlayfs/inode.c
··· 286 286 if (err) 287 287 return err; 288 288 289 - old_cred = ovl_override_creds(inode->i_sb); 290 - if (!upperinode && 291 - !special_file(realinode->i_mode) && mask & MAY_WRITE) { 289 + /* No need to do any access on underlying for special files */ 290 + if (special_file(realinode->i_mode)) 291 + return 0; 292 + 293 + /* No need to access underlying for execute */ 294 + mask &= ~MAY_EXEC; 295 + if ((mask & (MAY_READ | MAY_WRITE)) == 0) 296 + return 0; 297 + 298 + /* Lower files get copied up, so turn write access into read */ 299 + if (!upperinode && mask & MAY_WRITE) { 292 300 mask &= ~(MAY_WRITE | MAY_APPEND); 293 - /* Make sure mounter can read file for copy up later */ 294 301 mask |= MAY_READ; 295 302 } 303 + 304 + old_cred = ovl_override_creds(inode->i_sb); 296 305 err = inode_permission(realinode, mask); 297 306 revert_creds(old_cred); 298 307
+3 -1
fs/overlayfs/namei.c
··· 422 422 423 423 fh = ovl_encode_real_fh(real, is_upper); 424 424 err = PTR_ERR(fh); 425 - if (IS_ERR(fh)) 425 + if (IS_ERR(fh)) { 426 + fh = NULL; 426 427 goto fail; 428 + } 427 429 428 430 err = ovl_verify_fh(dentry, name, fh); 429 431 if (set && err == -ENODATA)
+12 -2
fs/overlayfs/overlayfs.h
··· 271 271 bool ovl_inuse_trylock(struct dentry *dentry); 272 272 void ovl_inuse_unlock(struct dentry *dentry); 273 273 bool ovl_need_index(struct dentry *dentry); 274 - int ovl_nlink_start(struct dentry *dentry, bool *locked); 275 - void ovl_nlink_end(struct dentry *dentry, bool locked); 274 + int ovl_nlink_start(struct dentry *dentry); 275 + void ovl_nlink_end(struct dentry *dentry); 276 276 int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir); 277 277 int ovl_check_metacopy_xattr(struct dentry *dentry); 278 278 bool ovl_is_metacopy_dentry(struct dentry *dentry); ··· 288 288 struct ovl_fs *ofs = sb->s_fs_info; 289 289 290 290 return ofs->xino_bits; 291 + } 292 + 293 + static inline int ovl_inode_lock(struct inode *inode) 294 + { 295 + return mutex_lock_interruptible(&OVL_I(inode)->lock); 296 + } 297 + 298 + static inline void ovl_inode_unlock(struct inode *inode) 299 + { 300 + mutex_unlock(&OVL_I(inode)->lock); 291 301 } 292 302 293 303
+60 -10
fs/overlayfs/super.c
··· 472 472 { 473 473 char *p; 474 474 int err; 475 + bool metacopy_opt = false, redirect_opt = false; 475 476 476 477 config->redirect_mode = kstrdup(ovl_redirect_mode_def(), GFP_KERNEL); 477 478 if (!config->redirect_mode) ··· 517 516 config->redirect_mode = match_strdup(&args[0]); 518 517 if (!config->redirect_mode) 519 518 return -ENOMEM; 519 + redirect_opt = true; 520 520 break; 521 521 522 522 case OPT_INDEX_ON: ··· 550 548 551 549 case OPT_METACOPY_ON: 552 550 config->metacopy = true; 551 + metacopy_opt = true; 553 552 break; 554 553 555 554 case OPT_METACOPY_OFF: ··· 575 572 if (err) 576 573 return err; 577 574 578 - /* metacopy feature with upper requires redirect_dir=on */ 579 - if (config->upperdir && config->metacopy && !config->redirect_dir) { 580 - pr_warn("overlayfs: metadata only copy up requires \"redirect_dir=on\", falling back to metacopy=off.\n"); 581 - config->metacopy = false; 582 - } else if (config->metacopy && !config->redirect_follow) { 583 - pr_warn("overlayfs: metadata only copy up requires \"redirect_dir=follow\" on non-upper mount, falling back to metacopy=off.\n"); 584 - config->metacopy = false; 575 + /* 576 + * This is to make the logic below simpler. It doesn't make any other 577 + * difference, since config->redirect_dir is only used for upper. 578 + */ 579 + if (!config->upperdir && config->redirect_follow) 580 + config->redirect_dir = true; 581 + 582 + /* Resolve metacopy -> redirect_dir dependency */ 583 + if (config->metacopy && !config->redirect_dir) { 584 + if (metacopy_opt && redirect_opt) { 585 + pr_err("overlayfs: conflicting options: metacopy=on,redirect_dir=%s\n", 586 + config->redirect_mode); 587 + return -EINVAL; 588 + } 589 + if (redirect_opt) { 590 + /* 591 + * There was an explicit redirect_dir=... that resulted 592 + * in this conflict. 593 + */ 594 + pr_info("overlayfs: disabling metacopy due to redirect_dir=%s\n", 595 + config->redirect_mode); 596 + config->metacopy = false; 597 + } else { 598 + /* Automatically enable redirect otherwise. */ 599 + config->redirect_follow = config->redirect_dir = true; 600 + } 585 601 } 586 602 587 603 return 0; ··· 1197 1175 return err; 1198 1176 } 1199 1177 1200 - /* Get a unique fsid for the layer */ 1201 - static int ovl_get_fsid(struct ovl_fs *ofs, struct super_block *sb) 1178 + static bool ovl_lower_uuid_ok(struct ovl_fs *ofs, const uuid_t *uuid) 1202 1179 { 1180 + unsigned int i; 1181 + 1182 + if (!ofs->config.nfs_export && !(ofs->config.index && ofs->upper_mnt)) 1183 + return true; 1184 + 1185 + for (i = 0; i < ofs->numlowerfs; i++) { 1186 + /* 1187 + * We use uuid to associate an overlay lower file handle with a 1188 + * lower layer, so we can accept lower fs with null uuid as long 1189 + * as all lower layers with null uuid are on the same fs. 1190 + */ 1191 + if (uuid_equal(&ofs->lower_fs[i].sb->s_uuid, uuid)) 1192 + return false; 1193 + } 1194 + return true; 1195 + } 1196 + 1197 + /* Get a unique fsid for the layer */ 1198 + static int ovl_get_fsid(struct ovl_fs *ofs, const struct path *path) 1199 + { 1200 + struct super_block *sb = path->mnt->mnt_sb; 1203 1201 unsigned int i; 1204 1202 dev_t dev; 1205 1203 int err; ··· 1231 1189 for (i = 0; i < ofs->numlowerfs; i++) { 1232 1190 if (ofs->lower_fs[i].sb == sb) 1233 1191 return i + 1; 1192 + } 1193 + 1194 + if (!ovl_lower_uuid_ok(ofs, &sb->s_uuid)) { 1195 + ofs->config.index = false; 1196 + ofs->config.nfs_export = false; 1197 + pr_warn("overlayfs: %s uuid detected in lower fs '%pd2', falling back to index=off,nfs_export=off.\n", 1198 + uuid_is_null(&sb->s_uuid) ? "null" : "conflicting", 1199 + path->dentry); 1234 1200 } 1235 1201 1236 1202 err = get_anon_bdev(&dev); ··· 1275 1225 struct vfsmount *mnt; 1276 1226 int fsid; 1277 1227 1278 - err = fsid = ovl_get_fsid(ofs, stack[i].mnt->mnt_sb); 1228 + err = fsid = ovl_get_fsid(ofs, &stack[i]); 1279 1229 if (err < 0) 1280 1230 goto out; 1281 1231
+21 -25
fs/overlayfs/util.c
··· 65 65 */ 66 66 int ovl_can_decode_fh(struct super_block *sb) 67 67 { 68 - if (!sb->s_export_op || !sb->s_export_op->fh_to_dentry || 69 - uuid_is_null(&sb->s_uuid)) 68 + if (!sb->s_export_op || !sb->s_export_op->fh_to_dentry) 70 69 return 0; 71 70 72 71 return sb->s_export_op->encode_fh ? -1 : FILEID_INO32_GEN; ··· 521 522 522 523 int ovl_copy_up_start(struct dentry *dentry, int flags) 523 524 { 524 - struct ovl_inode *oi = OVL_I(d_inode(dentry)); 525 + struct inode *inode = d_inode(dentry); 525 526 int err; 526 527 527 - err = mutex_lock_interruptible(&oi->lock); 528 + err = ovl_inode_lock(inode); 528 529 if (!err && ovl_already_copied_up_locked(dentry, flags)) { 529 530 err = 1; /* Already copied up */ 530 - mutex_unlock(&oi->lock); 531 + ovl_inode_unlock(inode); 531 532 } 532 533 533 534 return err; ··· 535 536 536 537 void ovl_copy_up_end(struct dentry *dentry) 537 538 { 538 - mutex_unlock(&OVL_I(d_inode(dentry))->lock); 539 + ovl_inode_unlock(d_inode(dentry)); 539 540 } 540 541 541 542 bool ovl_check_origin_xattr(struct dentry *dentry) ··· 738 739 * Operations that change overlay inode and upper inode nlink need to be 739 740 * synchronized with copy up for persistent nlink accounting. 740 741 */ 741 - int ovl_nlink_start(struct dentry *dentry, bool *locked) 742 + int ovl_nlink_start(struct dentry *dentry) 742 743 { 743 - struct ovl_inode *oi = OVL_I(d_inode(dentry)); 744 + struct inode *inode = d_inode(dentry); 744 745 const struct cred *old_cred; 745 746 int err; 746 747 747 - if (!d_inode(dentry)) 748 - return 0; 748 + if (WARN_ON(!inode)) 749 + return -ENOENT; 749 750 750 751 /* 751 752 * With inodes index is enabled, we store the union overlay nlink ··· 767 768 return err; 768 769 } 769 770 770 - err = mutex_lock_interruptible(&oi->lock); 771 + err = ovl_inode_lock(inode); 771 772 if (err) 772 773 return err; 773 774 774 - if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, d_inode(dentry))) 775 + if (d_is_dir(dentry) || !ovl_test_flag(OVL_INDEX, inode)) 775 776 goto out; 776 777 777 778 old_cred = ovl_override_creds(dentry->d_sb); ··· 786 787 787 788 out: 788 789 if (err) 789 - mutex_unlock(&oi->lock); 790 - else 791 - *locked = true; 790 + ovl_inode_unlock(inode); 792 791 793 792 return err; 794 793 } 795 794 796 - void ovl_nlink_end(struct dentry *dentry, bool locked) 795 + void ovl_nlink_end(struct dentry *dentry) 797 796 { 798 - if (locked) { 799 - if (ovl_test_flag(OVL_INDEX, d_inode(dentry)) && 800 - d_inode(dentry)->i_nlink == 0) { 801 - const struct cred *old_cred; 797 + struct inode *inode = d_inode(dentry); 802 798 803 - old_cred = ovl_override_creds(dentry->d_sb); 804 - ovl_cleanup_index(dentry); 805 - revert_creds(old_cred); 806 - } 799 + if (ovl_test_flag(OVL_INDEX, inode) && inode->i_nlink == 0) { 800 + const struct cred *old_cred; 807 801 808 - mutex_unlock(&OVL_I(d_inode(dentry))->lock); 802 + old_cred = ovl_override_creds(dentry->d_sb); 803 + ovl_cleanup_index(dentry); 804 + revert_creds(old_cred); 809 805 } 806 + 807 + ovl_inode_unlock(inode); 810 808 } 811 809 812 810 int ovl_lock_rename_workdir(struct dentry *workdir, struct dentry *upperdir)