diff options
Diffstat (limited to 'fs/ocfs2/aops.c')
-rw-r--r-- | fs/ocfs2/aops.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 17964c0505a9..1db080135c6d 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -174,10 +174,17 @@ static int ocfs2_get_block(struct inode *inode, sector_t iblock, | |||
174 | * need to use BH_New is when we're extending i_size on a file | 174 | * need to use BH_New is when we're extending i_size on a file |
175 | * system which doesn't support holes, in which case BH_New | 175 | * system which doesn't support holes, in which case BH_New |
176 | * allows block_prepare_write() to zero. | 176 | * allows block_prepare_write() to zero. |
177 | * | ||
178 | * If we see this on a sparse file system, then a truncate has | ||
179 | * raced us and removed the cluster. In this case, we clear | ||
180 | * the buffers dirty and uptodate bits and let the buffer code | ||
181 | * ignore it as a hole. | ||
177 | */ | 182 | */ |
178 | mlog_bug_on_msg(create && p_blkno == 0 && ocfs2_sparse_alloc(osb), | 183 | if (create && p_blkno == 0 && ocfs2_sparse_alloc(osb)) { |
179 | "ino %lu, iblock %llu\n", inode->i_ino, | 184 | clear_buffer_dirty(bh_result); |
180 | (unsigned long long)iblock); | 185 | clear_buffer_uptodate(bh_result); |
186 | goto bail; | ||
187 | } | ||
181 | 188 | ||
182 | /* Treat the unwritten extent as a hole for zeroing purposes. */ | 189 | /* Treat the unwritten extent as a hole for zeroing purposes. */ |
183 | if (p_blkno && !(ext_flags & OCFS2_EXT_UNWRITTEN)) | 190 | if (p_blkno && !(ext_flags & OCFS2_EXT_UNWRITTEN)) |