xfs: refactor cmp_key_with_cur routines to take advantage of cmp_int()

The net value of these functions is to determine the result of a
three-way-comparison between operands of the same type.

Simplify the code using cmp_int() to eliminate potential errors with
opencoded casts and subtractions. This also means we can change the return
value type of cmp_key_with_cur routines from int64_t to int and make the
interface a bit clearer.

Found by Linux Verification Center (linuxtesting.org).

Suggested-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
Fedor Pchelkin 2025-07-02 12:39:31 +03:00 committed by Carlos Maiolino
parent 3b583adf55
commit 734b871d6c
9 changed files with 30 additions and 74 deletions

View File

@ -186,7 +186,7 @@ xfs_allocbt_init_ptr_from_cur(
ptr->s = agf->agf_cnt_root;
}
STATIC int64_t
STATIC int
xfs_bnobt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
@ -194,23 +194,20 @@ xfs_bnobt_cmp_key_with_cur(
struct xfs_alloc_rec_incore *rec = &cur->bc_rec.a;
const struct xfs_alloc_rec *kp = &key->alloc;
return (int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock;
return cmp_int(be32_to_cpu(kp->ar_startblock),
rec->ar_startblock);
}
STATIC int64_t
STATIC int
xfs_cntbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
{
struct xfs_alloc_rec_incore *rec = &cur->bc_rec.a;
const struct xfs_alloc_rec *kp = &key->alloc;
int64_t diff;
diff = (int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount;
if (diff)
return diff;
return (int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock;
return cmp_int(be32_to_cpu(kp->ar_blockcount), rec->ar_blockcount) ?:
cmp_int(be32_to_cpu(kp->ar_startblock), rec->ar_startblock);
}
STATIC int

View File

@ -369,13 +369,13 @@ xfs_bmbt_init_rec_from_cur(
xfs_bmbt_disk_set_all(&rec->bmbt, &cur->bc_rec.b);
}
STATIC int64_t
STATIC int
xfs_bmbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
{
return (int64_t)be64_to_cpu(key->bmbt.br_startoff) -
cur->bc_rec.b.br_startoff;
return cmp_int(be64_to_cpu(key->bmbt.br_startoff),
cur->bc_rec.b.br_startoff);
}
STATIC int

View File

@ -175,7 +175,7 @@ struct xfs_btree_ops {
* Compare key value and cursor value -- positive if key > cur,
* negative if key < cur, and zero if equal.
*/
int64_t (*cmp_key_with_cur)(struct xfs_btree_cur *cur,
int (*cmp_key_with_cur)(struct xfs_btree_cur *cur,
const union xfs_btree_key *key);
/*

View File

@ -265,13 +265,13 @@ xfs_finobt_init_ptr_from_cur(
ptr->s = agi->agi_free_root;
}
STATIC int64_t
STATIC int
xfs_inobt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
{
return (int64_t)be32_to_cpu(key->inobt.ir_startino) -
cur->bc_rec.i.ir_startino;
return cmp_int(be32_to_cpu(key->inobt.ir_startino),
cur->bc_rec.i.ir_startino);
}
STATIC int

View File

@ -174,7 +174,7 @@ xfs_refcountbt_init_ptr_from_cur(
ptr->s = agf->agf_refcount_root;
}
STATIC int64_t
STATIC int
xfs_refcountbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
@ -185,7 +185,7 @@ xfs_refcountbt_cmp_key_with_cur(
start = xfs_refcount_encode_startblock(irec->rc_startblock,
irec->rc_domain);
return (int64_t)be32_to_cpu(kp->rc_startblock) - start;
return cmp_int(be32_to_cpu(kp->rc_startblock), start);
}
STATIC int

View File

@ -243,34 +243,18 @@ static inline uint64_t offset_keymask(uint64_t offset)
return offset & ~XFS_RMAP_OFF_UNWRITTEN;
}
STATIC int64_t
STATIC int
xfs_rmapbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
{
struct xfs_rmap_irec *rec = &cur->bc_rec.r;
const struct xfs_rmap_key *kp = &key->rmap;
__u64 x, y;
int64_t d;
d = (int64_t)be32_to_cpu(kp->rm_startblock) - rec->rm_startblock;
if (d)
return d;
x = be64_to_cpu(kp->rm_owner);
y = rec->rm_owner;
if (x > y)
return 1;
else if (y > x)
return -1;
x = offset_keymask(be64_to_cpu(kp->rm_offset));
y = offset_keymask(xfs_rmap_irec_offset_pack(rec));
if (x > y)
return 1;
else if (y > x)
return -1;
return 0;
return cmp_int(be32_to_cpu(kp->rm_startblock), rec->rm_startblock) ?:
cmp_int(be64_to_cpu(kp->rm_owner), rec->rm_owner) ?:
cmp_int(offset_keymask(be64_to_cpu(kp->rm_offset)),
offset_keymask(xfs_rmap_irec_offset_pack(rec)));
}
STATIC int

View File

@ -156,7 +156,7 @@ xfs_rtrefcountbt_init_ptr_from_cur(
ptr->l = 0;
}
STATIC int64_t
STATIC int
xfs_rtrefcountbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
@ -167,7 +167,7 @@ xfs_rtrefcountbt_cmp_key_with_cur(
start = xfs_refcount_encode_startblock(irec->rc_startblock,
irec->rc_domain);
return (int64_t)be32_to_cpu(kp->rc_startblock) - start;
return cmp_int(be32_to_cpu(kp->rc_startblock), start);
}
STATIC int

View File

@ -185,34 +185,18 @@ static inline uint64_t offset_keymask(uint64_t offset)
return offset & ~XFS_RMAP_OFF_UNWRITTEN;
}
STATIC int64_t
STATIC int
xfs_rtrmapbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
{
struct xfs_rmap_irec *rec = &cur->bc_rec.r;
const struct xfs_rmap_key *kp = &key->rmap;
__u64 x, y;
int64_t d;
d = (int64_t)be32_to_cpu(kp->rm_startblock) - rec->rm_startblock;
if (d)
return d;
x = be64_to_cpu(kp->rm_owner);
y = rec->rm_owner;
if (x > y)
return 1;
else if (y > x)
return -1;
x = offset_keymask(be64_to_cpu(kp->rm_offset));
y = offset_keymask(xfs_rmap_irec_offset_pack(rec));
if (x > y)
return 1;
else if (y > x)
return -1;
return 0;
return cmp_int(be32_to_cpu(kp->rm_startblock), rec->rm_startblock) ?:
cmp_int(be64_to_cpu(kp->rm_owner), rec->rm_owner) ?:
cmp_int(offset_keymask(be64_to_cpu(kp->rm_offset)),
offset_keymask(xfs_rmap_irec_offset_pack(rec)));
}
STATIC int

View File

@ -47,7 +47,7 @@ rcbagbt_init_rec_from_cur(
bag_rec->rbg_refcount = bag_irec->rbg_refcount;
}
STATIC int64_t
STATIC int
rcbagbt_cmp_key_with_cur(
struct xfs_btree_cur *cur,
const union xfs_btree_key *key)
@ -55,17 +55,8 @@ rcbagbt_cmp_key_with_cur(
struct rcbag_rec *rec = (struct rcbag_rec *)&cur->bc_rec;
const struct rcbag_key *kp = (const struct rcbag_key *)key;
if (kp->rbg_startblock > rec->rbg_startblock)
return 1;
if (kp->rbg_startblock < rec->rbg_startblock)
return -1;
if (kp->rbg_blockcount > rec->rbg_blockcount)
return 1;
if (kp->rbg_blockcount < rec->rbg_blockcount)
return -1;
return 0;
return cmp_int(kp->rbg_startblock, rec->rbg_startblock) ?:
cmp_int(kp->rbg_blockcount, rec->rbg_blockcount);
}
STATIC int