xfs: buffer type overruns blf_flags field
The buffer type passed to log recvoery in the buffer log item overruns the blf_flags field. I had assumed that flags field was a 32 bit value, and it turns out it is a unisgned short. Therefore having 19 flags doesn't really work. Convert the buffer type field to numeric value, and use the top 5 bits of the flags field for it. We currently have 17 types of buffers, so using 5 bits gives us plenty of room for expansion in future.... Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
@@ -276,7 +276,7 @@ xfs_attr3_leaf_read(
|
||||
err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp,
|
||||
XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops);
|
||||
if (!err && tp)
|
||||
xfs_trans_buf_set_type(tp, *bpp, XFS_BLF_ATTR_LEAF_BUF);
|
||||
xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_ATTR_LEAF_BUF);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1083,7 +1083,7 @@ xfs_attr3_leaf_to_node(
|
||||
goto out;
|
||||
|
||||
/* copy leaf to new buffer, update identifiers */
|
||||
xfs_trans_buf_set_type(args->trans, bp2, XFS_BLF_ATTR_LEAF_BUF);
|
||||
xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF);
|
||||
bp2->b_ops = bp1->b_ops;
|
||||
memcpy(bp2->b_addr, bp1->b_addr, XFS_LBSIZE(mp));
|
||||
if (xfs_sb_version_hascrc(&mp->m_sb)) {
|
||||
@@ -1146,7 +1146,7 @@ xfs_attr3_leaf_create(
|
||||
if (error)
|
||||
return error;
|
||||
bp->b_ops = &xfs_attr3_leaf_buf_ops;
|
||||
xfs_trans_buf_set_type(args->trans, bp, XFS_BLF_ATTR_LEAF_BUF);
|
||||
xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF);
|
||||
leaf = bp->b_addr;
|
||||
memset(leaf, 0, XFS_LBSIZE(mp));
|
||||
|
||||
|
Reference in New Issue
Block a user