diff options
Diffstat (limited to 'fs/ocfs2/file.c')
| -rw-r--r-- | fs/ocfs2/file.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 061591a3ab08..46a1f6d75104 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -1950,7 +1950,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode,  	if (ret < 0)  		mlog_errno(ret); -	if (file->f_flags & O_SYNC) +	if (file && (file->f_flags & O_SYNC))  		handle->h_sync = 1;  	ocfs2_commit_trans(osb, handle); @@ -1971,6 +1971,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,  {  	struct inode *inode = file->f_path.dentry->d_inode;  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); +	int ret;  	if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) &&  	    !ocfs2_writes_unwritten_extents(osb)) @@ -1985,7 +1986,12 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,  	if (!(file->f_mode & FMODE_WRITE))  		return -EBADF; -	return __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0); +	ret = mnt_want_write_file(file); +	if (ret) +		return ret; +	ret = __ocfs2_change_file_space(file, inode, file->f_pos, cmd, sr, 0); +	mnt_drop_write_file(file); +	return ret;  }  static long ocfs2_fallocate(struct file *file, int mode, loff_t offset, @@ -2261,7 +2267,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,  	if (iocb->ki_left == 0)  		return 0; -	vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); +	sb_start_write(inode->i_sb);  	appending = file->f_flags & O_APPEND ? 1 : 0;  	direct_io = file->f_flags & O_DIRECT ? 1 : 0; @@ -2422,8 +2428,10 @@ out_dio:  		unaligned_dio = 0;  	} -	if (unaligned_dio) +	if (unaligned_dio) { +		ocfs2_iocb_clear_unaligned_aio(iocb);  		atomic_dec(&OCFS2_I(inode)->ip_unaligned_aio); +	}  out:  	if (rw_level != -1) @@ -2434,6 +2442,7 @@ out_sems:  		ocfs2_iocb_clear_sem_locked(iocb);  	mutex_unlock(&inode->i_mutex); +	sb_end_write(inode->i_sb);  	if (written)  		ret = written;  | 
