diff options
Diffstat (limited to 'fs/open.c')
| -rw-r--r-- | fs/open.c | 31 | 
1 files changed, 21 insertions, 10 deletions
| diff --git a/fs/open.c b/fs/open.c index 1a9483872e1f..d11d373dca80 100644 --- a/fs/open.c +++ b/fs/open.c @@ -81,14 +81,18 @@ long vfs_truncate(const struct path *path, loff_t length)  	if (!S_ISREG(inode->i_mode))  		return -EINVAL; -	error = mnt_want_write(path->mnt); -	if (error) -		goto out; -  	idmap = mnt_idmap(path->mnt);  	error = inode_permission(idmap, inode, MAY_WRITE);  	if (error) -		goto mnt_drop_write_and_out; +		return error; + +	error = fsnotify_truncate_perm(path, length); +	if (error) +		return error; + +	error = mnt_want_write(path->mnt); +	if (error) +		return error;  	error = -EPERM;  	if (IS_APPEND(inode)) @@ -114,7 +118,7 @@ put_write_and_out:  	put_write_access(inode);  mnt_drop_write_and_out:  	mnt_drop_write(path->mnt); -out: +  	return error;  }  EXPORT_SYMBOL_GPL(vfs_truncate); @@ -175,11 +179,18 @@ long do_ftruncate(struct file *file, loff_t length, int small)  	/* Check IS_APPEND on real upper inode */  	if (IS_APPEND(file_inode(file)))  		return -EPERM; -	sb_start_write(inode->i_sb); +  	error = security_file_truncate(file); -	if (!error) -		error = do_truncate(file_mnt_idmap(file), dentry, length, -				    ATTR_MTIME | ATTR_CTIME, file); +	if (error) +		return error; + +	error = fsnotify_truncate_perm(&file->f_path, length); +	if (error) +		return error; + +	sb_start_write(inode->i_sb); +	error = do_truncate(file_mnt_idmap(file), dentry, length, +			    ATTR_MTIME | ATTR_CTIME, file);  	sb_end_write(inode->i_sb);  	return error; | 
