ovl: clear ATTR_FILE from attr->ia_valid
authorVivek Goyal <vgoyal@redhat.com>
Wed, 22 Apr 2020 13:08:49 +0000 (09:08 -0400)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 30 Apr 2020 09:52:07 +0000 (11:52 +0200)
ovl_setattr() can be passed an attr which has ATTR_FILE set and
attr->ia_file is a file pointer to overlay file. This is done in
open(O_TRUNC) path.

We should either replace with attr->ia_file with underlying file object or
clear ATTR_FILE so that underlying filesystem does not end up using
overlayfs file object pointer.

There are no good use cases yet so for now clear ATTR_FILE. fuse seems to
be one user which can use this. But it can work even without this.  So it
is not mandatory to pass ATTR_FILE to fuse.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Fixes: bccece1ead36 ("ovl: allow remote upper")
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/inode.c

index b0d42ec..34bfe0f 100644 (file)
@@ -58,6 +58,13 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
                if (attr->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
                        attr->ia_valid &= ~ATTR_MODE;
 
+               /*
+                * We might have to translate ovl file into underlying file
+                * object once some use cases are there. For now, simply don't
+                * let underlying filesystem rely on attr->ia_file
+                */
+               attr->ia_valid &= ~ATTR_FILE;
+
                inode_lock(upperdentry->d_inode);
                old_cred = ovl_override_creds(dentry->d_sb);
                err = notify_change(upperdentry, attr, NULL);