@@ -205,10 +205,11 @@ struct iomap_readpage_ctx {
205
205
struct readahead_control * rac ;
206
206
};
207
207
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 )
210
210
{
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 ;
212
213
size_t poff = offset_in_page (iomap -> offset );
213
214
void * addr ;
214
215
@@ -223,7 +224,7 @@ static loff_t iomap_read_inline_data(struct inode *inode, struct page *page,
223
224
if (WARN_ON_ONCE (size > iomap -> length ))
224
225
return - EIO ;
225
226
if (poff > 0 )
226
- iomap_page_create (inode , page );
227
+ iomap_page_create (iter -> inode , page );
227
228
228
229
addr = kmap_local_page (page ) + poff ;
229
230
memcpy (addr , iomap -> inline_data , size );
@@ -233,12 +234,14 @@ static loff_t iomap_read_inline_data(struct inode *inode, struct page *page,
233
234
return PAGE_SIZE - poff ;
234
235
}
235
236
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 )
238
239
{
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 );
242
245
}
243
246
244
247
static loff_t iomap_readpage_iter (struct iomap_iter * iter ,
@@ -254,16 +257,15 @@ static loff_t iomap_readpage_iter(struct iomap_iter *iter,
254
257
sector_t sector ;
255
258
256
259
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 );
259
261
260
262
/* zero post-eof blocks as the page may be mapped */
261
263
iop = iomap_page_create (iter -> inode , page );
262
264
iomap_adjust_read_range (iter -> inode , iop , & pos , length , & poff , & plen );
263
265
if (plen == 0 )
264
266
goto done ;
265
267
266
- if (iomap_block_needs_zeroing (iter -> inode , iomap , pos )) {
268
+ if (iomap_block_needs_zeroing (iter , pos )) {
267
269
zero_user (page , poff , plen );
268
270
iomap_set_range_uptodate (page , poff , plen );
269
271
goto done ;
@@ -538,12 +540,12 @@ iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff,
538
540
return submit_bio_wait (& bio );
539
541
}
540
542
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 )
544
545
{
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 );
547
549
loff_t block_start = round_down (pos , block_size );
548
550
loff_t block_end = round_up (pos + len , block_size );
549
551
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,
553
555
ClearPageError (page );
554
556
555
557
do {
556
- iomap_adjust_read_range (inode , iop , & block_start ,
558
+ iomap_adjust_read_range (iter -> inode , iop , & block_start ,
557
559
block_end - block_start , & poff , & plen );
558
560
if (plen == 0 )
559
561
break ;
@@ -563,7 +565,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
563
565
(to <= poff || to >= poff + plen ))
564
566
continue ;
565
567
566
- if (iomap_block_needs_zeroing (inode , srcmap , block_start )) {
568
+ if (iomap_block_needs_zeroing (iter , block_start )) {
567
569
if (WARN_ON_ONCE (flags & IOMAP_WRITE_F_UNSHARE ))
568
570
return - EIO ;
569
571
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,
579
581
return 0 ;
580
582
}
581
583
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 )
584
586
{
585
587
int ret ;
586
588
587
589
/* 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 ))
589
591
return - EIO ;
590
- ret = iomap_read_inline_data (inode , page , srcmap );
592
+ ret = iomap_read_inline_data (iter , page );
591
593
if (ret < 0 )
592
594
return ret ;
593
595
return 0 ;
594
596
}
595
597
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 )
599
600
{
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 );
601
603
struct page * page ;
602
604
int status = 0 ;
603
605
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 )
606
608
BUG_ON (pos + len > srcmap -> offset + srcmap -> length );
607
609
608
610
if (fatal_signal_pending (current ))
609
611
return - EINTR ;
610
612
611
613
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 );
613
615
if (status )
614
616
return status ;
615
617
}
616
618
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 );
619
621
if (!page ) {
620
622
status = - ENOMEM ;
621
623
goto out_no_page ;
622
624
}
623
625
624
626
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 )
627
629
status = __block_write_begin_int (page , pos , len , NULL , srcmap );
628
630
else
629
- status = __iomap_write_begin (inode , pos , len , flags , page ,
630
- srcmap );
631
+ status = __iomap_write_begin (iter , pos , len , flags , page );
631
632
632
633
if (unlikely (status ))
633
634
goto out_unlock ;
@@ -638,11 +639,11 @@ iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
638
639
out_unlock :
639
640
unlock_page (page );
640
641
put_page (page );
641
- iomap_write_failed (inode , pos , len );
642
+ iomap_write_failed (iter -> inode , pos , len );
642
643
643
644
out_no_page :
644
645
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 );
646
647
return status ;
647
648
}
648
649
@@ -669,9 +670,10 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
669
670
return copied ;
670
671
}
671
672
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 )
674
675
{
676
+ struct iomap * iomap = & iter -> iomap ;
675
677
void * addr ;
676
678
677
679
WARN_ON_ONCE (!PageUptodate (page ));
@@ -682,26 +684,26 @@ static size_t iomap_write_end_inline(struct inode *inode, struct page *page,
682
684
memcpy (iomap_inline_data (iomap , pos ), addr , copied );
683
685
kunmap_local (addr );
684
686
685
- mark_inode_dirty (inode );
687
+ mark_inode_dirty (iter -> inode );
686
688
return copied ;
687
689
}
688
690
689
691
/* 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 )
693
694
{
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 ;
696
698
size_t ret ;
697
699
698
700
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 );
700
702
} 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 );
703
705
} else {
704
- ret = __iomap_write_end (inode , pos , len , copied , page );
706
+ ret = __iomap_write_end (iter -> inode , pos , len , copied , page );
705
707
}
706
708
707
709
/*
@@ -710,26 +712,24 @@ static size_t iomap_write_end(struct inode *inode, loff_t pos, size_t len,
710
712
* preferably after I/O completion so that no stale data is exposed.
711
713
*/
712
714
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 ;
715
717
}
716
718
unlock_page (page );
717
719
718
720
if (old_size < pos )
719
- pagecache_isize_extended (inode , old_size , pos );
721
+ pagecache_isize_extended (iter -> inode , old_size , pos );
720
722
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 );
722
724
put_page (page );
723
725
724
726
if (ret < len )
725
- iomap_write_failed (inode , pos , len );
727
+ iomap_write_failed (iter -> inode , pos , len );
726
728
return ret ;
727
729
}
728
730
729
731
static loff_t iomap_write_iter (struct iomap_iter * iter , struct iov_iter * i )
730
732
{
731
- struct iomap * srcmap = iomap_iter_srcmap (iter );
732
- struct iomap * iomap = & iter -> iomap ;
733
733
loff_t length = iomap_length (iter );
734
734
loff_t pos = iter -> pos ;
735
735
ssize_t written = 0 ;
@@ -759,8 +759,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
759
759
break ;
760
760
}
761
761
762
- status = iomap_write_begin (iter -> inode , pos , bytes , 0 , & page ,
763
- iomap , srcmap );
762
+ status = iomap_write_begin (iter , pos , bytes , 0 , & page );
764
763
if (unlikely (status ))
765
764
break ;
766
765
@@ -769,8 +768,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
769
768
770
769
copied = copy_page_from_iter_atomic (page , offset , bytes , i );
771
770
772
- status = iomap_write_end (iter -> inode , pos , bytes , copied , page ,
773
- iomap , srcmap );
771
+ status = iomap_write_end (iter , pos , bytes , copied , page );
774
772
775
773
if (unlikely (copied != status ))
776
774
iov_iter_revert (i , copied - status );
@@ -838,13 +836,12 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
838
836
unsigned long bytes = min_t (loff_t , PAGE_SIZE - offset , length );
839
837
struct page * page ;
840
838
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 );
843
841
if (unlikely (status ))
844
842
return status ;
845
843
846
- status = iomap_write_end (iter -> inode , pos , bytes , bytes , page , iomap ,
847
- srcmap );
844
+ status = iomap_write_end (iter , pos , bytes , bytes , page );
848
845
if (WARN_ON_ONCE (status == 0 ))
849
846
return - EIO ;
850
847
@@ -878,22 +875,21 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
878
875
}
879
876
EXPORT_SYMBOL_GPL (iomap_file_unshare );
880
877
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 )
883
879
{
884
880
struct page * page ;
885
881
int status ;
886
882
unsigned offset = offset_in_page (pos );
887
883
unsigned bytes = min_t (u64 , PAGE_SIZE - offset , length );
888
884
889
- status = iomap_write_begin (inode , pos , bytes , 0 , & page , iomap , srcmap );
885
+ status = iomap_write_begin (iter , pos , bytes , 0 , & page );
890
886
if (status )
891
887
return status ;
892
888
893
889
zero_user (page , offset , bytes );
894
890
mark_page_accessed (page );
895
891
896
- return iomap_write_end (inode , pos , bytes , bytes , page , iomap , srcmap );
892
+ return iomap_write_end (iter , pos , bytes , bytes , page );
897
893
}
898
894
899
895
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)
914
910
if (IS_DAX (iter -> inode ))
915
911
bytes = dax_iomap_zero (pos , length , iomap );
916
912
else
917
- bytes = iomap_zero (iter -> inode , pos , length , iomap ,
918
- srcmap );
913
+ bytes = __iomap_zero_iter (iter , pos , length );
919
914
if (bytes < 0 )
920
915
return bytes ;
921
916
0 commit comments