On 07/19/2013 02:24 AM, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > Th elog item format definitions are shared with userspace. split the > out of header files that contain kernel only defintions to make it > simple to shared them. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_acl.c | 1 + > fs/xfs/xfs_filestream.c | 2 +- > fs/xfs/xfs_inode.h | 69 ------------------ > fs/xfs/xfs_inode_item.h | 115 +---------------------------- > fs/xfs/xfs_log_format.h | 189 ++++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_types.h | 6 ++ > fs/xfs/xfs_xattr.c | 1 + > 7 files changed, 200 insertions(+), 183 deletions(-) > > diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c > index 306d883..695606a 100644 > --- a/fs/xfs/xfs_acl.c > +++ b/fs/xfs/xfs_acl.c > @@ -16,6 +16,7 @@ > * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > */ > #include "xfs.h" > +#include "xfs_log_format.h" > #include "xfs_acl.h" > #include "xfs_attr.h" > #include "xfs_bmap_btree.h" > diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c > index 5170306..9eae097 100644 > --- a/fs/xfs/xfs_filestream.c > +++ b/fs/xfs/xfs_filestream.c > @@ -16,12 +16,12 @@ > * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > */ > #include "xfs.h" > +#include "xfs_log.h" > #include "xfs_bmap_btree.h" > #include "xfs_inum.h" > #include "xfs_dinode.h" > #include "xfs_inode.h" > #include "xfs_ag.h" > -#include "xfs_log.h" > #include "xfs_trans.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index b55fd34..de4f963 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -23,12 +23,6 @@ struct xfs_dinode; > struct xfs_inode; > > /* > - * Fork identifiers. > - */ > -#define XFS_DATA_FORK 0 > -#define XFS_ATTR_FORK 1 > - > -/* > * The following xfs_ext_irec_t struct introduces a second (top) level > * to the in-core extent allocation scheme. These structs are allocated > * in a contiguous block, creating an indirection array where each entry > @@ -114,68 +108,6 @@ struct xfs_imap { > * chain off the mount structure by xfs_sync calls. > */ > > -typedef struct xfs_ictimestamp { > - __int32_t t_sec; /* timestamp seconds */ > - __int32_t t_nsec; /* timestamp nanoseconds */ > -} xfs_ictimestamp_t; > - > -/* > - * NOTE: This structure must be kept identical to struct xfs_dinode > - * in xfs_dinode.h except for the endianness annotations. > - */ > -typedef struct xfs_icdinode { > - __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ > - __uint16_t di_mode; /* mode and type of file */ > - __int8_t di_version; /* inode version */ > - __int8_t di_format; /* format of di_c data */ > - __uint16_t di_onlink; /* old number of links to file */ > - __uint32_t di_uid; /* owner's user id */ > - __uint32_t di_gid; /* owner's group id */ > - __uint32_t di_nlink; /* number of links to file */ > - __uint16_t di_projid_lo; /* lower part of owner's project id */ > - __uint16_t di_projid_hi; /* higher part of owner's project id */ > - __uint8_t di_pad[6]; /* unused, zeroed space */ > - __uint16_t di_flushiter; /* incremented on flush */ > - xfs_ictimestamp_t di_atime; /* time last accessed */ > - xfs_ictimestamp_t di_mtime; /* time last modified */ > - xfs_ictimestamp_t di_ctime; /* time created/inode modified */ > - xfs_fsize_t di_size; /* number of bytes in file */ > - xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */ > - xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ > - xfs_extnum_t di_nextents; /* number of extents in data fork */ > - xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ > - __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ > - __int8_t di_aformat; /* format of attr fork's data */ > - __uint32_t di_dmevmask; /* DMIG event mask */ > - __uint16_t di_dmstate; /* DMIG state info */ > - __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ > - __uint32_t di_gen; /* generation number */ > - > - /* di_next_unlinked is the only non-core field in the old dinode */ > - xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ > - > - /* start of the extended dinode, writable fields */ > - __uint32_t di_crc; /* CRC of the inode */ > - __uint64_t di_changecount; /* number of attribute changes */ > - xfs_lsn_t di_lsn; /* flush sequence */ > - __uint64_t di_flags2; /* more random flags */ > - __uint8_t di_pad2[16]; /* more padding for future expansion */ > - > - /* fields only written to during inode creation */ > - xfs_ictimestamp_t di_crtime; /* time created */ > - xfs_ino_t di_ino; /* inode number */ > - uuid_t di_uuid; /* UUID of the filesystem */ > - > - /* structure must be padded to 64 bit alignment */ > -} xfs_icdinode_t; > - > -static inline uint xfs_icdinode_size(int version) > -{ > - if (version == 3) > - return sizeof(struct xfs_icdinode); > - return offsetof(struct xfs_icdinode, di_next_unlinked); > -} > - > /* > * Flags for xfs_ichgtime(). > */ > @@ -626,7 +558,6 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); > > extern struct kmem_zone *xfs_ifork_zone; > extern struct kmem_zone *xfs_inode_zone; > -extern struct kmem_zone *xfs_ili_zone; > extern const struct xfs_buf_ops xfs_inode_buf_ops; > > #endif /* __XFS_INODE_H__ */ > diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h > index 779812f..dce4d65 100644 > --- a/fs/xfs/xfs_inode_item.h > +++ b/fs/xfs/xfs_inode_item.h > @@ -18,123 +18,13 @@ > #ifndef __XFS_INODE_ITEM_H__ > #define __XFS_INODE_ITEM_H__ > > -/* > - * This is the structure used to lay out an inode log item in the > - * log. The size of the inline data/extents/b-tree root to be logged > - * (if any) is indicated in the ilf_dsize field. Changes to this structure > - * must be added on to the end. > - */ > -typedef struct xfs_inode_log_format { > - __uint16_t ilf_type; /* inode log item type */ > - __uint16_t ilf_size; /* size of this item */ > - __uint32_t ilf_fields; /* flags for fields logged */ > - __uint16_t ilf_asize; /* size of attr d/ext/root */ > - __uint16_t ilf_dsize; /* size of data/ext/root */ > - __uint64_t ilf_ino; /* inode number */ > - union { > - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ > - uuid_t ilfu_uuid; /* mount point value */ > - } ilf_u; > - __int64_t ilf_blkno; /* blkno of inode buffer */ > - __int32_t ilf_len; /* len of inode buffer */ > - __int32_t ilf_boffset; /* off of inode in buffer */ > -} xfs_inode_log_format_t; > - > -typedef struct xfs_inode_log_format_32 { > - __uint16_t ilf_type; /* inode log item type */ > - __uint16_t ilf_size; /* size of this item */ > - __uint32_t ilf_fields; /* flags for fields logged */ > - __uint16_t ilf_asize; /* size of attr d/ext/root */ > - __uint16_t ilf_dsize; /* size of data/ext/root */ > - __uint64_t ilf_ino; /* inode number */ > - union { > - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ > - uuid_t ilfu_uuid; /* mount point value */ > - } ilf_u; > - __int64_t ilf_blkno; /* blkno of inode buffer */ > - __int32_t ilf_len; /* len of inode buffer */ > - __int32_t ilf_boffset; /* off of inode in buffer */ > -} __attribute__((packed)) xfs_inode_log_format_32_t; > - > -typedef struct xfs_inode_log_format_64 { > - __uint16_t ilf_type; /* inode log item type */ > - __uint16_t ilf_size; /* size of this item */ > - __uint32_t ilf_fields; /* flags for fields logged */ > - __uint16_t ilf_asize; /* size of attr d/ext/root */ > - __uint16_t ilf_dsize; /* size of data/ext/root */ > - __uint32_t ilf_pad; /* pad for 64 bit boundary */ > - __uint64_t ilf_ino; /* inode number */ > - union { > - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ > - uuid_t ilfu_uuid; /* mount point value */ > - } ilf_u; > - __int64_t ilf_blkno; /* blkno of inode buffer */ > - __int32_t ilf_len; /* len of inode buffer */ > - __int32_t ilf_boffset; /* off of inode in buffer */ > -} xfs_inode_log_format_64_t; > - > -/* > - * Flags for xfs_trans_log_inode flags field. > - */ > -#define XFS_ILOG_CORE 0x001 /* log standard inode fields */ > -#define XFS_ILOG_DDATA 0x002 /* log i_df.if_data */ > -#define XFS_ILOG_DEXT 0x004 /* log i_df.if_extents */ > -#define XFS_ILOG_DBROOT 0x008 /* log i_df.i_broot */ > -#define XFS_ILOG_DEV 0x010 /* log the dev field */ > -#define XFS_ILOG_UUID 0x020 /* log the uuid field */ > -#define XFS_ILOG_ADATA 0x040 /* log i_af.if_data */ > -#define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ > -#define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ > - > - > -/* > - * The timestamps are dirty, but not necessarily anything else in the inode > - * core. Unlike the other fields above this one must never make it to disk > - * in the ilf_fields of the inode_log_format, but is purely store in-memory in > - * ili_fields in the inode_log_item. > - */ > -#define XFS_ILOG_TIMESTAMP 0x4000 > - > -#define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ > - XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ > - XFS_ILOG_UUID | XFS_ILOG_ADATA | \ > - XFS_ILOG_AEXT | XFS_ILOG_ABROOT) > - > -#define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ > - XFS_ILOG_DBROOT) > - > -#define XFS_ILOG_AFORK (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ > - XFS_ILOG_ABROOT) > - > -#define XFS_ILOG_ALL (XFS_ILOG_CORE | XFS_ILOG_DDATA | \ > - XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ > - XFS_ILOG_DEV | XFS_ILOG_UUID | \ > - XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ > - XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) > - > -static inline int xfs_ilog_fbroot(int w) > -{ > - return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); > -} > - > -static inline int xfs_ilog_fext(int w) > -{ > - return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); > -} > - > -static inline int xfs_ilog_fdata(int w) > -{ > - return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); > -} > - > -#ifdef __KERNEL__ > +/* kernel only definitions */ > > struct xfs_buf; > struct xfs_bmbt_rec; > struct xfs_inode; > struct xfs_mount; > > - > typedef struct xfs_inode_log_item { > xfs_log_item_t ili_item; /* common portion */ > struct xfs_inode *ili_inode; /* inode ptr */ > @@ -151,7 +41,6 @@ typedef struct xfs_inode_log_item { > xfs_inode_log_format_t ili_format; /* logged structure */ > } xfs_inode_log_item_t; > > - > static inline int xfs_inode_clean(xfs_inode_t *ip) > { > return !ip->i_itemp || !(ip->i_itemp->ili_fields & XFS_ILOG_ALL); > @@ -165,6 +54,6 @@ extern void xfs_iflush_abort(struct xfs_inode *, bool); > extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, > xfs_inode_log_format_t *); > > -#endif /* __KERNEL__ */ > +extern struct kmem_zone *xfs_ili_zone; > > #endif /* __XFS_INODE_ITEM_H__ */ > diff --git a/fs/xfs/xfs_log_format.h b/fs/xfs/xfs_log_format.h > index 9f9aeb6..fd46a7f 100644 > --- a/fs/xfs/xfs_log_format.h > +++ b/fs/xfs/xfs_log_format.h > @@ -18,6 +18,16 @@ > #ifndef __XFS_LOG_FORMAT_H__ > #define __XFS_LOG_FORMAT_H__ > > +/* > + * On-disk Log Format definitions. > + * > + * This file contains all the on-disk format definitions used within the log. It > + * includes the physical log structure itself, as well as all the log item > + * format structures that are written into the log and intepreted by log > + * recovery. We start with the physical log format definitions, and then work > + * through all the log items definitions and everything they encode into the > + * log. > + */ > typedef __uint32_t xlog_tid_t; > > #define XLOG_MIN_ICLOGS 2 > @@ -175,4 +185,183 @@ typedef struct xfs_log_iovec { > uint i_type; /* type of region */ > } xfs_log_iovec_t; > > + > +/* > + * Inode Log Item Format definitions. > + * > + * This is the structure used to lay out an inode log item in the > + * log. The size of the inline data/extents/b-tree root to be logged > + * (if any) is indicated in the ilf_dsize field. Changes to this structure > + * must be added on to the end. > + */ > +typedef struct xfs_inode_log_format { > + __uint16_t ilf_type; /* inode log item type */ > + __uint16_t ilf_size; /* size of this item */ > + __uint32_t ilf_fields; /* flags for fields logged */ > + __uint16_t ilf_asize; /* size of attr d/ext/root */ > + __uint16_t ilf_dsize; /* size of data/ext/root */ > + __uint64_t ilf_ino; /* inode number */ > + union { > + __uint32_t ilfu_rdev; /* rdev value for dev inode*/ > + uuid_t ilfu_uuid; /* mount point value */ > + } ilf_u; > + __int64_t ilf_blkno; /* blkno of inode buffer */ > + __int32_t ilf_len; /* len of inode buffer */ > + __int32_t ilf_boffset; /* off of inode in buffer */ > +} xfs_inode_log_format_t; > + > +typedef struct xfs_inode_log_format_32 { > + __uint16_t ilf_type; /* inode log item type */ > + __uint16_t ilf_size; /* size of this item */ > + __uint32_t ilf_fields; /* flags for fields logged */ > + __uint16_t ilf_asize; /* size of attr d/ext/root */ > + __uint16_t ilf_dsize; /* size of data/ext/root */ > + __uint64_t ilf_ino; /* inode number */ > + union { > + __uint32_t ilfu_rdev; /* rdev value for dev inode*/ > + uuid_t ilfu_uuid; /* mount point value */ > + } ilf_u; > + __int64_t ilf_blkno; /* blkno of inode buffer */ > + __int32_t ilf_len; /* len of inode buffer */ > + __int32_t ilf_boffset; /* off of inode in buffer */ > +} __attribute__((packed)) xfs_inode_log_format_32_t; > + > +typedef struct xfs_inode_log_format_64 { > + __uint16_t ilf_type; /* inode log item type */ > + __uint16_t ilf_size; /* size of this item */ > + __uint32_t ilf_fields; /* flags for fields logged */ > + __uint16_t ilf_asize; /* size of attr d/ext/root */ > + __uint16_t ilf_dsize; /* size of data/ext/root */ > + __uint32_t ilf_pad; /* pad for 64 bit boundary */ > + __uint64_t ilf_ino; /* inode number */ > + union { > + __uint32_t ilfu_rdev; /* rdev value for dev inode*/ > + uuid_t ilfu_uuid; /* mount point value */ > + } ilf_u; > + __int64_t ilf_blkno; /* blkno of inode buffer */ > + __int32_t ilf_len; /* len of inode buffer */ > + __int32_t ilf_boffset; /* off of inode in buffer */ > +} xfs_inode_log_format_64_t; > + > +/* > + * Flags for xfs_trans_log_inode flags field. > + */ > +#define XFS_ILOG_CORE 0x001 /* log standard inode fields */ > +#define XFS_ILOG_DDATA 0x002 /* log i_df.if_data */ > +#define XFS_ILOG_DEXT 0x004 /* log i_df.if_extents */ > +#define XFS_ILOG_DBROOT 0x008 /* log i_df.i_broot */ > +#define XFS_ILOG_DEV 0x010 /* log the dev field */ > +#define XFS_ILOG_UUID 0x020 /* log the uuid field */ > +#define XFS_ILOG_ADATA 0x040 /* log i_af.if_data */ > +#define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ > +#define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ > + > + > +/* > + * The timestamps are dirty, but not necessarily anything else in the inode > + * core. Unlike the other fields above this one must never make it to disk > + * in the ilf_fields of the inode_log_format, but is purely store in-memory in > + * ili_fields in the inode_log_item. > + */ > +#define XFS_ILOG_TIMESTAMP 0x4000 > + > +#define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ > + XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ > + XFS_ILOG_UUID | XFS_ILOG_ADATA | \ > + XFS_ILOG_AEXT | XFS_ILOG_ABROOT) > + > +#define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ > + XFS_ILOG_DBROOT) > + > +#define XFS_ILOG_AFORK (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ > + XFS_ILOG_ABROOT) > + > +#define XFS_ILOG_ALL (XFS_ILOG_CORE | XFS_ILOG_DDATA | \ > + XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ > + XFS_ILOG_DEV | XFS_ILOG_UUID | \ > + XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ > + XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) > + > +static inline int xfs_ilog_fbroot(int w) > +{ > + return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); > +} > + > +static inline int xfs_ilog_fext(int w) > +{ > + return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); > +} > + > +static inline int xfs_ilog_fdata(int w) > +{ > + return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); > +} > + > +/* > + * Incore version of the on-disk inode core structures. We log this directly > + * into the journal in host CPU format (for better or worse) and as such > + * directly mirrors the xfs_dinode structure as it must contain all the same > + * information. > + */ > +typedef struct xfs_ictimestamp { > + __int32_t t_sec; /* timestamp seconds */ > + __int32_t t_nsec; /* timestamp nanoseconds */ > +} xfs_ictimestamp_t; > + > +/* > + * NOTE: This structure must be kept identical to struct xfs_dinode > + * in xfs_dinode.h except for the endianness annotations. > + */ > +typedef struct xfs_icdinode { > + __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ > + __uint16_t di_mode; /* mode and type of file */ > + __int8_t di_version; /* inode version */ > + __int8_t di_format; /* format of di_c data */ > + __uint16_t di_onlink; /* old number of links to file */ > + __uint32_t di_uid; /* owner's user id */ > + __uint32_t di_gid; /* owner's group id */ > + __uint32_t di_nlink; /* number of links to file */ > + __uint16_t di_projid_lo; /* lower part of owner's project id */ > + __uint16_t di_projid_hi; /* higher part of owner's project id */ > + __uint8_t di_pad[6]; /* unused, zeroed space */ > + __uint16_t di_flushiter; /* incremented on flush */ > + xfs_ictimestamp_t di_atime; /* time last accessed */ > + xfs_ictimestamp_t di_mtime; /* time last modified */ > + xfs_ictimestamp_t di_ctime; /* time created/inode modified */ > + xfs_fsize_t di_size; /* number of bytes in file */ > + xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */ > + xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ > + xfs_extnum_t di_nextents; /* number of extents in data fork */ > + xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ > + __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ > + __int8_t di_aformat; /* format of attr fork's data */ > + __uint32_t di_dmevmask; /* DMIG event mask */ > + __uint16_t di_dmstate; /* DMIG state info */ > + __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ > + __uint32_t di_gen; /* generation number */ > + > + /* di_next_unlinked is the only non-core field in the old dinode */ > + xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ > + > + /* start of the extended dinode, writable fields */ > + __uint32_t di_crc; /* CRC of the inode */ > + __uint64_t di_changecount; /* number of attribute changes */ > + xfs_lsn_t di_lsn; /* flush sequence */ > + __uint64_t di_flags2; /* more random flags */ > + __uint8_t di_pad2[16]; /* more padding for future expansion */ > + > + /* fields only written to during inode creation */ > + xfs_ictimestamp_t di_crtime; /* time created */ > + xfs_ino_t di_ino; /* inode number */ > + uuid_t di_uuid; /* UUID of the filesystem */ > + > + /* structure must be padded to 64 bit alignment */ > +} xfs_icdinode_t; > + > +static inline uint xfs_icdinode_size(int version) > +{ > + if (version == 3) > + return sizeof(struct xfs_icdinode); > + return offsetof(struct xfs_icdinode, di_next_unlinked); > +} > #endif /* __XFS_LOG_FORMAT_H__ */ > diff --git a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h > index 61ba1cf..39c48ca 100644 > --- a/fs/xfs/xfs_types.h > +++ b/fs/xfs/xfs_types.h > @@ -146,6 +146,12 @@ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ > #define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) > > /* > + * Inode fork identifiers. > + */ > +#define XFS_DATA_FORK 0 > +#define XFS_ATTR_FORK 1 > + > +/* > * Min numbers of data/attr fork btree root pointers. > */ > #define MINDBTPTRS 3 > diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c > index 87d3e03..b7311aa 100644 > --- a/fs/xfs/xfs_xattr.c > +++ b/fs/xfs/xfs_xattr.c > @@ -17,6 +17,7 @@ > */ > > #include "xfs.h" > +#include "xfs_log_format.h" > #include "xfs_da_btree.h" > #include "xfs_bmap_btree.h" > #include "xfs_inode.h" > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs