|
@@ -814,6 +814,10 @@ retry:
|
|
|
struct kstat stat = {
|
|
|
.mode = S_IFDIR | 0,
|
|
|
};
|
|
|
+ struct iattr attr = {
|
|
|
+ .ia_valid = ATTR_MODE,
|
|
|
+ .ia_mode = stat.mode,
|
|
|
+ };
|
|
|
|
|
|
if (work->d_inode) {
|
|
|
err = -EEXIST;
|
|
@@ -829,6 +833,21 @@ retry:
|
|
|
err = ovl_create_real(dir, work, &stat, NULL, NULL, true);
|
|
|
if (err)
|
|
|
goto out_dput;
|
|
|
+
|
|
|
+ err = vfs_removexattr(work, XATTR_NAME_POSIX_ACL_DEFAULT);
|
|
|
+ if (err && err != -ENODATA)
|
|
|
+ goto out_dput;
|
|
|
+
|
|
|
+ err = vfs_removexattr(work, XATTR_NAME_POSIX_ACL_ACCESS);
|
|
|
+ if (err && err != -ENODATA)
|
|
|
+ goto out_dput;
|
|
|
+
|
|
|
+ /* Clear any inherited mode bits */
|
|
|
+ inode_lock(work->d_inode);
|
|
|
+ err = notify_change(work, &attr, NULL);
|
|
|
+ inode_unlock(work->d_inode);
|
|
|
+ if (err)
|
|
|
+ goto out_dput;
|
|
|
}
|
|
|
out_unlock:
|
|
|
inode_unlock(dir);
|