@@ -234,7 +234,7 @@ static inline bool iomap_block_needs_zeroing(struct inode *inode,
234
234
235
235
static loff_t
236
236
iomap_readpage_actor (struct inode * inode , loff_t pos , loff_t length , void * data ,
237
- struct iomap * iomap )
237
+ struct iomap * iomap , struct iomap * srcmap )
238
238
{
239
239
struct iomap_readpage_ctx * ctx = data ;
240
240
struct page * page = ctx -> cur_page ;
@@ -382,7 +382,7 @@ iomap_next_page(struct inode *inode, struct list_head *pages, loff_t pos,
382
382
383
383
static loff_t
384
384
iomap_readpages_actor (struct inode * inode , loff_t pos , loff_t length ,
385
- void * data , struct iomap * iomap )
385
+ void * data , struct iomap * iomap , struct iomap * srcmap )
386
386
{
387
387
struct iomap_readpage_ctx * ctx = data ;
388
388
loff_t done , ret ;
@@ -402,7 +402,7 @@ iomap_readpages_actor(struct inode *inode, loff_t pos, loff_t length,
402
402
ctx -> cur_page_in_bio = false;
403
403
}
404
404
ret = iomap_readpage_actor (inode , pos + done , length - done ,
405
- ctx , iomap );
405
+ ctx , iomap , srcmap );
406
406
}
407
407
408
408
return done ;
@@ -582,7 +582,7 @@ iomap_read_page_sync(loff_t block_start, struct page *page, unsigned poff,
582
582
583
583
static int
584
584
__iomap_write_begin (struct inode * inode , loff_t pos , unsigned len , int flags ,
585
- struct page * page , struct iomap * iomap )
585
+ struct page * page , struct iomap * srcmap )
586
586
{
587
587
struct iomap_page * iop = iomap_page_create (inode , page );
588
588
loff_t block_size = i_blocksize (inode );
@@ -605,7 +605,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
605
605
(to <= poff || to >= poff + plen ))
606
606
continue ;
607
607
608
- if (iomap_block_needs_zeroing (inode , iomap , block_start )) {
608
+ if (iomap_block_needs_zeroing (inode , srcmap , block_start )) {
609
609
if (WARN_ON_ONCE (flags & IOMAP_WRITE_F_UNSHARE ))
610
610
return - EIO ;
611
611
zero_user_segments (page , poff , from , to , poff + plen );
@@ -614,7 +614,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
614
614
}
615
615
616
616
status = iomap_read_page_sync (block_start , page , poff , plen ,
617
- iomap );
617
+ srcmap );
618
618
if (status )
619
619
return status ;
620
620
} while ((block_start += plen ) < block_end );
@@ -624,13 +624,15 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,
624
624
625
625
static int
626
626
iomap_write_begin (struct inode * inode , loff_t pos , unsigned len , unsigned flags ,
627
- struct page * * pagep , struct iomap * iomap )
627
+ struct page * * pagep , struct iomap * iomap , struct iomap * srcmap )
628
628
{
629
629
const struct iomap_page_ops * page_ops = iomap -> page_ops ;
630
630
struct page * page ;
631
631
int status = 0 ;
632
632
633
633
BUG_ON (pos + len > iomap -> offset + iomap -> length );
634
+ if (srcmap != iomap )
635
+ BUG_ON (pos + len > srcmap -> offset + srcmap -> length );
634
636
635
637
if (fatal_signal_pending (current ))
636
638
return - EINTR ;
@@ -648,13 +650,13 @@ iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
648
650
goto out_no_page ;
649
651
}
650
652
651
- if (iomap -> type == IOMAP_INLINE )
652
- iomap_read_inline_data (inode , page , iomap );
653
+ if (srcmap -> type == IOMAP_INLINE )
654
+ iomap_read_inline_data (inode , page , srcmap );
653
655
else if (iomap -> flags & IOMAP_F_BUFFER_HEAD )
654
- status = __block_write_begin_int (page , pos , len , NULL , iomap );
656
+ status = __block_write_begin_int (page , pos , len , NULL , srcmap );
655
657
else
656
658
status = __iomap_write_begin (inode , pos , len , flags , page ,
657
- iomap );
659
+ srcmap );
658
660
659
661
if (unlikely (status ))
660
662
goto out_unlock ;
@@ -740,16 +742,16 @@ iomap_write_end_inline(struct inode *inode, struct page *page,
740
742
}
741
743
742
744
static int
743
- iomap_write_end (struct inode * inode , loff_t pos , unsigned len ,
744
- unsigned copied , struct page * page , struct iomap * iomap )
745
+ iomap_write_end (struct inode * inode , loff_t pos , unsigned len , unsigned copied ,
746
+ struct page * page , struct iomap * iomap , struct iomap * srcmap )
745
747
{
746
748
const struct iomap_page_ops * page_ops = iomap -> page_ops ;
747
749
loff_t old_size = inode -> i_size ;
748
750
int ret ;
749
751
750
- if (iomap -> type == IOMAP_INLINE ) {
752
+ if (srcmap -> type == IOMAP_INLINE ) {
751
753
ret = iomap_write_end_inline (inode , page , iomap , pos , copied );
752
- } else if (iomap -> flags & IOMAP_F_BUFFER_HEAD ) {
754
+ } else if (srcmap -> flags & IOMAP_F_BUFFER_HEAD ) {
753
755
ret = block_write_end (NULL , inode -> i_mapping , pos , len , copied ,
754
756
page , NULL );
755
757
} else {
@@ -780,7 +782,7 @@ iomap_write_end(struct inode *inode, loff_t pos, unsigned len,
780
782
781
783
static loff_t
782
784
iomap_write_actor (struct inode * inode , loff_t pos , loff_t length , void * data ,
783
- struct iomap * iomap )
785
+ struct iomap * iomap , struct iomap * srcmap )
784
786
{
785
787
struct iov_iter * i = data ;
786
788
long status = 0 ;
@@ -814,7 +816,8 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
814
816
break ;
815
817
}
816
818
817
- status = iomap_write_begin (inode , pos , bytes , 0 , & page , iomap );
819
+ status = iomap_write_begin (inode , pos , bytes , 0 , & page , iomap ,
820
+ srcmap );
818
821
if (unlikely (status ))
819
822
break ;
820
823
@@ -825,8 +828,8 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
825
828
826
829
flush_dcache_page (page );
827
830
828
- status = iomap_write_end (inode , pos , bytes , copied , page ,
829
- iomap );
831
+ status = iomap_write_end (inode , pos , bytes , copied , page , iomap ,
832
+ srcmap );
830
833
if (unlikely (status < 0 ))
831
834
break ;
832
835
copied = status ;
@@ -879,7 +882,7 @@ EXPORT_SYMBOL_GPL(iomap_file_buffered_write);
879
882
880
883
static loff_t
881
884
iomap_unshare_actor (struct inode * inode , loff_t pos , loff_t length , void * data ,
882
- struct iomap * iomap )
885
+ struct iomap * iomap , struct iomap * srcmap )
883
886
{
884
887
long status = 0 ;
885
888
ssize_t written = 0 ;
@@ -888,7 +891,7 @@ iomap_unshare_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
888
891
if (!(iomap -> flags & IOMAP_F_SHARED ))
889
892
return length ;
890
893
/* don't bother with holes or unwritten extents */
891
- if (iomap -> type == IOMAP_HOLE || iomap -> type == IOMAP_UNWRITTEN )
894
+ if (srcmap -> type == IOMAP_HOLE || srcmap -> type == IOMAP_UNWRITTEN )
892
895
return length ;
893
896
894
897
do {
@@ -897,11 +900,12 @@ iomap_unshare_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
897
900
struct page * page ;
898
901
899
902
status = iomap_write_begin (inode , pos , bytes ,
900
- IOMAP_WRITE_F_UNSHARE , & page , iomap );
903
+ IOMAP_WRITE_F_UNSHARE , & page , iomap , srcmap );
901
904
if (unlikely (status ))
902
905
return status ;
903
906
904
- status = iomap_write_end (inode , pos , bytes , bytes , page , iomap );
907
+ status = iomap_write_end (inode , pos , bytes , bytes , page , iomap ,
908
+ srcmap );
905
909
if (unlikely (status <= 0 )) {
906
910
if (WARN_ON_ONCE (status == 0 ))
907
911
return - EIO ;
@@ -940,19 +944,19 @@ iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
940
944
EXPORT_SYMBOL_GPL (iomap_file_unshare );
941
945
942
946
static int iomap_zero (struct inode * inode , loff_t pos , unsigned offset ,
943
- unsigned bytes , struct iomap * iomap )
947
+ unsigned bytes , struct iomap * iomap , struct iomap * srcmap )
944
948
{
945
949
struct page * page ;
946
950
int status ;
947
951
948
- status = iomap_write_begin (inode , pos , bytes , 0 , & page , iomap );
952
+ status = iomap_write_begin (inode , pos , bytes , 0 , & page , iomap , srcmap );
949
953
if (status )
950
954
return status ;
951
955
952
956
zero_user (page , offset , bytes );
953
957
mark_page_accessed (page );
954
958
955
- return iomap_write_end (inode , pos , bytes , bytes , page , iomap );
959
+ return iomap_write_end (inode , pos , bytes , bytes , page , iomap , srcmap );
956
960
}
957
961
958
962
static int iomap_dax_zero (loff_t pos , unsigned offset , unsigned bytes ,
@@ -964,14 +968,14 @@ static int iomap_dax_zero(loff_t pos, unsigned offset, unsigned bytes,
964
968
965
969
static loff_t
966
970
iomap_zero_range_actor (struct inode * inode , loff_t pos , loff_t count ,
967
- void * data , struct iomap * iomap )
971
+ void * data , struct iomap * iomap , struct iomap * srcmap )
968
972
{
969
973
bool * did_zero = data ;
970
974
loff_t written = 0 ;
971
975
int status ;
972
976
973
977
/* already zeroed? we're done. */
974
- if (iomap -> type == IOMAP_HOLE || iomap -> type == IOMAP_UNWRITTEN )
978
+ if (srcmap -> type == IOMAP_HOLE || srcmap -> type == IOMAP_UNWRITTEN )
975
979
return count ;
976
980
977
981
do {
@@ -983,7 +987,8 @@ iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count,
983
987
if (IS_DAX (inode ))
984
988
status = iomap_dax_zero (pos , offset , bytes , iomap );
985
989
else
986
- status = iomap_zero (inode , pos , offset , bytes , iomap );
990
+ status = iomap_zero (inode , pos , offset , bytes , iomap ,
991
+ srcmap );
987
992
if (status < 0 )
988
993
return status ;
989
994
@@ -1033,7 +1038,7 @@ EXPORT_SYMBOL_GPL(iomap_truncate_page);
1033
1038
1034
1039
static loff_t
1035
1040
iomap_page_mkwrite_actor (struct inode * inode , loff_t pos , loff_t length ,
1036
- void * data , struct iomap * iomap )
1041
+ void * data , struct iomap * iomap , struct iomap * srcmap )
1037
1042
{
1038
1043
struct page * page = data ;
1039
1044
int ret ;
0 commit comments