@@ -516,8 +516,10 @@ static inline int tcmu_get_empty_block(struct tcmu_dev *udev,
516
516
dpi = dbi * udev -> data_pages_per_blk ;
517
517
/* Count the number of already allocated pages */
518
518
xas_set (& xas , dpi );
519
+ rcu_read_lock ();
519
520
for (cnt = 0 ; xas_next (& xas ) && cnt < page_cnt ;)
520
521
cnt ++ ;
522
+ rcu_read_unlock ();
521
523
522
524
for (i = cnt ; i < page_cnt ; i ++ ) {
523
525
/* try to get new page from the mm */
@@ -699,11 +701,10 @@ static inline void tcmu_copy_data(struct tcmu_dev *udev,
699
701
struct scatterlist * sg , unsigned int sg_nents ,
700
702
struct iovec * * iov , size_t data_len )
701
703
{
702
- XA_STATE (xas , & udev -> data_pages , 0 );
703
704
/* start value of dbi + 1 must not be a valid dbi */
704
705
int dbi = -2 ;
705
706
size_t page_remaining , cp_len ;
706
- int page_cnt , page_inx ;
707
+ int page_cnt , page_inx , dpi ;
707
708
struct sg_mapping_iter sg_iter ;
708
709
unsigned int sg_flags ;
709
710
struct page * page ;
@@ -726,9 +727,10 @@ static inline void tcmu_copy_data(struct tcmu_dev *udev,
726
727
if (page_cnt > udev -> data_pages_per_blk )
727
728
page_cnt = udev -> data_pages_per_blk ;
728
729
729
- xas_set (& xas , dbi * udev -> data_pages_per_blk );
730
- for (page_inx = 0 ; page_inx < page_cnt && data_len ; page_inx ++ ) {
731
- page = xas_next (& xas );
730
+ dpi = dbi * udev -> data_pages_per_blk ;
731
+ for (page_inx = 0 ; page_inx < page_cnt && data_len ;
732
+ page_inx ++ , dpi ++ ) {
733
+ page = xa_load (& udev -> data_pages , dpi );
732
734
733
735
if (direction == TCMU_DATA_AREA_TO_SG )
734
736
flush_dcache_page (page );
0 commit comments