@@ -80,22 +80,40 @@ static blk_status_t pmem_clear_poison(struct pmem_device *pmem,
8080static void write_pmem (void * pmem_addr , struct page * page ,
8181 unsigned int off , unsigned int len )
8282{
83- void * mem = kmap_atomic (page );
84-
85- memcpy_flushcache (pmem_addr , mem + off , len );
86- kunmap_atomic (mem );
83+ unsigned int chunk ;
84+ void * mem ;
85+
86+ while (len ) {
87+ mem = kmap_atomic (page );
88+ chunk = min_t (unsigned int , len , PAGE_SIZE );
89+ memcpy_flushcache (pmem_addr , mem + off , chunk );
90+ kunmap_atomic (mem );
91+ len -= chunk ;
92+ off = 0 ;
93+ page ++ ;
94+ pmem_addr += PAGE_SIZE ;
95+ }
8796}
8897
8998static blk_status_t read_pmem (struct page * page , unsigned int off ,
9099 void * pmem_addr , unsigned int len )
91100{
101+ unsigned int chunk ;
92102 int rc ;
93- void * mem = kmap_atomic (page );
94-
95- rc = memcpy_mcsafe (mem + off , pmem_addr , len );
96- kunmap_atomic (mem );
97- if (rc )
98- return BLK_STS_IOERR ;
103+ void * mem ;
104+
105+ while (len ) {
106+ mem = kmap_atomic (page );
107+ chunk = min_t (unsigned int , len , PAGE_SIZE );
108+ rc = memcpy_mcsafe (mem + off , pmem_addr , chunk );
109+ kunmap_atomic (mem );
110+ if (rc )
111+ return BLK_STS_IOERR ;
112+ len -= chunk ;
113+ off = 0 ;
114+ page ++ ;
115+ pmem_addr += PAGE_SIZE ;
116+ }
99117 return BLK_STS_OK ;
100118}
101119
@@ -188,7 +206,8 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
188206 struct pmem_device * pmem = bdev -> bd_queue -> queuedata ;
189207 blk_status_t rc ;
190208
191- rc = pmem_do_bvec (pmem , page , PAGE_SIZE , 0 , is_write , sector );
209+ rc = pmem_do_bvec (pmem , page , hpage_nr_pages (page ) * PAGE_SIZE ,
210+ 0 , is_write , sector );
192211
193212 /*
194213 * The ->rw_page interface is subtle and tricky. The core
0 commit comments