Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
xfs_inode_item.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2000,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_ITEM_H__
19 #define __XFS_INODE_ITEM_H__
20 
21 /*
22  * This is the structure used to lay out an inode log item in the
23  * log. The size of the inline data/extents/b-tree root to be logged
24  * (if any) is indicated in the ilf_dsize field. Changes to this structure
25  * must be added on to the end.
26  */
27 typedef struct xfs_inode_log_format {
28  __uint16_t ilf_type; /* inode log item type */
29  __uint16_t ilf_size; /* size of this item */
30  __uint32_t ilf_fields; /* flags for fields logged */
31  __uint16_t ilf_asize; /* size of attr d/ext/root */
32  __uint16_t ilf_dsize; /* size of data/ext/root */
33  __uint64_t ilf_ino; /* inode number */
34  union {
35  __uint32_t ilfu_rdev; /* rdev value for dev inode*/
36  uuid_t ilfu_uuid; /* mount point value */
37  } ilf_u;
38  __int64_t ilf_blkno; /* blkno of inode buffer */
39  __int32_t ilf_len; /* len of inode buffer */
40  __int32_t ilf_boffset; /* off of inode in buffer */
42 
43 typedef struct xfs_inode_log_format_32 {
44  __uint16_t ilf_type; /* inode log item type */
45  __uint16_t ilf_size; /* size of this item */
46  __uint32_t ilf_fields; /* flags for fields logged */
47  __uint16_t ilf_asize; /* size of attr d/ext/root */
48  __uint16_t ilf_dsize; /* size of data/ext/root */
49  __uint64_t ilf_ino; /* inode number */
50  union {
51  __uint32_t ilfu_rdev; /* rdev value for dev inode*/
52  uuid_t ilfu_uuid; /* mount point value */
53  } ilf_u;
54  __int64_t ilf_blkno; /* blkno of inode buffer */
55  __int32_t ilf_len; /* len of inode buffer */
56  __int32_t ilf_boffset; /* off of inode in buffer */
57 } __attribute__((packed)) xfs_inode_log_format_32_t;
58 
60  __uint16_t ilf_type; /* inode log item type */
61  __uint16_t ilf_size; /* size of this item */
62  __uint32_t ilf_fields; /* flags for fields logged */
63  __uint16_t ilf_asize; /* size of attr d/ext/root */
64  __uint16_t ilf_dsize; /* size of data/ext/root */
65  __uint32_t ilf_pad; /* pad for 64 bit boundary */
66  __uint64_t ilf_ino; /* inode number */
67  union {
68  __uint32_t ilfu_rdev; /* rdev value for dev inode*/
69  uuid_t ilfu_uuid; /* mount point value */
70  } ilf_u;
71  __int64_t ilf_blkno; /* blkno of inode buffer */
72  __int32_t ilf_len; /* len of inode buffer */
73  __int32_t ilf_boffset; /* off of inode in buffer */
75 
76 /*
77  * Flags for xfs_trans_log_inode flags field.
78  */
79 #define XFS_ILOG_CORE 0x001 /* log standard inode fields */
80 #define XFS_ILOG_DDATA 0x002 /* log i_df.if_data */
81 #define XFS_ILOG_DEXT 0x004 /* log i_df.if_extents */
82 #define XFS_ILOG_DBROOT 0x008 /* log i_df.i_broot */
83 #define XFS_ILOG_DEV 0x010 /* log the dev field */
84 #define XFS_ILOG_UUID 0x020 /* log the uuid field */
85 #define XFS_ILOG_ADATA 0x040 /* log i_af.if_data */
86 #define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */
87 #define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */
88 
89 
90 /*
91  * The timestamps are dirty, but not necessarily anything else in the inode
92  * core. Unlike the other fields above this one must never make it to disk
93  * in the ilf_fields of the inode_log_format, but is purely store in-memory in
94  * ili_fields in the inode_log_item.
95  */
96 #define XFS_ILOG_TIMESTAMP 0x4000
97 
98 #define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \
99  XFS_ILOG_DBROOT | XFS_ILOG_DEV | \
100  XFS_ILOG_UUID | XFS_ILOG_ADATA | \
101  XFS_ILOG_AEXT | XFS_ILOG_ABROOT)
102 
103 #define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \
104  XFS_ILOG_DBROOT)
105 
106 #define XFS_ILOG_AFORK (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
107  XFS_ILOG_ABROOT)
108 
109 #define XFS_ILOG_ALL (XFS_ILOG_CORE | XFS_ILOG_DDATA | \
110  XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \
111  XFS_ILOG_DEV | XFS_ILOG_UUID | \
112  XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
113  XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP)
114 
115 static inline int xfs_ilog_fbroot(int w)
116 {
118 }
119 
120 static inline int xfs_ilog_fext(int w)
121 {
122  return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT);
123 }
124 
125 static inline int xfs_ilog_fdata(int w)
126 {
127  return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA);
128 }
129 
130 #ifdef __KERNEL__
131 
132 struct xfs_buf;
133 struct xfs_bmbt_rec;
134 struct xfs_inode;
135 struct xfs_mount;
136 
137 
138 typedef struct xfs_inode_log_item {
139  xfs_log_item_t ili_item; /* common portion */
140  struct xfs_inode *ili_inode; /* inode ptr */
141  xfs_lsn_t ili_flush_lsn; /* lsn at last flush */
142  xfs_lsn_t ili_last_lsn; /* lsn at last transaction */
143  unsigned short ili_lock_flags; /* lock flags */
144  unsigned short ili_logged; /* flushed logged data */
145  unsigned int ili_last_fields; /* fields when flushed */
146  unsigned int ili_fields; /* fields to be logged */
147  struct xfs_bmbt_rec *ili_extents_buf; /* array of logged
148  data exts */
149  struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged
150  attr exts */
151 #ifdef XFS_TRANS_DEBUG
152  int ili_root_size;
153  char *ili_orig_root;
154 #endif
155  xfs_inode_log_format_t ili_format; /* logged structure */
156 } xfs_inode_log_item_t;
157 
158 
159 static inline int xfs_inode_clean(xfs_inode_t *ip)
160 {
161  return !ip->i_itemp || !(ip->i_itemp->ili_fields & XFS_ILOG_ALL);
162 }
163 
164 extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *);
165 extern void xfs_inode_item_destroy(struct xfs_inode *);
166 extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *);
167 extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *);
168 extern void xfs_iflush_abort(struct xfs_inode *, bool);
171 
172 #endif /* __KERNEL__ */
173 
174 #endif /* __XFS_INODE_ITEM_H__ */