hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/overlayfs/dir.c
....@@ -266,8 +266,7 @@
266266
267267 ovl_dir_modified(dentry->d_parent, false);
268268 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);
271270
272271 if (!hardlink) {
273272 /*
....@@ -586,29 +585,43 @@
586585 goto out_revert_creds;
587586 }
588587
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
+ */
592606 override_cred->fsuid = inode->i_uid;
593607 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;
603615 }
604616 hold_cred = override_creds(override_cred);
605617 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);
611618 }
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
+
612625 out_revert_creds:
613626 ovl_revert_creds(dentry->d_sb, old_cred ?: hold_cred);
614627 if (old_cred && hold_cred)