Skip to content

Commit 1b5c1e3

Browse files
Christoph HellwigDarrick J. Wong
authored andcommitted
iomap: pass an iomap_iter to various buffered I/O helpers
Pass the iomap_iter structure instead of individual parameters to various internal helpers for buffered I/O. Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Darrick J. Wong <[email protected]> Signed-off-by: Darrick J. Wong <[email protected]>
1 parent 57320a0 commit 1b5c1e3

File tree

1 file changed

+66
-71
lines changed

1 file changed

+66
-71
lines changed

fs/iomap/buffered-io.c

Lines changed: 66 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,11 @@ struct iomap_readpage_ctx {
205205
struct readahead_control *rac;
206206
};
207207

208-
static loff_t iomap_read_inline_data(struct inode *inode, struct page *page,
209-
const struct iomap *iomap)
208+
static loff_t iomap_read_inline_data(struct iomap_iter *iter,
209+
struct page *page)
210210
{
211-
size_t size = i_size_read(inode) - iomap->offset;
211+
struct iomap *iomap = iomap_iter_srcmap(iter);
212+
size_t size = i_size_read(iter->inode) - iomap->offset;
212213
size_t poff = offset_in_page(iomap->offset);
213214
void *addr;
214215

@@ -223,7 +224,7 @@ static loff_t iomap_read_inline_data(struct inode *inode, struct page *page,
223224
if (WARN_ON_ONCE(size > iomap->length))
224225
return -EIO;
225226
if (poff > 0)
226-
iomap_page_create(inode, page);
227+
iomap_page_create(iter->inode, page);
227228

228229
addr = kmap_local_page(page) + poff;
229230
memcpy(addr, iomap->inline_data, size);
@@ -233,12 +234,14 @@ static loff_t iomap_read_inline_data(struct inode *inode, struct page *page,
233234
return PAGE_SIZE - poff;
234235
}
235236

236-
static inline bool iomap_block_needs_zeroing(struct inode *inode,
237-
struct iomap *iomap, loff_t pos)
237+
static inline bool iomap_block_needs_zeroing(struct iomap_iter *iter,
238+
loff_t pos)
238239
{
239-
return iomap->type != IOMAP_MAPPED ||
240-
(iomap->flags & IOMAP_F_NEW) ||
241-
pos >= i_size_read(inode);
240+
struct iomap *srcmap = iomap_iter_srcmap(iter);
241+
242+
return srcmap->type != IOMAP_MAPPED ||
243+
(srcmap->flags & IOMAP_F_NEW) ||
244+
pos >= i_size_read(iter->inode);
242245
}
243246

244247
static loff_t iomap_readpage_iter(struct iomap_iter *iter,
@@ -254,16 +257,15 @@ static loff_t iomap_readpage_iter(struct iomap_iter *iter,
254257
sector_t sector;
255258

256259
if (iomap->type == IOMAP_INLINE)
257-
return min(iomap_read_inline_data(iter->inode, page, iomap),
258-
length);
260+
return min(iomap_read_inline_data(iter, page), length);
259261

260262
/* zero post-eof blocks as the page may be mapped */
261263
iop = iomap_page_create(iter->inode, page);
262264
iomap_adjust_read_range(iter->inode, iop, &pos, length, &poff, &plen);
263265
if (plen == 0)
264266
goto done;
265267

266-
if (iomap_block_needs_zeroing(iter->inode, iomap, pos)) {
268+
if (iomap_block_needs_zeroing(iter, pos)) {
267269
zero_user(page, poff, plen);
268270
iomap_set_range_uptodate(page, poff, plen);
269271
goto done;
@@ -538,12 +540,12 @@ iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff,
538540
return submit_bio_wait(&bio);
539541
}
540542

541-
static int
542-
__iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
543-
struct page *page, struct iomap *srcmap)
543+
static int __iomap_write_begin(struct iomap_iter *iter, loff_t pos,
544+
unsigned len, int flags, struct page *page)
544545
{
545-
struct iomap_page *iop = iomap_page_create(inode, page);
546-
loff_t block_size = i_blocksize(inode);
546+
struct iomap *srcmap = iomap_iter_srcmap(iter);
547+
struct iomap_page *iop = iomap_page_create(iter->inode, page);
548+
loff_t block_size = i_blocksize(iter->inode);
547549
loff_t block_start = round_down(pos, block_size);
548550
loff_t block_end = round_up(pos + len, block_size);
549551
unsigned from = offset_in_page(pos), to = from + len, poff, plen;
@@ -553,7 +555,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
553555
ClearPageError(page);
554556

555557
do {
556-
iomap_adjust_read_range(inode, iop, &block_start,
558+
iomap_adjust_read_range(iter->inode, iop, &block_start,
557559
block_end - block_start, &poff, &plen);
558560
if (plen == 0)
559561
break;
@@ -563,7 +565,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
563565
(to <= poff || to >= poff + plen))
564566
continue;
565567

566-
if (iomap_block_needs_zeroing(inode, srcmap, block_start)) {
568+
if (iomap_block_needs_zeroing(iter, block_start)) {
567569
if (WARN_ON_ONCE(flags & IOMAP_WRITE_F_UNSHARE))
568570
return -EIO;
569571
zero_user_segments(page, poff, from, to, poff + plen);
@@ -579,55 +581,54 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
579581
return 0;
580582
}
581583

582-
static int iomap_write_begin_inline(struct inode *inode,
583-
struct page *page, struct iomap *srcmap)
584+
static int iomap_write_begin_inline(struct iomap_iter *iter,
585+
struct page *page)
584586
{
585587
int ret;
586588

587589
/* needs more work for the tailpacking case; disable for now */
588-
if (WARN_ON_ONCE(srcmap->offset != 0))
590+
if (WARN_ON_ONCE(iomap_iter_srcmap(iter)->offset != 0))
589591
return -EIO;
590-
ret = iomap_read_inline_data(inode, page, srcmap);
592+
ret = iomap_read_inline_data(iter, page);
591593
if (ret < 0)
592594
return ret;
593595
return 0;
594596
}
595597

596-
static int
597-
iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
598-
struct page **pagep, struct iomap *iomap, struct iomap *srcmap)
598+
static int iomap_write_begin(struct iomap_iter *iter, loff_t pos, unsigned len,
599+
unsigned flags, struct page **pagep)
599600
{
600-
const struct iomap_page_ops *page_ops = iomap->page_ops;
601+
const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
602+
struct iomap *srcmap = iomap_iter_srcmap(iter);
601603
struct page *page;
602604
int status = 0;
603605

604-
BUG_ON(pos + len > iomap->offset + iomap->length);
605-
if (srcmap != iomap)
606+
BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
607+
if (srcmap != &iter->iomap)
606608
BUG_ON(pos + len > srcmap->offset + srcmap->length);
607609

608610
if (fatal_signal_pending(current))
609611
return -EINTR;
610612

611613
if (page_ops && page_ops->page_prepare) {
612-
status = page_ops->page_prepare(inode, pos, len);
614+
status = page_ops->page_prepare(iter->inode, pos, len);
613615
if (status)
614616
return status;
615617
}
616618

617-
page = grab_cache_page_write_begin(inode->i_mapping, pos >> PAGE_SHIFT,
618-
AOP_FLAG_NOFS);
619+
page = grab_cache_page_write_begin(iter->inode->i_mapping,
620+
pos >> PAGE_SHIFT, AOP_FLAG_NOFS);
619621
if (!page) {
620622
status = -ENOMEM;
621623
goto out_no_page;
622624
}
623625

624626
if (srcmap->type == IOMAP_INLINE)
625-
status = iomap_write_begin_inline(inode, page, srcmap);
626-
else if (iomap->flags & IOMAP_F_BUFFER_HEAD)
627+
status = iomap_write_begin_inline(iter, page);
628+
else if (srcmap->flags & IOMAP_F_BUFFER_HEAD)
627629
status = __block_write_begin_int(page, pos, len, NULL, srcmap);
628630
else
629-
status = __iomap_write_begin(inode, pos, len, flags, page,
630-
srcmap);
631+
status = __iomap_write_begin(iter, pos, len, flags, page);
631632

632633
if (unlikely(status))
633634
goto out_unlock;
@@ -638,11 +639,11 @@ iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
638639
out_unlock:
639640
unlock_page(page);
640641
put_page(page);
641-
iomap_write_failed(inode, pos, len);
642+
iomap_write_failed(iter->inode, pos, len);
642643

643644
out_no_page:
644645
if (page_ops && page_ops->page_done)
645-
page_ops->page_done(inode, pos, 0, NULL);
646+
page_ops->page_done(iter->inode, pos, 0, NULL);
646647
return status;
647648
}
648649

@@ -669,9 +670,10 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
669670
return copied;
670671
}
671672

672-
static size_t iomap_write_end_inline(struct inode *inode, struct page *page,
673-
struct iomap *iomap, loff_t pos, size_t copied)
673+
static size_t iomap_write_end_inline(struct iomap_iter *iter, struct page *page,
674+
loff_t pos, size_t copied)
674675
{
676+
struct iomap *iomap = &iter->iomap;
675677
void *addr;
676678

677679
WARN_ON_ONCE(!PageUptodate(page));
@@ -682,26 +684,26 @@ static size_t iomap_write_end_inline(struct inode *inode, struct page *page,
682684
memcpy(iomap_inline_data(iomap, pos), addr, copied);
683685
kunmap_local(addr);
684686

685-
mark_inode_dirty(inode);
687+
mark_inode_dirty(iter->inode);
686688
return copied;
687689
}
688690

689691
/* Returns the number of bytes copied. May be 0. Cannot be an errno. */
690-
static size_t iomap_write_end(struct inode *inode, loff_t pos, size_t len,
691-
size_t copied, struct page *page, struct iomap *iomap,
692-
struct iomap *srcmap)
692+
static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
693+
size_t copied, struct page *page)
693694
{
694-
const struct iomap_page_ops *page_ops = iomap->page_ops;
695-
loff_t old_size = inode->i_size;
695+
const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
696+
struct iomap *srcmap = iomap_iter_srcmap(iter);
697+
loff_t old_size = iter->inode->i_size;
696698
size_t ret;
697699

698700
if (srcmap->type == IOMAP_INLINE) {
699-
ret = iomap_write_end_inline(inode, page, iomap, pos, copied);
701+
ret = iomap_write_end_inline(iter, page, pos, copied);
700702
} else if (srcmap->flags & IOMAP_F_BUFFER_HEAD) {
701-
ret = block_write_end(NULL, inode->i_mapping, pos, len, copied,
702-
page, NULL);
703+
ret = block_write_end(NULL, iter->inode->i_mapping, pos, len,
704+
copied, page, NULL);
703705
} else {
704-
ret = __iomap_write_end(inode, pos, len, copied, page);
706+
ret = __iomap_write_end(iter->inode, pos, len, copied, page);
705707
}
706708

707709
/*
@@ -710,26 +712,24 @@ static size_t iomap_write_end(struct inode *inode, loff_t pos, size_t len,
710712
* preferably after I/O completion so that no stale data is exposed.
711713
*/
712714
if (pos + ret > old_size) {
713-
i_size_write(inode, pos + ret);
714-
iomap->flags |= IOMAP_F_SIZE_CHANGED;
715+
i_size_write(iter->inode, pos + ret);
716+
iter->iomap.flags |= IOMAP_F_SIZE_CHANGED;
715717
}
716718
unlock_page(page);
717719

718720
if (old_size < pos)
719-
pagecache_isize_extended(inode, old_size, pos);
721+
pagecache_isize_extended(iter->inode, old_size, pos);
720722
if (page_ops && page_ops->page_done)
721-
page_ops->page_done(inode, pos, ret, page);
723+
page_ops->page_done(iter->inode, pos, ret, page);
722724
put_page(page);
723725

724726
if (ret < len)
725-
iomap_write_failed(inode, pos, len);
727+
iomap_write_failed(iter->inode, pos, len);
726728
return ret;
727729
}
728730

729731
static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
730732
{
731-
struct iomap *srcmap = iomap_iter_srcmap(iter);
732-
struct iomap *iomap = &iter->iomap;
733733
loff_t length = iomap_length(iter);
734734
loff_t pos = iter->pos;
735735
ssize_t written = 0;
@@ -759,8 +759,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
759759
break;
760760
}
761761

762-
status = iomap_write_begin(iter->inode, pos, bytes, 0, &page,
763-
iomap, srcmap);
762+
status = iomap_write_begin(iter, pos, bytes, 0, &page);
764763
if (unlikely(status))
765764
break;
766765

@@ -769,8 +768,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
769768

770769
copied = copy_page_from_iter_atomic(page, offset, bytes, i);
771770

772-
status = iomap_write_end(iter->inode, pos, bytes, copied, page,
773-
iomap, srcmap);
771+
status = iomap_write_end(iter, pos, bytes, copied, page);
774772

775773
if (unlikely(copied != status))
776774
iov_iter_revert(i, copied - status);
@@ -838,13 +836,12 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
838836
unsigned long bytes = min_t(loff_t, PAGE_SIZE - offset, length);
839837
struct page *page;
840838

841-
status = iomap_write_begin(iter->inode, pos, bytes,
842-
IOMAP_WRITE_F_UNSHARE, &page, iomap, srcmap);
839+
status = iomap_write_begin(iter, pos, bytes,
840+
IOMAP_WRITE_F_UNSHARE, &page);
843841
if (unlikely(status))
844842
return status;
845843

846-
status = iomap_write_end(iter->inode, pos, bytes, bytes, page, iomap,
847-
srcmap);
844+
status = iomap_write_end(iter, pos, bytes, bytes, page);
848845
if (WARN_ON_ONCE(status == 0))
849846
return -EIO;
850847

@@ -878,22 +875,21 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
878875
}
879876
EXPORT_SYMBOL_GPL(iomap_file_unshare);
880877

881-
static s64 iomap_zero(struct inode *inode, loff_t pos, u64 length,
882-
struct iomap *iomap, struct iomap *srcmap)
878+
static s64 __iomap_zero_iter(struct iomap_iter *iter, loff_t pos, u64 length)
883879
{
884880
struct page *page;
885881
int status;
886882
unsigned offset = offset_in_page(pos);
887883
unsigned bytes = min_t(u64, PAGE_SIZE - offset, length);
888884

889-
status = iomap_write_begin(inode, pos, bytes, 0, &page, iomap, srcmap);
885+
status = iomap_write_begin(iter, pos, bytes, 0, &page);
890886
if (status)
891887
return status;
892888

893889
zero_user(page, offset, bytes);
894890
mark_page_accessed(page);
895891

896-
return iomap_write_end(inode, pos, bytes, bytes, page, iomap, srcmap);
892+
return iomap_write_end(iter, pos, bytes, bytes, page);
897893
}
898894

899895
static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
@@ -914,8 +910,7 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
914910
if (IS_DAX(iter->inode))
915911
bytes = dax_iomap_zero(pos, length, iomap);
916912
else
917-
bytes = iomap_zero(iter->inode, pos, length, iomap,
918-
srcmap);
913+
bytes = __iomap_zero_iter(iter, pos, length);
919914
if (bytes < 0)
920915
return bytes;
921916

0 commit comments

Comments
 (0)