diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2010-02-22 07:48:51 -0500 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2010-02-22 07:48:51 -0500 |
commit | f11cbd74c5ff3614f6390b4de67a6ffdc614c378 (patch) | |
tree | 6a30920ade9eeaac5bf6d6263b5d09712e882eb0 /fs/ocfs2/file.c | |
parent | 429c42c9d246f5bda868495c09974312a0177328 (diff) | |
parent | aea187c46f7d03ce985e55eb1398d0776a15b928 (diff) |
Merge branch 'master' into for-2.6.34
Diffstat (limited to 'fs/ocfs2/file.c')
-rw-r--r-- | fs/ocfs2/file.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 3d30a1c974a8..558ce0312421 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -749,7 +749,7 @@ static int ocfs2_write_zero_page(struct inode *inode, | |||
749 | int ret; | 749 | int ret; |
750 | 750 | ||
751 | offset = (size & (PAGE_CACHE_SIZE-1)); /* Within page */ | 751 | offset = (size & (PAGE_CACHE_SIZE-1)); /* Within page */ |
752 | /* ugh. in prepare/commit_write, if from==to==start of block, we | 752 | /* ugh. in prepare/commit_write, if from==to==start of block, we |
753 | ** skip the prepare. make sure we never send an offset for the start | 753 | ** skip the prepare. make sure we never send an offset for the start |
754 | ** of a block | 754 | ** of a block |
755 | */ | 755 | */ |
@@ -1772,13 +1772,14 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
1772 | loff_t *ppos, | 1772 | loff_t *ppos, |
1773 | size_t count, | 1773 | size_t count, |
1774 | int appending, | 1774 | int appending, |
1775 | int *direct_io) | 1775 | int *direct_io, |
1776 | int *has_refcount) | ||
1776 | { | 1777 | { |
1777 | int ret = 0, meta_level = 0; | 1778 | int ret = 0, meta_level = 0; |
1778 | struct inode *inode = dentry->d_inode; | 1779 | struct inode *inode = dentry->d_inode; |
1779 | loff_t saved_pos, end; | 1780 | loff_t saved_pos, end; |
1780 | 1781 | ||
1781 | /* | 1782 | /* |
1782 | * We start with a read level meta lock and only jump to an ex | 1783 | * We start with a read level meta lock and only jump to an ex |
1783 | * if we need to make modifications here. | 1784 | * if we need to make modifications here. |
1784 | */ | 1785 | */ |
@@ -1833,6 +1834,8 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
1833 | saved_pos, | 1834 | saved_pos, |
1834 | count, | 1835 | count, |
1835 | &meta_level); | 1836 | &meta_level); |
1837 | if (has_refcount) | ||
1838 | *has_refcount = 1; | ||
1836 | } | 1839 | } |
1837 | 1840 | ||
1838 | if (ret < 0) { | 1841 | if (ret < 0) { |
@@ -1856,6 +1859,10 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry, | |||
1856 | break; | 1859 | break; |
1857 | } | 1860 | } |
1858 | 1861 | ||
1862 | if (has_refcount && *has_refcount == 1) { | ||
1863 | *direct_io = 0; | ||
1864 | break; | ||
1865 | } | ||
1859 | /* | 1866 | /* |
1860 | * Allowing concurrent direct writes means | 1867 | * Allowing concurrent direct writes means |
1861 | * i_size changes wouldn't be synchronized, so | 1868 | * i_size changes wouldn't be synchronized, so |
@@ -1899,7 +1906,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, | |||
1899 | loff_t pos) | 1906 | loff_t pos) |
1900 | { | 1907 | { |
1901 | int ret, direct_io, appending, rw_level, have_alloc_sem = 0; | 1908 | int ret, direct_io, appending, rw_level, have_alloc_sem = 0; |
1902 | int can_do_direct; | 1909 | int can_do_direct, has_refcount = 0; |
1903 | ssize_t written = 0; | 1910 | ssize_t written = 0; |
1904 | size_t ocount; /* original count */ | 1911 | size_t ocount; /* original count */ |
1905 | size_t count; /* after file limit checks */ | 1912 | size_t count; /* after file limit checks */ |
@@ -1942,7 +1949,7 @@ relock: | |||
1942 | can_do_direct = direct_io; | 1949 | can_do_direct = direct_io; |
1943 | ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos, | 1950 | ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos, |
1944 | iocb->ki_left, appending, | 1951 | iocb->ki_left, appending, |
1945 | &can_do_direct); | 1952 | &can_do_direct, &has_refcount); |
1946 | if (ret < 0) { | 1953 | if (ret < 0) { |
1947 | mlog_errno(ret); | 1954 | mlog_errno(ret); |
1948 | goto out; | 1955 | goto out; |
@@ -2006,14 +2013,16 @@ out_dio: | |||
2006 | /* buffered aio wouldn't have proper lock coverage today */ | 2013 | /* buffered aio wouldn't have proper lock coverage today */ |
2007 | BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT)); | 2014 | BUG_ON(ret == -EIOCBQUEUED && !(file->f_flags & O_DIRECT)); |
2008 | 2015 | ||
2009 | if ((file->f_flags & O_DSYNC && !direct_io) || IS_SYNC(inode)) { | 2016 | if (((file->f_flags & O_DSYNC) && !direct_io) || IS_SYNC(inode) || |
2017 | ((file->f_flags & O_DIRECT) && has_refcount)) { | ||
2010 | ret = filemap_fdatawrite_range(file->f_mapping, pos, | 2018 | ret = filemap_fdatawrite_range(file->f_mapping, pos, |
2011 | pos + count - 1); | 2019 | pos + count - 1); |
2012 | if (ret < 0) | 2020 | if (ret < 0) |
2013 | written = ret; | 2021 | written = ret; |
2014 | 2022 | ||
2015 | if (!ret && (old_size != i_size_read(inode) || | 2023 | if (!ret && (old_size != i_size_read(inode) || |
2016 | old_clusters != OCFS2_I(inode)->ip_clusters)) { | 2024 | old_clusters != OCFS2_I(inode)->ip_clusters || |
2025 | has_refcount)) { | ||
2017 | ret = jbd2_journal_force_commit(osb->journal->j_journal); | 2026 | ret = jbd2_journal_force_commit(osb->journal->j_journal); |
2018 | if (ret < 0) | 2027 | if (ret < 0) |
2019 | written = ret; | 2028 | written = ret; |
@@ -2024,7 +2033,7 @@ out_dio: | |||
2024 | pos + count - 1); | 2033 | pos + count - 1); |
2025 | } | 2034 | } |
2026 | 2035 | ||
2027 | /* | 2036 | /* |
2028 | * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io | 2037 | * deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io |
2029 | * function pointer which is called when o_direct io completes so that | 2038 | * function pointer which is called when o_direct io completes so that |
2030 | * it can unlock our rw lock. (it's the clustered equivalent of | 2039 | * it can unlock our rw lock. (it's the clustered equivalent of |
@@ -2062,7 +2071,7 @@ static int ocfs2_splice_to_file(struct pipe_inode_info *pipe, | |||
2062 | int ret; | 2071 | int ret; |
2063 | 2072 | ||
2064 | ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, &sd->pos, | 2073 | ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, &sd->pos, |
2065 | sd->total_len, 0, NULL); | 2074 | sd->total_len, 0, NULL, NULL); |
2066 | if (ret < 0) { | 2075 | if (ret < 0) { |
2067 | mlog_errno(ret); | 2076 | mlog_errno(ret); |
2068 | return ret; | 2077 | return ret; |
@@ -2189,7 +2198,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
2189 | goto bail; | 2198 | goto bail; |
2190 | } | 2199 | } |
2191 | 2200 | ||
2192 | /* | 2201 | /* |
2193 | * buffered reads protect themselves in ->readpage(). O_DIRECT reads | 2202 | * buffered reads protect themselves in ->readpage(). O_DIRECT reads |
2194 | * need locks to protect pending reads from racing with truncate. | 2203 | * need locks to protect pending reads from racing with truncate. |
2195 | */ | 2204 | */ |
@@ -2211,10 +2220,10 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
2211 | * We're fine letting folks race truncates and extending | 2220 | * We're fine letting folks race truncates and extending |
2212 | * writes with read across the cluster, just like they can | 2221 | * writes with read across the cluster, just like they can |
2213 | * locally. Hence no rw_lock during read. | 2222 | * locally. Hence no rw_lock during read. |
2214 | * | 2223 | * |
2215 | * Take and drop the meta data lock to update inode fields | 2224 | * Take and drop the meta data lock to update inode fields |
2216 | * like i_size. This allows the checks down below | 2225 | * like i_size. This allows the checks down below |
2217 | * generic_file_aio_read() a chance of actually working. | 2226 | * generic_file_aio_read() a chance of actually working. |
2218 | */ | 2227 | */ |
2219 | ret = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); | 2228 | ret = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); |
2220 | if (ret < 0) { | 2229 | if (ret < 0) { |
@@ -2239,7 +2248,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, | |||
2239 | bail: | 2248 | bail: |
2240 | if (have_alloc_sem) | 2249 | if (have_alloc_sem) |
2241 | up_read(&inode->i_alloc_sem); | 2250 | up_read(&inode->i_alloc_sem); |
2242 | if (rw_level != -1) | 2251 | if (rw_level != -1) |
2243 | ocfs2_rw_unlock(inode, rw_level); | 2252 | ocfs2_rw_unlock(inode, rw_level); |
2244 | mlog_exit(ret); | 2253 | mlog_exit(ret); |
2245 | 2254 | ||