.. | .. |
---|
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) |
---|