Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xfs: fix xfs_buf magic number endian checks

Create a separate magic16 check function so that we don't run afoul of
static checkers.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>

+45 -23
+2 -2
fs/xfs/libxfs/xfs_attr_leaf.c
··· 358 358 359 359 const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = { 360 360 .name = "xfs_attr3_leaf", 361 - .magic = { cpu_to_be16(XFS_ATTR_LEAF_MAGIC), 362 - cpu_to_be16(XFS_ATTR3_LEAF_MAGIC) }, 361 + .magic16 = { cpu_to_be16(XFS_ATTR_LEAF_MAGIC), 362 + cpu_to_be16(XFS_ATTR3_LEAF_MAGIC) }, 363 363 .verify_read = xfs_attr3_leaf_read_verify, 364 364 .verify_write = xfs_attr3_leaf_write_verify, 365 365 .verify_struct = xfs_attr3_leaf_verify,
+4 -4
fs/xfs/libxfs/xfs_da_btree.c
··· 129 129 struct xfs_mount *mp = bp->b_target->bt_mount; 130 130 struct xfs_da_blkinfo *hdr = &hdr3->hdr; 131 131 132 - if (!xfs_verify_magic(bp, hdr->magic)) 132 + if (!xfs_verify_magic16(bp, hdr->magic)) 133 133 return __this_address; 134 134 135 135 if (xfs_sb_version_hascrc(&mp->m_sb)) { ··· 141 141 return __this_address; 142 142 } 143 143 144 - return 0; 144 + return NULL; 145 145 } 146 146 147 147 static xfs_failaddr_t ··· 274 274 275 275 const struct xfs_buf_ops xfs_da3_node_buf_ops = { 276 276 .name = "xfs_da3_node", 277 - .magic = { cpu_to_be16(XFS_DA_NODE_MAGIC), 278 - cpu_to_be16(XFS_DA3_NODE_MAGIC) }, 277 + .magic16 = { cpu_to_be16(XFS_DA_NODE_MAGIC), 278 + cpu_to_be16(XFS_DA3_NODE_MAGIC) }, 279 279 .verify_read = xfs_da3_node_read_verify, 280 280 .verify_write = xfs_da3_node_write_verify, 281 281 .verify_struct = xfs_da3_node_verify_struct,
+4 -4
fs/xfs/libxfs/xfs_dir2_leaf.c
··· 198 198 199 199 const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops = { 200 200 .name = "xfs_dir3_leaf1", 201 - .magic = { cpu_to_be16(XFS_DIR2_LEAF1_MAGIC), 202 - cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) }, 201 + .magic16 = { cpu_to_be16(XFS_DIR2_LEAF1_MAGIC), 202 + cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) }, 203 203 .verify_read = xfs_dir3_leaf_read_verify, 204 204 .verify_write = xfs_dir3_leaf_write_verify, 205 205 .verify_struct = xfs_dir3_leaf_verify, ··· 207 207 208 208 const struct xfs_buf_ops xfs_dir3_leafn_buf_ops = { 209 209 .name = "xfs_dir3_leafn", 210 - .magic = { cpu_to_be16(XFS_DIR2_LEAFN_MAGIC), 211 - cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) }, 210 + .magic16 = { cpu_to_be16(XFS_DIR2_LEAFN_MAGIC), 211 + cpu_to_be16(XFS_DIR3_LEAFN_MAGIC) }, 212 212 .verify_read = xfs_dir3_leaf_read_verify, 213 213 .verify_write = xfs_dir3_leaf_write_verify, 214 214 .verify_struct = xfs_dir3_leaf_verify,
+4 -4
fs/xfs/libxfs/xfs_dquot_buf.c
··· 277 277 278 278 const struct xfs_buf_ops xfs_dquot_buf_ops = { 279 279 .name = "xfs_dquot", 280 - .magic = { cpu_to_be16(XFS_DQUOT_MAGIC), 281 - cpu_to_be16(XFS_DQUOT_MAGIC) }, 280 + .magic16 = { cpu_to_be16(XFS_DQUOT_MAGIC), 281 + cpu_to_be16(XFS_DQUOT_MAGIC) }, 282 282 .verify_read = xfs_dquot_buf_read_verify, 283 283 .verify_write = xfs_dquot_buf_write_verify, 284 284 .verify_struct = xfs_dquot_buf_verify_struct, ··· 286 286 287 287 const struct xfs_buf_ops xfs_dquot_buf_ra_ops = { 288 288 .name = "xfs_dquot_ra", 289 - .magic = { cpu_to_be16(XFS_DQUOT_MAGIC), 290 - cpu_to_be16(XFS_DQUOT_MAGIC) }, 289 + .magic16 = { cpu_to_be16(XFS_DQUOT_MAGIC), 290 + cpu_to_be16(XFS_DQUOT_MAGIC) }, 291 291 .verify_read = xfs_dquot_buf_readahead_verify, 292 292 .verify_write = xfs_dquot_buf_write_verify, 293 293 };
+5 -5
fs/xfs/libxfs/xfs_inode_buf.c
··· 97 97 98 98 dip = xfs_buf_offset(bp, (i << mp->m_sb.sb_inodelog)); 99 99 unlinked_ino = be32_to_cpu(dip->di_next_unlinked); 100 - di_ok = xfs_verify_magic(bp, dip->di_magic) && 100 + di_ok = xfs_verify_magic16(bp, dip->di_magic) && 101 101 xfs_dinode_good_version(mp, dip->di_version) && 102 102 xfs_verify_agino_or_null(mp, agno, unlinked_ino); 103 103 if (unlikely(XFS_TEST_ERROR(!di_ok, mp, ··· 146 146 147 147 const struct xfs_buf_ops xfs_inode_buf_ops = { 148 148 .name = "xfs_inode", 149 - .magic = { cpu_to_be16(XFS_DINODE_MAGIC), 150 - cpu_to_be16(XFS_DINODE_MAGIC) }, 149 + .magic16 = { cpu_to_be16(XFS_DINODE_MAGIC), 150 + cpu_to_be16(XFS_DINODE_MAGIC) }, 151 151 .verify_read = xfs_inode_buf_read_verify, 152 152 .verify_write = xfs_inode_buf_write_verify, 153 153 }; 154 154 155 155 const struct xfs_buf_ops xfs_inode_buf_ra_ops = { 156 156 .name = "xfs_inode_ra", 157 - .magic = { cpu_to_be16(XFS_DINODE_MAGIC), 158 - cpu_to_be16(XFS_DINODE_MAGIC) }, 157 + .magic16 = { cpu_to_be16(XFS_DINODE_MAGIC), 158 + cpu_to_be16(XFS_DINODE_MAGIC) }, 159 159 .verify_read = xfs_inode_buf_readahead_verify, 160 160 .verify_write = xfs_inode_buf_write_verify, 161 161 };
+19 -1
fs/xfs/xfs_buf.c
··· 2213 2213 bool 2214 2214 xfs_verify_magic( 2215 2215 struct xfs_buf *bp, 2216 - uint32_t dmagic) 2216 + __be32 dmagic) 2217 2217 { 2218 2218 struct xfs_mount *mp = bp->b_target->bt_mount; 2219 2219 int idx; ··· 2222 2222 if (unlikely(WARN_ON(!bp->b_ops || !bp->b_ops->magic[idx]))) 2223 2223 return false; 2224 2224 return dmagic == bp->b_ops->magic[idx]; 2225 + } 2226 + /* 2227 + * Verify an on-disk magic value against the magic value specified in the 2228 + * verifier structure. The verifier magic is in disk byte order so the caller is 2229 + * expected to pass the value directly from disk. 2230 + */ 2231 + bool 2232 + xfs_verify_magic16( 2233 + struct xfs_buf *bp, 2234 + __be16 dmagic) 2235 + { 2236 + struct xfs_mount *mp = bp->b_target->bt_mount; 2237 + int idx; 2238 + 2239 + idx = xfs_sb_version_hascrc(&mp->m_sb); 2240 + if (unlikely(WARN_ON(!bp->b_ops || !bp->b_ops->magic16[idx]))) 2241 + return false; 2242 + return dmagic == bp->b_ops->magic16[idx]; 2225 2243 }
+6 -2
fs/xfs/xfs_buf.h
··· 125 125 126 126 struct xfs_buf_ops { 127 127 char *name; 128 - uint32_t magic[2]; /* v4 and v5 on disk magic values */ 128 + union { 129 + __be32 magic[2]; /* v4 and v5 on disk magic values */ 130 + __be16 magic16[2]; /* v4 and v5 on disk magic values */ 131 + }; 129 132 void (*verify_read)(struct xfs_buf *); 130 133 void (*verify_write)(struct xfs_buf *); 131 134 xfs_failaddr_t (*verify_struct)(struct xfs_buf *bp); ··· 390 387 #define xfs_readonly_buftarg(buftarg) bdev_read_only((buftarg)->bt_bdev) 391 388 392 389 int xfs_buf_reverify(struct xfs_buf *bp, const struct xfs_buf_ops *ops); 393 - bool xfs_verify_magic(struct xfs_buf *bp, uint32_t dmagic); 390 + bool xfs_verify_magic(struct xfs_buf *bp, __be32 dmagic); 391 + bool xfs_verify_magic16(struct xfs_buf *bp, __be16 dmagic); 394 392 395 393 #endif /* __XFS_BUF_H__ */
+1 -1
fs/xfs/xfs_log_recover.c
··· 3049 3049 * Make sure the place we're flushing out to really looks 3050 3050 * like an inode! 3051 3051 */ 3052 - if (unlikely(!xfs_verify_magic(bp, dip->di_magic))) { 3052 + if (unlikely(!xfs_verify_magic16(bp, dip->di_magic))) { 3053 3053 xfs_alert(mp, 3054 3054 "%s: Bad inode magic number, dip = "PTR_FMT", dino bp = "PTR_FMT", ino = %Ld", 3055 3055 __func__, dip, bp, in_f->ilf_ino);