Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b933c8e authored by Li Dongyang's avatar Li Dongyang Committed by Joel Becker
Browse files

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: default avatarLi Dongyang <lidongyang@novell.com>
Acked-by: default avatarMark Fasheh <mfasheh@suse.com>
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
parent f9221fd8
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -1982,7 +1982,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
	/* communicate with ocfs2_dio_end_io */
	ocfs2_iocb_set_rw_locked(iocb, rw_level);

	if (direct_io) {
	ret = generic_segment_checks(iov, &nr_segs, &ocount,
				     VERIFY_READ);
	if (ret)
@@ -1994,6 +1993,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
	if (ret)
		goto out_dio;

	if (direct_io) {
		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: