| .. | .. |
|---|
| 266 | 266 | |
|---|
| 267 | 267 | ovl_dir_modified(dentry->d_parent, false); |
|---|
| 268 | 268 | ovl_dentry_set_upper_alias(dentry); |
|---|
| 269 | | - ovl_dentry_update_reval(dentry, newdentry, |
|---|
| 270 | | - DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE); |
|---|
| 269 | + ovl_dentry_init_reval(dentry, newdentry); |
|---|
| 271 | 270 | |
|---|
| 272 | 271 | if (!hardlink) { |
|---|
| 273 | 272 | /* |
|---|
| .. | .. |
|---|
| 586 | 585 | goto out_revert_creds; |
|---|
| 587 | 586 | } |
|---|
| 588 | 587 | |
|---|
| 589 | | - err = -ENOMEM; |
|---|
| 590 | | - override_cred = prepare_creds(); |
|---|
| 591 | | - if (override_cred) { |
|---|
| 588 | + if (!attr->hardlink) { |
|---|
| 589 | + err = -ENOMEM; |
|---|
| 590 | + override_cred = prepare_creds(); |
|---|
| 591 | + if (!override_cred) |
|---|
| 592 | + goto out_revert_creds; |
|---|
| 593 | + /* |
|---|
| 594 | + * In the creation cases(create, mkdir, mknod, symlink), |
|---|
| 595 | + * ovl should transfer current's fs{u,g}id to underlying |
|---|
| 596 | + * fs. Because underlying fs want to initialize its new |
|---|
| 597 | + * inode owner using current's fs{u,g}id. And in this |
|---|
| 598 | + * case, the @inode is a new inode that is initialized |
|---|
| 599 | + * in inode_init_owner() to current's fs{u,g}id. So use |
|---|
| 600 | + * the inode's i_{u,g}id to override the cred's fs{u,g}id. |
|---|
| 601 | + * |
|---|
| 602 | + * But in the other hardlink case, ovl_link() does not |
|---|
| 603 | + * create a new inode, so just use the ovl mounter's |
|---|
| 604 | + * fs{u,g}id. |
|---|
| 605 | + */ |
|---|
| 592 | 606 | override_cred->fsuid = inode->i_uid; |
|---|
| 593 | 607 | override_cred->fsgid = inode->i_gid; |
|---|
| 594 | | - if (!attr->hardlink) { |
|---|
| 595 | | - err = security_dentry_create_files_as(dentry, |
|---|
| 596 | | - attr->mode, &dentry->d_name, |
|---|
| 597 | | - old_cred ? old_cred : current_cred(), |
|---|
| 598 | | - override_cred); |
|---|
| 599 | | - if (err) { |
|---|
| 600 | | - put_cred(override_cred); |
|---|
| 601 | | - goto out_revert_creds; |
|---|
| 602 | | - } |
|---|
| 608 | + err = security_dentry_create_files_as(dentry, |
|---|
| 609 | + attr->mode, &dentry->d_name, |
|---|
| 610 | + old_cred ? old_cred : current_cred(), |
|---|
| 611 | + override_cred); |
|---|
| 612 | + if (err) { |
|---|
| 613 | + put_cred(override_cred); |
|---|
| 614 | + goto out_revert_creds; |
|---|
| 603 | 615 | } |
|---|
| 604 | 616 | hold_cred = override_creds(override_cred); |
|---|
| 605 | 617 | put_cred(override_cred); |
|---|
| 606 | | - |
|---|
| 607 | | - if (!ovl_dentry_is_whiteout(dentry)) |
|---|
| 608 | | - err = ovl_create_upper(dentry, inode, attr); |
|---|
| 609 | | - else |
|---|
| 610 | | - err = ovl_create_over_whiteout(dentry, inode, attr); |
|---|
| 611 | 618 | } |
|---|
| 619 | + |
|---|
| 620 | + if (!ovl_dentry_is_whiteout(dentry)) |
|---|
| 621 | + err = ovl_create_upper(dentry, inode, attr); |
|---|
| 622 | + else |
|---|
| 623 | + err = ovl_create_over_whiteout(dentry, inode, attr); |
|---|
| 624 | + |
|---|
| 612 | 625 | out_revert_creds: |
|---|
| 613 | 626 | ovl_revert_creds(dentry->d_sb, old_cred ?: hold_cred); |
|---|
| 614 | 627 | if (old_cred && hold_cred) |
|---|