mirror of https://gitee.com/openkylin/linux.git
ocfs2: Avoid direct write if we fall back to buffered I/O
when we fall back to buffered write from direct write, we call __generic_file_aio_write() but that will end up doing direct write even we are only prepared to do buffered write because the file has the O_DIRECT flag set. This is a fix for https://bugzilla.novell.com/show_bug.cgi?id=591039 revised with Joel's comments. Signed-off-by: Li Dongyang <lidongyang@novell.com> Acked-by: Mark Fasheh <mfasheh@suse.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
parent
f9221fd803
commit
6b933c8e6f
|
@ -1982,18 +1982,18 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
|
|||
/* communicate with ocfs2_dio_end_io */
|
||||
ocfs2_iocb_set_rw_locked(iocb, rw_level);
|
||||
|
||||
ret = generic_segment_checks(iov, &nr_segs, &ocount,
|
||||
VERIFY_READ);
|
||||
if (ret)
|
||||
goto out_dio;
|
||||
|
||||
count = ocount;
|
||||
ret = generic_write_checks(file, ppos, &count,
|
||||
S_ISBLK(inode->i_mode));
|
||||
if (ret)
|
||||
goto out_dio;
|
||||
|
||||
if (direct_io) {
|
||||
ret = generic_segment_checks(iov, &nr_segs, &ocount,
|
||||
VERIFY_READ);
|
||||
if (ret)
|
||||
goto out_dio;
|
||||
|
||||
count = ocount;
|
||||
ret = generic_write_checks(file, ppos, &count,
|
||||
S_ISBLK(inode->i_mode));
|
||||
if (ret)
|
||||
goto out_dio;
|
||||
|
||||
written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos,
|
||||
ppos, count, ocount);
|
||||
if (written < 0) {
|
||||
|
@ -2008,7 +2008,10 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
|
|||
goto out_dio;
|
||||
}
|
||||
} else {
|
||||
written = __generic_file_aio_write(iocb, iov, nr_segs, ppos);
|
||||
current->backing_dev_info = file->f_mapping->backing_dev_info;
|
||||
written = generic_file_buffered_write(iocb, iov, nr_segs, *ppos,
|
||||
ppos, count, 0);
|
||||
current->backing_dev_info = NULL;
|
||||
}
|
||||
|
||||
out_dio:
|
||||
|
|
Loading…
Reference in New Issue