diff options
Diffstat (limited to 'fs/ocfs2/file.c')
-rw-r--r-- | fs/ocfs2/file.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index ff33c5ef87f2..8970dcf74de5 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -2367,15 +2367,18 @@ relock: | |||
2367 | 2367 | ||
2368 | if (direct_io) { | 2368 | if (direct_io) { |
2369 | written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos, | 2369 | written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos, |
2370 | ppos, count, ocount); | 2370 | count, ocount); |
2371 | if (written < 0) { | 2371 | if (written < 0) { |
2372 | ret = written; | 2372 | ret = written; |
2373 | goto out_dio; | 2373 | goto out_dio; |
2374 | } | 2374 | } |
2375 | } else { | 2375 | } else { |
2376 | struct iov_iter from; | ||
2377 | iov_iter_init(&from, iov, nr_segs, count, 0); | ||
2376 | current->backing_dev_info = file->f_mapping->backing_dev_info; | 2378 | current->backing_dev_info = file->f_mapping->backing_dev_info; |
2377 | written = generic_file_buffered_write(iocb, iov, nr_segs, *ppos, | 2379 | written = generic_perform_write(file, &from, *ppos); |
2378 | ppos, count, 0); | 2380 | if (likely(written >= 0)) |
2381 | iocb->ki_pos = *ppos + written; | ||
2379 | current->backing_dev_info = NULL; | 2382 | current->backing_dev_info = NULL; |
2380 | } | 2383 | } |
2381 | 2384 | ||