Skip to content

Commit 3ea5c76

Browse files
committed
iomap: Drop ifs argument from iomap_set_range_uptodate()
iomap_folio_state (ifs) can be derived directly from the folio, making it unnecessary to pass "ifs" as an argument to iomap_set_range_uptodate(). This patch eliminates "ifs" argument from iomap_set_range_uptodate() function. Also, the definition of iomap_set_range_uptodate() and ifs_set_range_uptodate() functions are moved above ifs_alloc(). In upcoming patches, we plan to introduce additional helper routines for handling dirty state, with the intention of consolidating all of "ifs" state handling routines at one place. Signed-off-by: Ritesh Harjani (IBM) <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Reviewed-by: Darrick J. Wong <[email protected]>
1 parent 04f52c4 commit 3ea5c76

File tree

1 file changed

+33
-34
lines changed

1 file changed

+33
-34
lines changed

fs/iomap/buffered-io.c

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,33 @@ struct iomap_folio_state {
3636

3737
static struct bio_set iomap_ioend_bioset;
3838

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+
3966
static struct iomap_folio_state *ifs_alloc(struct inode *inode,
4067
struct folio *folio, unsigned int flags)
4168
{
@@ -137,30 +164,6 @@ static void iomap_adjust_read_range(struct inode *inode, struct folio *folio,
137164
*lenp = plen;
138165
}
139166

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-
164167
static void iomap_finish_folio_read(struct folio *folio, size_t offset,
165168
size_t len, int error)
166169
{
@@ -170,7 +173,7 @@ static void iomap_finish_folio_read(struct folio *folio, size_t offset,
170173
folio_clear_uptodate(folio);
171174
folio_set_error(folio);
172175
} else {
173-
iomap_set_range_uptodate(folio, ifs, offset, len);
176+
iomap_set_range_uptodate(folio, offset, len);
174177
}
175178

176179
if (!ifs || atomic_sub_and_test(len, &ifs->read_bytes_pending))
@@ -206,7 +209,6 @@ struct iomap_readpage_ctx {
206209
static int iomap_read_inline_data(const struct iomap_iter *iter,
207210
struct folio *folio)
208211
{
209-
struct iomap_folio_state *ifs;
210212
const struct iomap *iomap = iomap_iter_srcmap(iter);
211213
size_t size = i_size_read(iter->inode) - iomap->offset;
212214
size_t poff = offset_in_page(iomap->offset);
@@ -224,15 +226,13 @@ static int iomap_read_inline_data(const struct iomap_iter *iter,
224226
if (WARN_ON_ONCE(size > iomap->length))
225227
return -EIO;
226228
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);
230230

231231
addr = kmap_local_folio(folio, offset);
232232
memcpy(addr, iomap->inline_data, size);
233233
memset(addr + size, 0, PAGE_SIZE - poff - size);
234234
kunmap_local(addr);
235-
iomap_set_range_uptodate(folio, ifs, offset, PAGE_SIZE - poff);
235+
iomap_set_range_uptodate(folio, offset, PAGE_SIZE - poff);
236236
return 0;
237237
}
238238

@@ -269,7 +269,7 @@ static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
269269

270270
if (iomap_block_needs_zeroing(iter, pos)) {
271271
folio_zero_range(folio, poff, plen);
272-
iomap_set_range_uptodate(folio, ifs, poff, plen);
272+
iomap_set_range_uptodate(folio, poff, plen);
273273
goto done;
274274
}
275275

@@ -578,7 +578,7 @@ static int __iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
578578
if (status)
579579
return status;
580580
}
581-
iomap_set_range_uptodate(folio, ifs, poff, plen);
581+
iomap_set_range_uptodate(folio, poff, plen);
582582
} while ((block_start += plen) < block_end);
583583

584584
return 0;
@@ -685,7 +685,6 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
685685
static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
686686
size_t copied, struct folio *folio)
687687
{
688-
struct iomap_folio_state *ifs = folio->private;
689688
flush_dcache_folio(folio);
690689

691690
/*
@@ -701,7 +700,7 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
701700
*/
702701
if (unlikely(copied < len && !folio_test_uptodate(folio)))
703702
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);
705704
filemap_dirty_folio(inode->i_mapping, folio);
706705
return copied;
707706
}

0 commit comments

Comments
 (0)