Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/btrfs/btrfs_inode.h
15109 views
1
/*
2
* Copyright (C) 2007 Oracle. All rights reserved.
3
*
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public
6
* License v2 as published by the Free Software Foundation.
7
*
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
* General Public License for more details.
12
*
13
* You should have received a copy of the GNU General Public
14
* License along with this program; if not, write to the
15
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16
* Boston, MA 021110-1307, USA.
17
*/
18
19
#ifndef __BTRFS_I__
20
#define __BTRFS_I__
21
22
#include "extent_map.h"
23
#include "extent_io.h"
24
#include "ordered-data.h"
25
#include "delayed-inode.h"
26
27
/* in memory btrfs inode */
28
struct btrfs_inode {
29
/* which subvolume this inode belongs to */
30
struct btrfs_root *root;
31
32
/* key used to find this inode on disk. This is used by the code
33
* to read in roots of subvolumes
34
*/
35
struct btrfs_key location;
36
37
/* the extent_tree has caches of all the extent mappings to disk */
38
struct extent_map_tree extent_tree;
39
40
/* the io_tree does range state (DIRTY, LOCKED etc) */
41
struct extent_io_tree io_tree;
42
43
/* special utility tree used to record which mirrors have already been
44
* tried when checksums fail for a given block
45
*/
46
struct extent_io_tree io_failure_tree;
47
48
/* held while logging the inode in tree-log.c */
49
struct mutex log_mutex;
50
51
/* used to order data wrt metadata */
52
struct btrfs_ordered_inode_tree ordered_tree;
53
54
/* for keeping track of orphaned inodes */
55
struct list_head i_orphan;
56
57
/* list of all the delalloc inodes in the FS. There are times we need
58
* to write all the delalloc pages to disk, and this list is used
59
* to walk them all.
60
*/
61
struct list_head delalloc_inodes;
62
63
/*
64
* list for tracking inodes that must be sent to disk before a
65
* rename or truncate commit
66
*/
67
struct list_head ordered_operations;
68
69
/* node for the red-black tree that links inodes in subvolume root */
70
struct rb_node rb_node;
71
72
/* the space_info for where this inode's data allocations are done */
73
struct btrfs_space_info *space_info;
74
75
/* full 64 bit generation number, struct vfs_inode doesn't have a big
76
* enough field for this.
77
*/
78
u64 generation;
79
80
/* sequence number for NFS changes */
81
u64 sequence;
82
83
/*
84
* transid of the trans_handle that last modified this inode
85
*/
86
u64 last_trans;
87
88
/*
89
* log transid when this inode was last modified
90
*/
91
u64 last_sub_trans;
92
93
/*
94
* transid that last logged this inode
95
*/
96
u64 logged_trans;
97
98
/* total number of bytes pending delalloc, used by stat to calc the
99
* real block usage of the file
100
*/
101
u64 delalloc_bytes;
102
103
/* total number of bytes that may be used for this inode for
104
* delalloc
105
*/
106
u64 reserved_bytes;
107
108
/*
109
* the size of the file stored in the metadata on disk. data=ordered
110
* means the in-memory i_size might be larger than the size on disk
111
* because not all the blocks are written yet.
112
*/
113
u64 disk_i_size;
114
115
/* flags field from the on disk inode */
116
u32 flags;
117
118
/*
119
* if this is a directory then index_cnt is the counter for the index
120
* number for new files that are created
121
*/
122
u64 index_cnt;
123
124
/* the fsync log has some corner cases that mean we have to check
125
* directories to see if any unlinks have been done before
126
* the directory was logged. See tree-log.c for all the
127
* details
128
*/
129
u64 last_unlink_trans;
130
131
/*
132
* Counters to keep track of the number of extent item's we may use due
133
* to delalloc and such. outstanding_extents is the number of extent
134
* items we think we'll end up using, and reserved_extents is the number
135
* of extent items we've reserved metadata for.
136
*/
137
atomic_t outstanding_extents;
138
atomic_t reserved_extents;
139
140
/*
141
* ordered_data_close is set by truncate when a file that used
142
* to have good data has been truncated to zero. When it is set
143
* the btrfs file release call will add this inode to the
144
* ordered operations list so that we make sure to flush out any
145
* new data the application may have written before commit.
146
*
147
* yes, its silly to have a single bitflag, but we might grow more
148
* of these.
149
*/
150
unsigned ordered_data_close:1;
151
unsigned orphan_meta_reserved:1;
152
unsigned dummy_inode:1;
153
unsigned in_defrag:1;
154
155
/*
156
* always compress this one file
157
*/
158
unsigned force_compress:4;
159
160
struct btrfs_delayed_node *delayed_node;
161
162
struct inode vfs_inode;
163
};
164
165
extern unsigned char btrfs_filetype_table[];
166
167
static inline struct btrfs_inode *BTRFS_I(struct inode *inode)
168
{
169
return container_of(inode, struct btrfs_inode, vfs_inode);
170
}
171
172
static inline u64 btrfs_ino(struct inode *inode)
173
{
174
u64 ino = BTRFS_I(inode)->location.objectid;
175
176
if (ino <= BTRFS_FIRST_FREE_OBJECTID)
177
ino = inode->i_ino;
178
return ino;
179
}
180
181
static inline void btrfs_i_size_write(struct inode *inode, u64 size)
182
{
183
i_size_write(inode, size);
184
BTRFS_I(inode)->disk_i_size = size;
185
}
186
187
#endif
188
189