diff options
Diffstat (limited to 'fs/iomap.c')
-rw-r--r-- | fs/iomap.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/fs/iomap.c b/fs/iomap.c index 48141b8eff5f..0342254646e3 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
@@ -84,8 +84,11 @@ iomap_apply(struct inode *inode, loff_t pos, loff_t length, unsigned flags, | |||
84 | * Now the data has been copied, commit the range we've copied. This | 84 | * Now the data has been copied, commit the range we've copied. This |
85 | * should not fail unless the filesystem has had a fatal error. | 85 | * should not fail unless the filesystem has had a fatal error. |
86 | */ | 86 | */ |
87 | ret = ops->iomap_end(inode, pos, length, written > 0 ? written : 0, | 87 | if (ops->iomap_end) { |
88 | flags, &iomap); | 88 | ret = ops->iomap_end(inode, pos, length, |
89 | written > 0 ? written : 0, | ||
90 | flags, &iomap); | ||
91 | } | ||
89 | 92 | ||
90 | return written ? written : ret; | 93 | return written ? written : ret; |
91 | } | 94 | } |
@@ -194,12 +197,9 @@ again: | |||
194 | if (mapping_writably_mapped(inode->i_mapping)) | 197 | if (mapping_writably_mapped(inode->i_mapping)) |
195 | flush_dcache_page(page); | 198 | flush_dcache_page(page); |
196 | 199 | ||
197 | pagefault_disable(); | ||
198 | copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); | 200 | copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); |
199 | pagefault_enable(); | ||
200 | 201 | ||
201 | flush_dcache_page(page); | 202 | flush_dcache_page(page); |
202 | mark_page_accessed(page); | ||
203 | 203 | ||
204 | status = iomap_write_end(inode, pos, bytes, copied, page); | 204 | status = iomap_write_end(inode, pos, bytes, copied, page); |
205 | if (unlikely(status < 0)) | 205 | if (unlikely(status < 0)) |
@@ -470,13 +470,18 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, | |||
470 | if (ret) | 470 | if (ret) |
471 | return ret; | 471 | return ret; |
472 | 472 | ||
473 | ret = filemap_write_and_wait(inode->i_mapping); | 473 | if (fi->fi_flags & FIEMAP_FLAG_SYNC) { |
474 | if (ret) | 474 | ret = filemap_write_and_wait(inode->i_mapping); |
475 | return ret; | 475 | if (ret) |
476 | return ret; | ||
477 | } | ||
476 | 478 | ||
477 | while (len > 0) { | 479 | while (len > 0) { |
478 | ret = iomap_apply(inode, start, len, 0, ops, &ctx, | 480 | ret = iomap_apply(inode, start, len, 0, ops, &ctx, |
479 | iomap_fiemap_actor); | 481 | iomap_fiemap_actor); |
482 | /* inode with no (attribute) mapping will give ENOENT */ | ||
483 | if (ret == -ENOENT) | ||
484 | break; | ||
480 | if (ret < 0) | 485 | if (ret < 0) |
481 | return ret; | 486 | return ret; |
482 | if (ret == 0) | 487 | if (ret == 0) |