|
@@ -1871,8 +1871,7 @@ relock:
|
|
|
goto out_dio;
|
|
|
}
|
|
|
} else {
|
|
|
- written = generic_file_aio_write_nolock(iocb, iov, nr_segs,
|
|
|
- *ppos);
|
|
|
+ written = __generic_file_aio_write(iocb, iov, nr_segs, ppos);
|
|
|
}
|
|
|
|
|
|
out_dio:
|
|
@@ -1880,18 +1879,21 @@ out_dio:
|
|
|
BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT));
|
|
|
|
|
|
if ((file->f_flags & O_SYNC && !direct_io) || IS_SYNC(inode)) {
|
|
|
- /*
|
|
|
- * The generic write paths have handled getting data
|
|
|
- * to disk, but since we don't make use of the dirty
|
|
|
- * inode list, a manual journal commit is necessary
|
|
|
- * here.
|
|
|
- */
|
|
|
- if (old_size != i_size_read(inode) ||
|
|
|
- old_clusters != OCFS2_I(inode)->ip_clusters) {
|
|
|
+ ret = filemap_fdatawrite_range(file->f_mapping, pos,
|
|
|
+ pos + count - 1);
|
|
|
+ if (ret < 0)
|
|
|
+ written = ret;
|
|
|
+
|
|
|
+ if (!ret && (old_size != i_size_read(inode) ||
|
|
|
+ old_clusters != OCFS2_I(inode)->ip_clusters)) {
|
|
|
ret = jbd2_journal_force_commit(osb->journal->j_journal);
|
|
|
if (ret < 0)
|
|
|
written = ret;
|
|
|
}
|
|
|
+
|
|
|
+ if (!ret)
|
|
|
+ ret = filemap_fdatawait_range(file->f_mapping, pos,
|
|
|
+ pos + count - 1);
|
|
|
}
|
|
|
|
|
|
/*
|