diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/file.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index f92fe91ff260..bbac7cd33e0b 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -1891,9 +1891,11 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
1891 | ssize_t written = 0; | 1891 | ssize_t written = 0; |
1892 | size_t ocount; /* original count */ | 1892 | size_t ocount; /* original count */ |
1893 | size_t count; /* after file limit checks */ | 1893 | size_t count; /* after file limit checks */ |
1894 | loff_t *ppos = &iocb->ki_pos; | 1894 | loff_t old_size, *ppos = &iocb->ki_pos; |
1895 | u32 old_clusters; | ||
1895 | struct file *file = iocb->ki_filp; | 1896 | struct file *file = iocb->ki_filp; |
1896 | struct inode *inode = file->f_path.dentry->d_inode; | 1897 | struct inode *inode = file->f_path.dentry->d_inode; |
1898 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1897 | 1899 | ||
1898 | mlog_entry("(0x%p, %u, '%.*s')\n", file, | 1900 | mlog_entry("(0x%p, %u, '%.*s')\n", file, |
1899 | (unsigned int)nr_segs, | 1901 | (unsigned int)nr_segs, |
@@ -1949,6 +1951,13 @@ relock: | |||
1949 | goto relock; | 1951 | goto relock; |
1950 | } | 1952 | } |
1951 | 1953 | ||
1954 | /* | ||
1955 | * To later detect whether a journal commit for sync writes is | ||
1956 | * necessary, we sample i_size, and cluster count here. | ||
1957 | */ | ||
1958 | old_size = i_size_read(inode); | ||
1959 | old_clusters = OCFS2_I(inode)->ip_clusters; | ||
1960 | |||
1952 | /* communicate with ocfs2_dio_end_io */ | 1961 | /* communicate with ocfs2_dio_end_io */ |
1953 | ocfs2_iocb_set_rw_locked(iocb, rw_level); | 1962 | ocfs2_iocb_set_rw_locked(iocb, rw_level); |
1954 | 1963 | ||
@@ -1978,6 +1987,21 @@ out_dio: | |||
1978 | /* buffered aio wouldn't have proper lock coverage today */ | 1987 | /* buffered aio wouldn't have proper lock coverage today */ |
1979 | BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT)); | 1988 | BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT)); |
1980 | 1989 | ||
1990 | if ((file->f_flags & O_SYNC && !direct_io) || IS_SYNC(inode)) { | ||
1991 | /* | ||
1992 | * The generic write paths have handled getting data | ||
1993 | * to disk, but since we don't make use of the dirty | ||
1994 | * inode list, a manual journal commit is necessary | ||
1995 | * here. | ||
1996 | */ | ||
1997 | if (old_size != i_size_read(inode) || | ||
1998 | old_clusters != OCFS2_I(inode)->ip_clusters) { | ||
1999 | ret = journal_force_commit(osb->journal->j_journal); | ||
2000 | if (ret < 0) | ||
2001 | written = ret; | ||
2002 | } | ||
2003 | } | ||
2004 | |||
1981 | /* | 2005 | /* |
1982 | * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io | 2006 | * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io |
1983 | * function pointer which is called when o_direct io completes so that | 2007 | * function pointer which is called when o_direct io completes so that |