[SRU][UNSTABLE][PATCH 1/2] UBUNTU: SAUCE: Revert "UBUNTU: SAUCE: shiftfs: fix dentry revalidation"
Christian Brauner
christian.brauner at ubuntu.com
Wed Jun 24 10:16:19 UTC 2020
On Wed, Jun 24, 2020 at 12:14:38PM +0200, Christian Brauner wrote:
> BugLink: https://bugs.launchpad.net/bugs/1884767
>
> With patch cfaa482afb97 ("UBUNTU: SAUCE: shiftfs: fix dentry revalidation")
> we tried to fix
> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1872757 but it
> introduces a regression for shiftfs on btrfs users. Creating a btrfs
> subvolume, deleting it, and then trying to recreate it will cause EEXIST
> to be returned or the file be left in a half-created state. Faulty
> behavior such as this can be reproduced via:
>
> btrfs subvolume create my-subvol
> ls -al my-subvol
> btrfs subvolume delete my-subvol
>
> We thus need to revert this change restoring the old behavior.This will
> briefly resurface https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1872757
> which is fixed in a follow-up patch on top of this revert. We simply
> split out the minimal fix into a separate tiny patch.
>
> This reverts commit de1ac7ed38fd68183fc34d58aaf9f0609890caae.
>
> Cc: Seth Forshee <seth.forshee at canonical.com>
> Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
> ---
Seth,
Just for your interest: Disco does not have the problematic patch
afaict. So with Eoan, Focal, and Unstable we should be good!
(All patches should be on top of the latest tag I could find.)
Thanks!
Christian
> fs/shiftfs.c | 45 ++++++++++++++++++++++++++++++++-------------
> 1 file changed, 32 insertions(+), 13 deletions(-)
>
> diff --git a/fs/shiftfs.c b/fs/shiftfs.c
> index 36ac45a6d835..f9a5c94a9793 100644
> --- a/fs/shiftfs.c
> +++ b/fs/shiftfs.c
> @@ -241,17 +241,19 @@ static int shiftfs_d_weak_revalidate(struct dentry *dentry, unsigned int flags)
> int err = 1;
> struct dentry *lowerd = dentry->d_fsdata;
>
> - if (lowerd->d_flags & DCACHE_OP_WEAK_REVALIDATE) {
> + if (d_is_negative(lowerd) != d_is_negative(dentry))
> + return 0;
> +
> + if ((lowerd->d_flags & DCACHE_OP_WEAK_REVALIDATE))
> err = lowerd->d_op->d_weak_revalidate(lowerd, flags);
> - if (err < 0)
> - return err;
> - }
>
> if (d_really_is_positive(dentry)) {
> struct inode *inode = d_inode(dentry);
> struct inode *loweri = d_inode(lowerd);
>
> shiftfs_copyattr(loweri, inode);
> + if (!inode->i_nlink)
> + err = 0;
> }
>
> return err;
> @@ -262,25 +264,23 @@ static int shiftfs_d_revalidate(struct dentry *dentry, unsigned int flags)
> int err = 1;
> struct dentry *lowerd = dentry->d_fsdata;
>
> + if (d_unhashed(lowerd) ||
> + ((d_is_negative(lowerd) != d_is_negative(dentry))))
> + return 0;
> +
> if (flags & LOOKUP_RCU)
> return -ECHILD;
>
> - if (lowerd->d_flags & DCACHE_OP_REVALIDATE) {
> + if ((lowerd->d_flags & DCACHE_OP_REVALIDATE))
> err = lowerd->d_op->d_revalidate(lowerd, flags);
> - if (err < 0)
> - return err;
> - if (!err) {
> - if (!(flags & LOOKUP_RCU))
> - d_invalidate(lowerd);
> - return -ESTALE;
> - }
> - }
>
> if (d_really_is_positive(dentry)) {
> struct inode *inode = d_inode(dentry);
> struct inode *loweri = d_inode(lowerd);
>
> shiftfs_copyattr(loweri, inode);
> + if (!inode->i_nlink)
> + err = 0;
> }
>
> return err;
> @@ -737,6 +737,24 @@ static int shiftfs_fiemap(struct inode *inode,
> return err;
> }
>
> +static int shiftfs_tmpfile(struct inode *dir, struct dentry *dentry,
> + umode_t mode)
> +{
> + int err;
> + const struct cred *oldcred;
> + struct dentry *lowerd = dentry->d_fsdata;
> + struct inode *loweri = dir->i_private;
> +
> + if (!loweri->i_op->tmpfile)
> + return -EOPNOTSUPP;
> +
> + oldcred = shiftfs_override_creds(dir->i_sb);
> + err = loweri->i_op->tmpfile(loweri, lowerd, mode);
> + revert_creds(oldcred);
> +
> + return err;
> +}
> +
> static int shiftfs_setattr(struct dentry *dentry, struct iattr *attr)
> {
> struct dentry *lowerd = dentry->d_fsdata;
> @@ -1003,6 +1021,7 @@ static const struct inode_operations shiftfs_file_inode_operations = {
> .listxattr = shiftfs_listxattr,
> .permission = shiftfs_permission,
> .setattr = shiftfs_setattr,
> + .tmpfile = shiftfs_tmpfile,
> };
>
> static const struct inode_operations shiftfs_special_inode_operations = {
>
> base-commit: eed567f60e03230138081b3ae955cbded06c32e9
> --
> 2.27.0
>
More information about the kernel-team
mailing list