[XFS] superblock endianess annotations
Creates a new xfs_dsb_t that is __be annotated and keeps xfs_sb_t for the incore one. xfs_xlatesb is renamed to xfs_sb_to_disk and only handles the incore -> disk conversion. A new helper xfs_sb_from_disk handles the other direction and doesn't need the slightly hacky table-driven approach because we only ever read the full sb from disk. The handling of shared r/o filesystems has been buggy on little endian system and fixing this required shuffling around of some code in that area. SGI-PV: 968563 SGI-Modid: xfs-linux-melb:xfs-kern:29477a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
This commit is contained in:
committed by
Tim Shimmin
parent
347d1c0195
commit
2bdf7cd0ba
@ -87,8 +87,10 @@ struct xfs_mount;
|
||||
(XFS_SB_VERSION2_OKREALFBITS | \
|
||||
XFS_SB_VERSION2_OKSASHFBITS )
|
||||
|
||||
typedef struct xfs_sb
|
||||
{
|
||||
/*
|
||||
* Superblock - in core version. Must match the ondisk version below.
|
||||
*/
|
||||
typedef struct xfs_sb {
|
||||
__uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
||||
__uint32_t sb_blocksize; /* logical block size, bytes */
|
||||
xfs_drfsbno_t sb_dblocks; /* number of data blocks */
|
||||
@ -145,6 +147,66 @@ typedef struct xfs_sb
|
||||
__uint32_t sb_features2; /* additional feature bits */
|
||||
} xfs_sb_t;
|
||||
|
||||
/*
|
||||
* Superblock - on disk version. Must match the in core version below.
|
||||
*/
|
||||
typedef struct xfs_dsb {
|
||||
__be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
||||
__be32 sb_blocksize; /* logical block size, bytes */
|
||||
__be64 sb_dblocks; /* number of data blocks */
|
||||
__be64 sb_rblocks; /* number of realtime blocks */
|
||||
__be64 sb_rextents; /* number of realtime extents */
|
||||
uuid_t sb_uuid; /* file system unique id */
|
||||
__be64 sb_logstart; /* starting block of log if internal */
|
||||
__be64 sb_rootino; /* root inode number */
|
||||
__be64 sb_rbmino; /* bitmap inode for realtime extents */
|
||||
__be64 sb_rsumino; /* summary inode for rt bitmap */
|
||||
__be32 sb_rextsize; /* realtime extent size, blocks */
|
||||
__be32 sb_agblocks; /* size of an allocation group */
|
||||
__be32 sb_agcount; /* number of allocation groups */
|
||||
__be32 sb_rbmblocks; /* number of rt bitmap blocks */
|
||||
__be32 sb_logblocks; /* number of log blocks */
|
||||
__be16 sb_versionnum; /* header version == XFS_SB_VERSION */
|
||||
__be16 sb_sectsize; /* volume sector size, bytes */
|
||||
__be16 sb_inodesize; /* inode size, bytes */
|
||||
__be16 sb_inopblock; /* inodes per block */
|
||||
char sb_fname[12]; /* file system name */
|
||||
__u8 sb_blocklog; /* log2 of sb_blocksize */
|
||||
__u8 sb_sectlog; /* log2 of sb_sectsize */
|
||||
__u8 sb_inodelog; /* log2 of sb_inodesize */
|
||||
__u8 sb_inopblog; /* log2 of sb_inopblock */
|
||||
__u8 sb_agblklog; /* log2 of sb_agblocks (rounded up) */
|
||||
__u8 sb_rextslog; /* log2 of sb_rextents */
|
||||
__u8 sb_inprogress; /* mkfs is in progress, don't mount */
|
||||
__u8 sb_imax_pct; /* max % of fs for inode space */
|
||||
/* statistics */
|
||||
/*
|
||||
* These fields must remain contiguous. If you really
|
||||
* want to change their layout, make sure you fix the
|
||||
* code in xfs_trans_apply_sb_deltas().
|
||||
*/
|
||||
__be64 sb_icount; /* allocated inodes */
|
||||
__be64 sb_ifree; /* free inodes */
|
||||
__be64 sb_fdblocks; /* free data blocks */
|
||||
__be64 sb_frextents; /* free realtime extents */
|
||||
/*
|
||||
* End contiguous fields.
|
||||
*/
|
||||
__be64 sb_uquotino; /* user quota inode */
|
||||
__be64 sb_gquotino; /* group quota inode */
|
||||
__be16 sb_qflags; /* quota flags */
|
||||
__u8 sb_flags; /* misc. flags */
|
||||
__u8 sb_shared_vn; /* shared version number */
|
||||
__be32 sb_inoalignmt; /* inode chunk alignment, fsblocks */
|
||||
__be32 sb_unit; /* stripe or raid unit */
|
||||
__be32 sb_width; /* stripe or raid width */
|
||||
__u8 sb_dirblklog; /* log2 of dir block size (fsbs) */
|
||||
__u8 sb_logsectlog; /* log2 of the log sector size */
|
||||
__be16 sb_logsectsize; /* sector size for the log, bytes */
|
||||
__be32 sb_logsunit; /* stripe unit size for the log */
|
||||
__be32 sb_features2; /* additional feature bits */
|
||||
} xfs_dsb_t;
|
||||
|
||||
/*
|
||||
* Sequence number values for the fields.
|
||||
*/
|
||||
@ -446,7 +508,7 @@ static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp)
|
||||
|
||||
#define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */
|
||||
#define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR)
|
||||
#define XFS_BUF_TO_SBP(bp) ((xfs_sb_t *)XFS_BUF_PTR(bp))
|
||||
#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)XFS_BUF_PTR(bp))
|
||||
|
||||
#define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d))
|
||||
#define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \
|
||||
|
Reference in New Issue
Block a user