Commit f6371617 authored by Dave Chinner's avatar Dave Chinner

Merge branch 'xfs-4.8-misc-fixes-3' into for-next

parents f477cedc ad70328a
...@@ -543,12 +543,12 @@ xfs_btree_ptr_addr( ...@@ -543,12 +543,12 @@ xfs_btree_ptr_addr(
*/ */
STATIC struct xfs_btree_block * STATIC struct xfs_btree_block *
xfs_btree_get_iroot( xfs_btree_get_iroot(
struct xfs_btree_cur *cur) struct xfs_btree_cur *cur)
{ {
struct xfs_ifork *ifp; struct xfs_ifork *ifp;
ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, cur->bc_private.b.whichfork); ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, cur->bc_private.b.whichfork);
return (struct xfs_btree_block *)ifp->if_broot; return (struct xfs_btree_block *)ifp->if_broot;
} }
/* /*
......
...@@ -1435,41 +1435,57 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; ...@@ -1435,41 +1435,57 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
* with the crc feature bit, and all accesses to them must be conditional on * with the crc feature bit, and all accesses to them must be conditional on
* that flag. * that flag.
*/ */
/* short form block header */
struct xfs_btree_block_shdr {
__be32 bb_leftsib;
__be32 bb_rightsib;
__be64 bb_blkno;
__be64 bb_lsn;
uuid_t bb_uuid;
__be32 bb_owner;
__le32 bb_crc;
};
/* long form block header */
struct xfs_btree_block_lhdr {
__be64 bb_leftsib;
__be64 bb_rightsib;
__be64 bb_blkno;
__be64 bb_lsn;
uuid_t bb_uuid;
__be64 bb_owner;
__le32 bb_crc;
__be32 bb_pad; /* padding for alignment */
};
struct xfs_btree_block { struct xfs_btree_block {
__be32 bb_magic; /* magic number for block type */ __be32 bb_magic; /* magic number for block type */
__be16 bb_level; /* 0 is a leaf */ __be16 bb_level; /* 0 is a leaf */
__be16 bb_numrecs; /* current # of data records */ __be16 bb_numrecs; /* current # of data records */
union { union {
struct { struct xfs_btree_block_shdr s;
__be32 bb_leftsib; struct xfs_btree_block_lhdr l;
__be32 bb_rightsib;
__be64 bb_blkno;
__be64 bb_lsn;
uuid_t bb_uuid;
__be32 bb_owner;
__le32 bb_crc;
} s; /* short form pointers */
struct {
__be64 bb_leftsib;
__be64 bb_rightsib;
__be64 bb_blkno;
__be64 bb_lsn;
uuid_t bb_uuid;
__be64 bb_owner;
__le32 bb_crc;
__be32 bb_pad; /* padding for alignment */
} l; /* long form pointers */
} bb_u; /* rest */ } bb_u; /* rest */
}; };
#define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ /* size of a short form block */
#define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ #define XFS_BTREE_SBLOCK_LEN \
(offsetof(struct xfs_btree_block, bb_u) + \
offsetof(struct xfs_btree_block_shdr, bb_blkno))
/* size of a long form block */
#define XFS_BTREE_LBLOCK_LEN \
(offsetof(struct xfs_btree_block, bb_u) + \
offsetof(struct xfs_btree_block_lhdr, bb_blkno))
/* sizes of CRC enabled btree blocks */ /* sizes of CRC enabled btree blocks */
#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) #define XFS_BTREE_SBLOCK_CRC_LEN \
#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) (offsetof(struct xfs_btree_block, bb_u) + \
sizeof(struct xfs_btree_block_shdr))
#define XFS_BTREE_LBLOCK_CRC_LEN \
(offsetof(struct xfs_btree_block, bb_u) + \
sizeof(struct xfs_btree_block_lhdr))
#define XFS_BTREE_SBLOCK_CRC_OFF \ #define XFS_BTREE_SBLOCK_CRC_OFF \
offsetof(struct xfs_btree_block, bb_u.s.bb_crc) offsetof(struct xfs_btree_block, bb_u.s.bb_crc)
......
...@@ -55,7 +55,7 @@ xfs_error_test(int error_tag, int *fsidp, char *expression, ...@@ -55,7 +55,7 @@ xfs_error_test(int error_tag, int *fsidp, char *expression,
} }
int int
xfs_errortag_add(int error_tag, xfs_mount_t *mp) xfs_errortag_add(unsigned int error_tag, xfs_mount_t *mp)
{ {
int i; int i;
int len; int len;
......
...@@ -128,7 +128,7 @@ extern int xfs_error_test(int, int *, char *, int, char *, unsigned long); ...@@ -128,7 +128,7 @@ extern int xfs_error_test(int, int *, char *, int, char *, unsigned long);
xfs_error_test((tag), (mp)->m_fixedfsid, "expr", __LINE__, __FILE__, \ xfs_error_test((tag), (mp)->m_fixedfsid, "expr", __LINE__, __FILE__, \
(rf)))) (rf))))
extern int xfs_errortag_add(int error_tag, struct xfs_mount *mp); extern int xfs_errortag_add(unsigned int error_tag, struct xfs_mount *mp);
extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud); extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud);
#else #else
#define XFS_TEST_ERROR(expr, mp, tag, rf) (expr) #define XFS_TEST_ERROR(expr, mp, tag, rf) (expr)
......
...@@ -1575,6 +1575,17 @@ xfs_ioc_swapext( ...@@ -1575,6 +1575,17 @@ xfs_ioc_swapext(
goto out_put_tmp_file; goto out_put_tmp_file;
} }
/*
* We need to ensure that the fds passed in point to XFS inodes
* before we cast and access them as XFS structures as we have no
* control over what the user passes us here.
*/
if (f.file->f_op != &xfs_file_operations ||
tmp.file->f_op != &xfs_file_operations) {
error = -EINVAL;
goto out_put_tmp_file;
}
ip = XFS_I(file_inode(f.file)); ip = XFS_I(file_inode(f.file));
tip = XFS_I(file_inode(tmp.file)); tip = XFS_I(file_inode(tmp.file));
......
...@@ -39,6 +39,8 @@ xfs_check_ondisk_structs(void) ...@@ -39,6 +39,8 @@ xfs_check_ondisk_structs(void)
XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key, 8); XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_key, 8);
XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec, 16); XFS_CHECK_STRUCT_SIZE(struct xfs_bmbt_rec, 16);
XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block, 4); XFS_CHECK_STRUCT_SIZE(struct xfs_bmdr_block, 4);
XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block_shdr, 48);
XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block_lhdr, 64);
XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block, 72); XFS_CHECK_STRUCT_SIZE(struct xfs_btree_block, 72);
XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176); XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176);
XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104); XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment