xfs: introduce inode log format object
[cascardo/linux.git] / fs / xfs / libxfs / xfs_inode_buf.h
1 /*
2  * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #ifndef __XFS_INODE_BUF_H__
19 #define __XFS_INODE_BUF_H__
20
21 struct xfs_inode;
22 struct xfs_dinode;
23
24 /*
25  * In memory representation of the XFS inode. This is held in the in-core
26  * struct xfs_inode to represent the on disk values, but no longer needs to be
27  * identical to the on-disk structure as it is always translated to on-disk
28  * format specific structures at the appropriate time.
29  */
30 struct xfs_icdinode {
31         __uint16_t      di_magic;       /* inode magic # = XFS_DINODE_MAGIC */
32         __uint16_t      di_mode;        /* mode and type of file */
33         __int8_t        di_version;     /* inode version */
34         __int8_t        di_format;      /* format of di_c data */
35         __uint16_t      di_onlink;      /* old number of links to file */
36         __uint32_t      di_uid;         /* owner's user id */
37         __uint32_t      di_gid;         /* owner's group id */
38         __uint32_t      di_nlink;       /* number of links to file */
39         __uint16_t      di_projid_lo;   /* lower part of owner's project id */
40         __uint16_t      di_projid_hi;   /* higher part of owner's project id */
41         __uint8_t       di_pad[6];      /* unused, zeroed space */
42         __uint16_t      di_flushiter;   /* incremented on flush */
43         xfs_ictimestamp_t di_atime;     /* time last accessed */
44         xfs_ictimestamp_t di_mtime;     /* time last modified */
45         xfs_ictimestamp_t di_ctime;     /* time created/inode modified */
46         xfs_fsize_t     di_size;        /* number of bytes in file */
47         xfs_rfsblock_t  di_nblocks;     /* # of direct & btree blocks used */
48         xfs_extlen_t    di_extsize;     /* basic/minimum extent size for file */
49         xfs_extnum_t    di_nextents;    /* number of extents in data fork */
50         xfs_aextnum_t   di_anextents;   /* number of extents in attribute fork*/
51         __uint8_t       di_forkoff;     /* attr fork offs, <<3 for 64b align */
52         __int8_t        di_aformat;     /* format of attr fork's data */
53         __uint32_t      di_dmevmask;    /* DMIG event mask */
54         __uint16_t      di_dmstate;     /* DMIG state info */
55         __uint16_t      di_flags;       /* random flags, XFS_DIFLAG_... */
56         __uint32_t      di_gen;         /* generation number */
57
58         /* di_next_unlinked is the only non-core field in the old dinode */
59         xfs_agino_t     di_next_unlinked;/* agi unlinked list ptr */
60
61         /* start of the extended dinode, writable fields */
62         __uint32_t      di_crc;         /* CRC of the inode */
63         __uint64_t      di_changecount; /* number of attribute changes */
64         xfs_lsn_t       di_lsn;         /* flush sequence */
65         __uint64_t      di_flags2;      /* more random flags */
66         __uint8_t       di_pad2[16];    /* more padding for future expansion */
67
68         /* fields only written to during inode creation */
69         xfs_ictimestamp_t di_crtime;    /* time created */
70         xfs_ino_t       di_ino;         /* inode number */
71         uuid_t          di_uuid;        /* UUID of the filesystem */
72
73         /* structure must be padded to 64 bit alignment */
74 };
75
76 /*
77  * Inode location information.  Stored in the inode and passed to
78  * xfs_imap_to_bp() to get a buffer and dinode for a given inode.
79  */
80 struct xfs_imap {
81         xfs_daddr_t     im_blkno;       /* starting BB of inode chunk */
82         ushort          im_len;         /* length in BBs of inode chunk */
83         ushort          im_boffset;     /* inode offset in block in bytes */
84 };
85
86 int     xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
87                        struct xfs_imap *, struct xfs_dinode **,
88                        struct xfs_buf **, uint, uint);
89 int     xfs_iread(struct xfs_mount *, struct xfs_trans *,
90                   struct xfs_inode *, uint);
91 void    xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
92 void    xfs_dinode_to_disk(struct xfs_dinode *to, struct xfs_icdinode *from);
93 void    xfs_dinode_from_disk(struct xfs_icdinode *to, struct xfs_dinode *from);
94
95 #if defined(DEBUG)
96 void    xfs_inobp_check(struct xfs_mount *, struct xfs_buf *);
97 #else
98 #define xfs_inobp_check(mp, bp)
99 #endif /* DEBUG */
100
101 #endif  /* __XFS_INODE_BUF_H__ */