@@ -36,6 +36,33 @@ struct iomap_folio_state {
36
36
37
37
static struct bio_set iomap_ioend_bioset ;
38
38
39
+ static void ifs_set_range_uptodate (struct folio * folio ,
40
+ struct iomap_folio_state * ifs , size_t off , size_t len )
41
+ {
42
+ struct inode * inode = folio -> mapping -> host ;
43
+ unsigned int first_blk = off >> inode -> i_blkbits ;
44
+ unsigned int last_blk = (off + len - 1 ) >> inode -> i_blkbits ;
45
+ unsigned int nr_blks = last_blk - first_blk + 1 ;
46
+ unsigned long flags ;
47
+
48
+ spin_lock_irqsave (& ifs -> state_lock , flags );
49
+ bitmap_set (ifs -> state , first_blk , nr_blks );
50
+ if (bitmap_full (ifs -> state , i_blocks_per_folio (inode , folio )))
51
+ folio_mark_uptodate (folio );
52
+ spin_unlock_irqrestore (& ifs -> state_lock , flags );
53
+ }
54
+
55
+ static void iomap_set_range_uptodate (struct folio * folio , size_t off ,
56
+ size_t len )
57
+ {
58
+ struct iomap_folio_state * ifs = folio -> private ;
59
+
60
+ if (ifs )
61
+ ifs_set_range_uptodate (folio , ifs , off , len );
62
+ else
63
+ folio_mark_uptodate (folio );
64
+ }
65
+
39
66
static struct iomap_folio_state * ifs_alloc (struct inode * inode ,
40
67
struct folio * folio , unsigned int flags )
41
68
{
@@ -137,30 +164,6 @@ static void iomap_adjust_read_range(struct inode *inode, struct folio *folio,
137
164
* lenp = plen ;
138
165
}
139
166
140
- static void ifs_set_range_uptodate (struct folio * folio ,
141
- struct iomap_folio_state * ifs , size_t off , size_t len )
142
- {
143
- struct inode * inode = folio -> mapping -> host ;
144
- unsigned first = off >> inode -> i_blkbits ;
145
- unsigned last = (off + len - 1 ) >> inode -> i_blkbits ;
146
- unsigned long flags ;
147
-
148
- spin_lock_irqsave (& ifs -> state_lock , flags );
149
- bitmap_set (ifs -> state , first , last - first + 1 );
150
- if (bitmap_full (ifs -> state , i_blocks_per_folio (inode , folio )))
151
- folio_mark_uptodate (folio );
152
- spin_unlock_irqrestore (& ifs -> state_lock , flags );
153
- }
154
-
155
- static void iomap_set_range_uptodate (struct folio * folio ,
156
- struct iomap_folio_state * ifs , size_t off , size_t len )
157
- {
158
- if (ifs )
159
- ifs_set_range_uptodate (folio , ifs , off , len );
160
- else
161
- folio_mark_uptodate (folio );
162
- }
163
-
164
167
static void iomap_finish_folio_read (struct folio * folio , size_t offset ,
165
168
size_t len , int error )
166
169
{
@@ -170,7 +173,7 @@ static void iomap_finish_folio_read(struct folio *folio, size_t offset,
170
173
folio_clear_uptodate (folio );
171
174
folio_set_error (folio );
172
175
} else {
173
- iomap_set_range_uptodate (folio , ifs , offset , len );
176
+ iomap_set_range_uptodate (folio , offset , len );
174
177
}
175
178
176
179
if (!ifs || atomic_sub_and_test (len , & ifs -> read_bytes_pending ))
@@ -206,7 +209,6 @@ struct iomap_readpage_ctx {
206
209
static int iomap_read_inline_data (const struct iomap_iter * iter ,
207
210
struct folio * folio )
208
211
{
209
- struct iomap_folio_state * ifs ;
210
212
const struct iomap * iomap = iomap_iter_srcmap (iter );
211
213
size_t size = i_size_read (iter -> inode ) - iomap -> offset ;
212
214
size_t poff = offset_in_page (iomap -> offset );
@@ -224,15 +226,13 @@ static int iomap_read_inline_data(const struct iomap_iter *iter,
224
226
if (WARN_ON_ONCE (size > iomap -> length ))
225
227
return - EIO ;
226
228
if (offset > 0 )
227
- ifs = ifs_alloc (iter -> inode , folio , iter -> flags );
228
- else
229
- ifs = folio -> private ;
229
+ ifs_alloc (iter -> inode , folio , iter -> flags );
230
230
231
231
addr = kmap_local_folio (folio , offset );
232
232
memcpy (addr , iomap -> inline_data , size );
233
233
memset (addr + size , 0 , PAGE_SIZE - poff - size );
234
234
kunmap_local (addr );
235
- iomap_set_range_uptodate (folio , ifs , offset , PAGE_SIZE - poff );
235
+ iomap_set_range_uptodate (folio , offset , PAGE_SIZE - poff );
236
236
return 0 ;
237
237
}
238
238
@@ -269,7 +269,7 @@ static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
269
269
270
270
if (iomap_block_needs_zeroing (iter , pos )) {
271
271
folio_zero_range (folio , poff , plen );
272
- iomap_set_range_uptodate (folio , ifs , poff , plen );
272
+ iomap_set_range_uptodate (folio , poff , plen );
273
273
goto done ;
274
274
}
275
275
@@ -578,7 +578,7 @@ static int __iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
578
578
if (status )
579
579
return status ;
580
580
}
581
- iomap_set_range_uptodate (folio , ifs , poff , plen );
581
+ iomap_set_range_uptodate (folio , poff , plen );
582
582
} while ((block_start += plen ) < block_end );
583
583
584
584
return 0 ;
@@ -685,7 +685,6 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
685
685
static size_t __iomap_write_end (struct inode * inode , loff_t pos , size_t len ,
686
686
size_t copied , struct folio * folio )
687
687
{
688
- struct iomap_folio_state * ifs = folio -> private ;
689
688
flush_dcache_folio (folio );
690
689
691
690
/*
@@ -701,7 +700,7 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
701
700
*/
702
701
if (unlikely (copied < len && !folio_test_uptodate (folio )))
703
702
return 0 ;
704
- iomap_set_range_uptodate (folio , ifs , offset_in_folio (folio , pos ), len );
703
+ iomap_set_range_uptodate (folio , offset_in_folio (folio , pos ), len );
705
704
filemap_dirty_folio (inode -> i_mapping , folio );
706
705
return copied ;
707
706
}
0 commit comments