diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 25 | 
1 files changed, 18 insertions, 7 deletions
| diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 9e75d8a39aac..aafcc785f840 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1536,7 +1536,7 @@ static noinline int check_can_nocow(struct btrfs_inode *inode, loff_t pos,  	u64 num_bytes;  	int ret; -	ret = btrfs_start_write_no_snapshoting(root); +	ret = btrfs_start_write_no_snapshotting(root);  	if (!ret)  		return -ENOSPC; @@ -1561,7 +1561,7 @@ static noinline int check_can_nocow(struct btrfs_inode *inode, loff_t pos,  			NULL, NULL, NULL);  	if (ret <= 0) {  		ret = 0; -		btrfs_end_write_no_snapshoting(root); +		btrfs_end_write_no_snapshotting(root);  	} else {  		*write_bytes = min_t(size_t, *write_bytes ,  				     num_bytes - pos + lockstart); @@ -1664,7 +1664,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,  						data_reserved, pos,  						write_bytes);  			else -				btrfs_end_write_no_snapshoting(root); +				btrfs_end_write_no_snapshotting(root);  			break;  		} @@ -1767,7 +1767,7 @@ again:  		release_bytes = 0;  		if (only_release_metadata) -			btrfs_end_write_no_snapshoting(root); +			btrfs_end_write_no_snapshotting(root);  		if (only_release_metadata && copied > 0) {  			lockstart = round_down(pos, @@ -1797,7 +1797,7 @@ again:  	if (release_bytes) {  		if (only_release_metadata) { -			btrfs_end_write_no_snapshoting(root); +			btrfs_end_write_no_snapshotting(root);  			btrfs_delalloc_release_metadata(BTRFS_I(inode),  					release_bytes);  		} else { @@ -1886,6 +1886,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,  	loff_t oldsize;  	int clean_page = 0; +	if (!(iocb->ki_flags & IOCB_DIRECT) && +	    (iocb->ki_flags & IOCB_NOWAIT)) +		return -EOPNOTSUPP; +  	if (!inode_trylock(inode)) {  		if (iocb->ki_flags & IOCB_NOWAIT)  			return -EAGAIN; @@ -1990,8 +1994,15 @@ out:  int btrfs_release_file(struct inode *inode, struct file *filp)  { -	if (filp->private_data) +	struct btrfs_file_private *private = filp->private_data; + +	if (private && private->trans)  		btrfs_ioctl_trans_end(filp); +	if (private && private->filldir_buf) +		kfree(private->filldir_buf); +	kfree(private); +	filp->private_data = NULL; +  	/*  	 * ordered_data_close is set by settattr when we are about to truncate  	 * a file from a non-zero size to a zero size.  This tries to @@ -3105,7 +3116,7 @@ out:  static int btrfs_file_open(struct inode *inode, struct file *filp)  { -	filp->f_mode |= FMODE_AIO_NOWAIT; +	filp->f_mode |= FMODE_NOWAIT;  	return generic_file_open(inode, filp);  } |