OSDN Git Service

Merge branch 'for-5.18/apple' into for-linus
[uclinux-h8/linux.git] / fs / overlayfs / copy_up.c
index 4e7d5bf..e040970 100644 (file)
@@ -140,12 +140,14 @@ static int ovl_copy_fileattr(struct inode *inode, struct path *old,
        int err;
 
        err = ovl_real_fileattr_get(old, &oldfa);
-       if (err)
-               return err;
-
-       err = ovl_real_fileattr_get(new, &newfa);
-       if (err)
+       if (err) {
+               /* Ntfs-3g returns -EINVAL for "no fileattr support" */
+               if (err == -ENOTTY || err == -EINVAL)
+                       return 0;
+               pr_warn("failed to retrieve lower fileattr (%pd2, err=%i)\n",
+                       old->dentry, err);
                return err;
+       }
 
        /*
         * We cannot set immutable and append-only flags on upper inode,
@@ -155,10 +157,31 @@ static int ovl_copy_fileattr(struct inode *inode, struct path *old,
         */
        if (oldfa.flags & OVL_PROT_FS_FLAGS_MASK) {
                err = ovl_set_protattr(inode, new->dentry, &oldfa);
-               if (err)
+               if (err == -EPERM)
+                       pr_warn_once("copying fileattr: no xattr on upper\n");
+               else if (err)
                        return err;
        }
 
+       /* Don't bother copying flags if none are set */
+       if (!(oldfa.flags & OVL_COPY_FS_FLAGS_MASK))
+               return 0;
+
+       err = ovl_real_fileattr_get(new, &newfa);
+       if (err) {
+               /*
+                * Returning an error if upper doesn't support fileattr will
+                * result in a regression, so revert to the old behavior.
+                */
+               if (err == -ENOTTY || err == -EINVAL) {
+                       pr_warn_once("copying fileattr: no support on upper\n");
+                       return 0;
+               }
+               pr_warn("failed to retrieve upper fileattr (%pd2, err=%i)\n",
+                       new->dentry, err);
+               return err;
+       }
+
        BUILD_BUG_ON(OVL_COPY_FS_FLAGS_MASK & ~FS_COMMON_FL);
        newfa.flags &= ~OVL_COPY_FS_FLAGS_MASK;
        newfa.flags |= (oldfa.flags & OVL_COPY_FS_FLAGS_MASK);