summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2023-04-03 08:17:26 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-05-12 19:42:33 -0400
commit9c29331fc59ed6585bf13655044b3605dbe69e0d (patch)
tree1ebee1aac3739e367922a00f62330d5ef663d096
parent65f3ef3121232f129d0e56635219de7d1287afaa (diff)
bcachefs: folio pos to bch_folio_sector index helper
Create a small helper to translate from file offset to the associated bch_folio_sector index in the underlying bch_folio. The helper assumes the file offset is covered by the passed folio. Signed-off-by: Brian Foster <bfoster@redhat.com>
-rw-r--r--fs/bcachefs/fs-io.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index 702c4bcfc8d8..c3749d728a91 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -485,6 +485,14 @@ static inline void folio_sector_set(struct folio *folio,
s->s[i].state = n;
}
+/* file offset (to folio offset) to bch_folio_sector index */
+static inline int folio_pos_to_s(struct folio *folio, loff_t pos)
+{
+ u64 f_offset = pos - folio_pos(folio);
+ BUG_ON(pos < folio_pos(folio) || pos >= folio_end_pos(folio));
+ return f_offset >> SECTOR_SHIFT;
+}
+
static inline struct bch_folio *__bch2_folio(struct folio *folio)
{
return folio_has_private(folio)
@@ -2857,7 +2865,7 @@ static int __bch2_truncate_folio(struct bch_inode_info *inode,
end_pos = folio_end_pos(folio);
if (inode->v.i_size > folio_pos(folio))
end_pos = min_t(u64, inode->v.i_size, end_pos);
- ret = s->s[(end_pos - folio_pos(folio) - 1) >> 9].state >= SECTOR_dirty;
+ ret = s->s[folio_pos_to_s(folio, end_pos - 1)].state >= SECTOR_dirty;
folio_zero_segment(folio, start_offset, end_offset);
@@ -3608,15 +3616,15 @@ err:
/* fseek: */
-static int folio_data_offset(struct folio *folio, unsigned offset)
+static int folio_data_offset(struct folio *folio, loff_t pos)
{
struct bch_folio *s = bch2_folio(folio);
unsigned i, sectors = folio_sectors(folio);
if (s)
- for (i = offset >> 9; i < sectors; i++)
+ for (i = folio_pos_to_s(folio, pos); i < sectors; i++)
if (s->s[i].state >= SECTOR_dirty)
- return i << 9;
+ return i << SECTOR_SHIFT;
return -1;
}
@@ -3642,8 +3650,7 @@ static loff_t bch2_seek_pagecache_data(struct inode *vinode,
folio_lock(folio);
offset = folio_data_offset(folio,
- max(folio_pos(folio), start_offset) -
- folio_pos(folio));
+ max(folio_pos(folio), start_offset));
if (offset >= 0) {
ret = clamp(folio_pos(folio) + offset,
start_offset, end_offset);
@@ -3717,7 +3724,7 @@ static bool folio_hole_offset(struct address_space *mapping, loff_t *offset)
{
struct folio *folio;
struct bch_folio *s;
- unsigned i, sectors, f_offset;
+ unsigned i, sectors;
bool ret = true;
folio = filemap_lock_folio(mapping, *offset >> PAGE_SHIFT);
@@ -3729,11 +3736,10 @@ static bool folio_hole_offset(struct address_space *mapping, loff_t *offset)
goto unlock;
sectors = folio_sectors(folio);
- f_offset = *offset - folio_pos(folio);
-
- for (i = f_offset >> 9; i < sectors; i++)
+ for (i = folio_pos_to_s(folio, *offset); i < sectors; i++)
if (s->s[i].state < SECTOR_dirty) {
- *offset = max(*offset, folio_pos(folio) + (i << 9));
+ *offset = max(*offset,
+ folio_pos(folio) + (i << SECTOR_SHIFT));
goto unlock;
}