diff options
| author | Namjae Jeon <linkinjeon@kernel.org> | 2026-05-23 13:24:52 +0900 |
|---|---|---|
| committer | Namjae Jeon <linkinjeon@kernel.org> | 2026-05-23 13:24:52 +0900 |
| commit | 4e0165826802e95230d3584cfaefb310300dd5bf (patch) | |
| tree | 574ac2edf8872ae7657a2b0f17880ab76e20202a /fs | |
| parent | 9fb8a7fed397f19807f3dfebd25a698eb6e8765b (diff) | |
| parent | f356603d90ebc810f66466674abb345158778a85 (diff) | |
| download | linux-next-history-4e0165826802e95230d3584cfaefb310300dd5bf.tar.gz | |
Merge branch 'vfs-7.2.iomap' of https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs into dev
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/iomap/buffered-io.c | 7 | ||||
| -rw-r--r-- | fs/iomap/direct-io.c | 5 | ||||
| -rw-r--r-- | fs/iomap/iter.c | 12 |
3 files changed, 13 insertions, 11 deletions
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c index d7b648421a70f..d6451c4208d49 100644 --- a/fs/iomap/buffered-io.c +++ b/fs/iomap/buffered-io.c @@ -836,6 +836,7 @@ static int __iomap_write_begin(const struct iomap_iter *iter, return -EIO; folio_zero_segments(folio, poff, from, to, poff + plen); } else { + const struct iomap *iomap = iomap_iter_srcmap(iter); int status; if (iter->flags & IOMAP_NOWAIT) @@ -853,6 +854,9 @@ static int __iomap_write_begin(const struct iomap_iter *iter, len, status, GFP_NOFS); if (status) return status; + + if (iomap->flags & IOMAP_F_ZERO_TAIL) + folio_zero_segment(folio, to, poff + plen); } iomap_set_range_uptodate(folio, poff, plen); } while ((block_start += plen) < block_end); @@ -1058,7 +1062,6 @@ static bool iomap_write_end_inline(const struct iomap_iter *iter, void *addr; WARN_ON_ONCE(!folio_test_uptodate(folio)); - BUG_ON(!iomap_inline_data_valid(iomap)); if (WARN_ON_ONCE(!iomap->inline_data)) return false; @@ -1543,6 +1546,8 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero, size_t offset; bool ret; + balance_dirty_pages_ratelimited(iter->inode->i_mapping); + bytes = min_t(u64, SIZE_MAX, bytes); status = iomap_write_begin(iter, write_ops, &folio, &offset, &bytes); diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c index b36ee619cdcdd..b485e3b191daf 100644 --- a/fs/iomap/direct-io.c +++ b/fs/iomap/direct-io.c @@ -69,7 +69,7 @@ static void iomap_dio_submit_bio(const struct iomap_iter *iter, /* Sync dio can't be polled reliably */ if ((iocb->ki_flags & IOCB_HIPRI) && !is_sync_kiocb(iocb)) { - bio_set_polled(bio, iocb); + bio->bi_opf |= REQ_POLLED; WRITE_ONCE(iocb->private, bio); } @@ -603,9 +603,6 @@ static int iomap_dio_inline_iter(struct iomap_iter *iomi, struct iomap_dio *dio) if (WARN_ON_ONCE(!inline_data)) return -EIO; - if (WARN_ON_ONCE(!iomap_inline_data_valid(iomap))) - return -EIO; - if (dio->flags & IOMAP_DIO_WRITE) { loff_t size = iomi->inode->i_size; diff --git a/fs/iomap/iter.c b/fs/iomap/iter.c index c04796f6e57fa..e4a29829591a7 100644 --- a/fs/iomap/iter.c +++ b/fs/iomap/iter.c @@ -6,17 +6,13 @@ #include <linux/iomap.h> #include "trace.h" -static inline void iomap_iter_reset_iomap(struct iomap_iter *iter) +static inline void iomap_iter_clean_fbatch(struct iomap_iter *iter) { if (iter->iomap.flags & IOMAP_F_FOLIO_BATCH) { folio_batch_release(iter->fbatch); folio_batch_reinit(iter->fbatch); iter->iomap.flags &= ~IOMAP_F_FOLIO_BATCH; } - - iter->status = 0; - memset(&iter->iomap, 0, sizeof(iter->iomap)); - memset(&iter->srcmap, 0, sizeof(iter->srcmap)); } /* Advance the current iterator position and decrement the remaining length */ @@ -102,10 +98,14 @@ int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops) ret = 0; else ret = 1; - iomap_iter_reset_iomap(iter); + iomap_iter_clean_fbatch(iter); + iter->status = 0; if (ret <= 0) return ret; + memset(&iter->iomap, 0, sizeof(iter->iomap)); + memset(&iter->srcmap, 0, sizeof(iter->srcmap)); + begin: ret = ops->iomap_begin(iter->inode, iter->pos, iter->len, iter->flags, &iter->iomap, &iter->srcmap); |
