|
@@ -1891,9 +1891,11 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
|
|
ssize_t written = 0;
|
|
ssize_t written = 0;
|
|
size_t ocount; /* original count */
|
|
size_t ocount; /* original count */
|
|
size_t count; /* after file limit checks */
|
|
size_t count; /* after file limit checks */
|
|
- loff_t *ppos = &iocb->ki_pos;
|
|
|
|
|
|
+ loff_t old_size, *ppos = &iocb->ki_pos;
|
|
|
|
+ u32 old_clusters;
|
|
struct file *file = iocb->ki_filp;
|
|
struct file *file = iocb->ki_filp;
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
|
|
+ struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
|
|
|
|
|
|
mlog_entry("(0x%p, %u, '%.*s')\n", file,
|
|
mlog_entry("(0x%p, %u, '%.*s')\n", file,
|
|
(unsigned int)nr_segs,
|
|
(unsigned int)nr_segs,
|
|
@@ -1949,6 +1951,13 @@ relock:
|
|
goto relock;
|
|
goto relock;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * To later detect whether a journal commit for sync writes is
|
|
|
|
+ * necessary, we sample i_size, and cluster count here.
|
|
|
|
+ */
|
|
|
|
+ old_size = i_size_read(inode);
|
|
|
|
+ old_clusters = OCFS2_I(inode)->ip_clusters;
|
|
|
|
+
|
|
/* communicate with ocfs2_dio_end_io */
|
|
/* communicate with ocfs2_dio_end_io */
|
|
ocfs2_iocb_set_rw_locked(iocb, rw_level);
|
|
ocfs2_iocb_set_rw_locked(iocb, rw_level);
|
|
|
|
|
|
@@ -1978,6 +1987,21 @@ out_dio:
|
|
/* buffered aio wouldn't have proper lock coverage today */
|
|
/* buffered aio wouldn't have proper lock coverage today */
|
|
BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT));
|
|
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 = journal_force_commit(osb->journal->j_journal);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ written = ret;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io
|
|
* deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io
|
|
* function pointer which is called when o_direct io completes so that
|
|
* function pointer which is called when o_direct io completes so that
|