2013-08-12 20:49:26 +10:00
/*
* Copyright ( c ) 2000 - 2005 Silicon Graphics , Inc .
* All Rights Reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it would be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# ifndef __XFS_FORMAT_H__
# define __XFS_FORMAT_H__
/*
* XFS On Disk Format Definitions
*
* This header file defines all the on - disk format definitions for
* general XFS objects . Directory and attribute related objects are defined in
* xfs_da_format . h , which log and log item formats are defined in
* xfs_log_format . h . Everything else goes here .
*/
2013-08-12 20:49:40 +10:00
struct xfs_mount ;
struct xfs_trans ;
struct xfs_inode ;
struct xfs_buf ;
struct xfs_ifork ;
2013-08-12 20:49:29 +10:00
/*
* RealTime Device format definitions
*/
/* Min and max rt extent sizes, specified in bytes */
# define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */
# define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */
# define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */
# define XFS_BLOCKSIZE(mp) ((mp)->m_sb.sb_blocksize)
# define XFS_BLOCKMASK(mp) ((mp)->m_blockmask)
# define XFS_BLOCKWSIZE(mp) ((mp)->m_blockwsize)
# define XFS_BLOCKWMASK(mp) ((mp)->m_blockwmask)
/*
* RT Summary and bit manipulation macros .
*/
# define XFS_SUMOFFS(mp,ls,bb) ((int)((ls) * (mp)->m_sb.sb_rbmblocks + (bb)))
# define XFS_SUMOFFSTOBLOCK(mp,s) \
( ( ( s ) * ( uint ) sizeof ( xfs_suminfo_t ) ) > > ( mp ) - > m_sb . sb_blocklog )
# define XFS_SUMPTR(mp,bp,so) \
( ( xfs_suminfo_t * ) ( ( bp ) - > b_addr + \
( ( ( so ) * ( uint ) sizeof ( xfs_suminfo_t ) ) & XFS_BLOCKMASK ( mp ) ) ) )
# define XFS_BITTOBLOCK(mp,bi) ((bi) >> (mp)->m_blkbit_log)
# define XFS_BLOCKTOBIT(mp,bb) ((bb) << (mp)->m_blkbit_log)
# define XFS_BITTOWORD(mp,bi) \
( ( int ) ( ( ( bi ) > > XFS_NBWORDLOG ) & XFS_BLOCKWMASK ( mp ) ) )
# define XFS_RTMIN(a,b) ((a) < (b) ? (a) : (b))
# define XFS_RTMAX(a,b) ((a) > (b) ? (a) : (b))
# define XFS_RTLOBIT(w) xfs_lowbit32(w)
# define XFS_RTHIBIT(w) xfs_highbit32(w)
# if XFS_BIG_BLKNOS
# define XFS_RTBLOCKLOG(b) xfs_highbit64(b)
# else
# define XFS_RTBLOCKLOG(b) xfs_highbit32(b)
# endif
2013-08-12 20:49:26 +10:00
/*
* Dquot and dquot block format definitions
*/
# define XFS_DQUOT_MAGIC 0x4451 /* 'DQ' */
# define XFS_DQUOT_VERSION (u_int8_t)0x01 /* latest version number */
/*
* This is the main portion of the on - disk representation of quota
* information for a user . This is the q_core of the xfs_dquot_t that
* is kept in kernel memory . We pad this with some more expansion room
* to construct the on disk structure .
*/
typedef struct xfs_disk_dquot {
__be16 d_magic ; /* dquot magic = XFS_DQUOT_MAGIC */
__u8 d_version ; /* dquot version */
__u8 d_flags ; /* XFS_DQ_USER/PROJ/GROUP */
__be32 d_id ; /* user,project,group id */
__be64 d_blk_hardlimit ; /* absolute limit on disk blks */
__be64 d_blk_softlimit ; /* preferred limit on disk blks */
__be64 d_ino_hardlimit ; /* maximum # allocated inodes */
__be64 d_ino_softlimit ; /* preferred inode limit */
__be64 d_bcount ; /* disk blocks owned by the user */
__be64 d_icount ; /* inodes owned by the user */
__be32 d_itimer ; /* zero if within inode limits if not,
this is when we refuse service */
__be32 d_btimer ; /* similar to above; for disk blocks */
__be16 d_iwarns ; /* warnings issued wrt num inodes */
__be16 d_bwarns ; /* warnings issued wrt disk blocks */
__be32 d_pad0 ; /* 64 bit align */
__be64 d_rtb_hardlimit ; /* absolute limit on realtime blks */
__be64 d_rtb_softlimit ; /* preferred limit on RT disk blks */
__be64 d_rtbcount ; /* realtime blocks owned */
__be32 d_rtbtimer ; /* similar to above; for RT disk blocks */
__be16 d_rtbwarns ; /* warnings issued wrt RT disk blocks */
__be16 d_pad ;
} xfs_disk_dquot_t ;
/*
* This is what goes on disk . This is separated from the xfs_disk_dquot because
* carrying the unnecessary padding would be a waste of memory .
*/
typedef struct xfs_dqblk {
xfs_disk_dquot_t dd_diskdq ; /* portion that lives incore as well */
char dd_fill [ 4 ] ; /* filling for posterity */
/*
* These two are only present on filesystems with the CRC bits set .
*/
__be32 dd_crc ; /* checksum */
__be64 dd_lsn ; /* last modification in log */
uuid_t dd_uuid ; /* location information */
} xfs_dqblk_t ;
# define XFS_DQUOT_CRC_OFF offsetof(struct xfs_dqblk, dd_crc)
2013-08-12 20:49:40 +10:00
/*
* Remote symlink format and access functions .
*/
# define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */
struct xfs_dsymlink_hdr {
__be32 sl_magic ;
__be32 sl_offset ;
__be32 sl_bytes ;
__be32 sl_crc ;
uuid_t sl_uuid ;
__be64 sl_owner ;
__be64 sl_blkno ;
__be64 sl_lsn ;
} ;
/*
* The maximum pathlen is 1024 bytes . Since the minimum file system
* blocksize is 512 bytes , we can get a max of 3 extents back from
* bmapi when crc headers are taken into account .
*/
# define XFS_SYMLINK_MAPS 3
# define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \
( ( bufsize ) - ( xfs_sb_version_hascrc ( & ( mp ) - > m_sb ) ? \
sizeof ( struct xfs_dsymlink_hdr ) : 0 ) )
int xfs_symlink_blocks ( struct xfs_mount * mp , int pathlen ) ;
int xfs_symlink_hdr_set ( struct xfs_mount * mp , xfs_ino_t ino , uint32_t offset ,
uint32_t size , struct xfs_buf * bp ) ;
bool xfs_symlink_hdr_ok ( struct xfs_mount * mp , xfs_ino_t ino , uint32_t offset ,
uint32_t size , struct xfs_buf * bp ) ;
void xfs_symlink_local_to_remote ( struct xfs_trans * tp , struct xfs_buf * bp ,
struct xfs_inode * ip , struct xfs_ifork * ifp ) ;
extern const struct xfs_buf_ops xfs_symlink_buf_ops ;
2013-08-12 20:49:26 +10:00
# endif /* __XFS_FORMAT_H__ */