diff options
Diffstat (limited to 'fs/overlayfs')
| -rw-r--r-- | fs/overlayfs/export.c | 3 | ||||
| -rw-r--r-- | fs/overlayfs/inode.c | 18 | 
2 files changed, 21 insertions, 0 deletions
| diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c index 475c61f53f0f..ed5c1078919c 100644 --- a/fs/overlayfs/export.c +++ b/fs/overlayfs/export.c @@ -783,6 +783,9 @@ static struct ovl_fh *ovl_fid_to_fh(struct fid *fid, int buflen, int fh_type)  	if (fh_type != OVL_FILEID_V0)  		return ERR_PTR(-EINVAL); +	if (buflen <= OVL_FH_WIRE_OFFSET) +		return ERR_PTR(-EINVAL); +  	fh = kzalloc(buflen, GFP_KERNEL);  	if (!fh)  		return ERR_PTR(-ENOMEM); diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index b0d42ece4d7c..981f11ec51bc 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -58,6 +58,24 @@ 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 real file object +		 * once use cases emerge.  For now, simply don't let underlying +		 * filesystem rely on attr->ia_file +		 */ +		attr->ia_valid &= ~ATTR_FILE; + +		/* +		 * If open(O_TRUNC) is done, VFS calls ->setattr with ATTR_OPEN +		 * set.  Overlayfs does not pass O_TRUNC flag to underlying +		 * filesystem during open -> do not pass ATTR_OPEN.  This +		 * disables optimization in fuse which assumes open(O_TRUNC) +		 * already set file size to 0.  But we never passed O_TRUNC to +		 * fuse.  So by clearing ATTR_OPEN, fuse will be forced to send +		 * setattr request to server. +		 */ +		attr->ia_valid &= ~ATTR_OPEN; +  		inode_lock(upperdentry->d_inode);  		old_cred = ovl_override_creds(dentry->d_sb);  		err = notify_change(upperdentry, attr, NULL); |