Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
680834ca
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
680834ca
编写于
5月 16, 2016
作者:
D
David Sterba
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'foreign/jeffm/uapi' into for-chris-4.7-20160516
# Conflicts: # include/uapi/linux/btrfs.h
上级
36fac9e9
14b05c51
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
1135 addition
and
1064 deletion
+1135
-1064
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+1
-1013
fs/btrfs/volumes.h
fs/btrfs/volumes.h
+0
-46
include/uapi/linux/btrfs.h
include/uapi/linux/btrfs.h
+168
-5
include/uapi/linux/btrfs_tree.h
include/uapi/linux/btrfs_tree.h
+966
-0
未找到文件。
fs/btrfs/ctree.h
浏览文件 @
680834ca
...
@@ -33,6 +33,7 @@
...
@@ -33,6 +33,7 @@
#include <asm/kmap_types.h>
#include <asm/kmap_types.h>
#include <linux/pagemap.h>
#include <linux/pagemap.h>
#include <linux/btrfs.h>
#include <linux/btrfs.h>
#include <linux/btrfs_tree.h>
#include <linux/workqueue.h>
#include <linux/workqueue.h>
#include <linux/security.h>
#include <linux/security.h>
#include <linux/sizes.h>
#include <linux/sizes.h>
...
@@ -64,98 +65,6 @@ struct btrfs_ordered_sum;
...
@@ -64,98 +65,6 @@ struct btrfs_ordered_sum;
#define BTRFS_COMPAT_EXTENT_TREE_V0
#define BTRFS_COMPAT_EXTENT_TREE_V0
/* holds pointers to all of the tree roots */
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
/* stores information about which extents are in use, and reference counts */
#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
/*
* chunk tree stores translations from logical -> physical block numbering
* the super block points to the chunk tree
*/
#define BTRFS_CHUNK_TREE_OBJECTID 3ULL
/*
* stores information about which areas of a given device are in use.
* one per device. The tree of tree roots points to the device tree
*/
#define BTRFS_DEV_TREE_OBJECTID 4ULL
/* one per subvolume, storing files and directories */
#define BTRFS_FS_TREE_OBJECTID 5ULL
/* directory objectid inside the root tree */
#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
/* holds checksums of all the data extents */
#define BTRFS_CSUM_TREE_OBJECTID 7ULL
/* holds quota configuration and tracking */
#define BTRFS_QUOTA_TREE_OBJECTID 8ULL
/* for storing items that use the BTRFS_UUID_KEY* types */
#define BTRFS_UUID_TREE_OBJECTID 9ULL
/* tracks free space in block groups. */
#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
/* device stats in the device tree */
#define BTRFS_DEV_STATS_OBJECTID 0ULL
/* for storing balance parameters in the root tree */
#define BTRFS_BALANCE_OBJECTID -4ULL
/* orhpan objectid for tracking unlinked/truncated files */
#define BTRFS_ORPHAN_OBJECTID -5ULL
/* does write ahead logging to speed up fsyncs */
#define BTRFS_TREE_LOG_OBJECTID -6ULL
#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL
/* for space balancing */
#define BTRFS_TREE_RELOC_OBJECTID -8ULL
#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL
/*
* extent checksums all have this objectid
* this allows them to share the logging tree
* for fsyncs
*/
#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL
/* For storing free space cache */
#define BTRFS_FREE_SPACE_OBJECTID -11ULL
/*
* The inode number assigned to the special inode for storing
* free ino cache
*/
#define BTRFS_FREE_INO_OBJECTID -12ULL
/* dummy objectid represents multiple objectids */
#define BTRFS_MULTIPLE_OBJECTIDS -255ULL
/*
* All files have objectids in this range.
*/
#define BTRFS_FIRST_FREE_OBJECTID 256ULL
#define BTRFS_LAST_FREE_OBJECTID -256ULL
#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
/*
* the device items go into the chunk tree. The key is in the form
* [ 1 BTRFS_DEV_ITEM_KEY device_id ]
*/
#define BTRFS_DEV_ITEMS_OBJECTID 1ULL
#define BTRFS_BTREE_INODE_OBJECTID 1
#define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2
#define BTRFS_DEV_REPLACE_DEVID 0ULL
/*
/*
* the max metadata block size. This limit is somewhat artificial,
* the max metadata block size. This limit is somewhat artificial,
* but the memmove costs go through the roof for larger blocks.
* but the memmove costs go through the roof for larger blocks.
...
@@ -175,12 +84,6 @@ struct btrfs_ordered_sum;
...
@@ -175,12 +84,6 @@ struct btrfs_ordered_sum;
*/
*/
#define BTRFS_LINK_MAX 65535U
#define BTRFS_LINK_MAX 65535U
/* 32 bytes in various csum fields */
#define BTRFS_CSUM_SIZE 32
/* csum types */
#define BTRFS_CSUM_TYPE_CRC32 0
static
const
int
btrfs_csum_sizes
[]
=
{
4
};
static
const
int
btrfs_csum_sizes
[]
=
{
4
};
/* four bytes for CRC32 */
/* four bytes for CRC32 */
...
@@ -189,17 +92,6 @@ static const int btrfs_csum_sizes[] = { 4 };
...
@@ -189,17 +92,6 @@ static const int btrfs_csum_sizes[] = { 4 };
/* spefic to btrfs_map_block(), therefore not in include/linux/blk_types.h */
/* spefic to btrfs_map_block(), therefore not in include/linux/blk_types.h */
#define REQ_GET_READ_MIRRORS (1 << 30)
#define REQ_GET_READ_MIRRORS (1 << 30)
#define BTRFS_FT_UNKNOWN 0
#define BTRFS_FT_REG_FILE 1
#define BTRFS_FT_DIR 2
#define BTRFS_FT_CHRDEV 3
#define BTRFS_FT_BLKDEV 4
#define BTRFS_FT_FIFO 5
#define BTRFS_FT_SOCK 6
#define BTRFS_FT_SYMLINK 7
#define BTRFS_FT_XATTR 8
#define BTRFS_FT_MAX 9
/* ioprio of readahead is set to idle */
/* ioprio of readahead is set to idle */
#define BTRFS_IOPRIO_READA (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0))
#define BTRFS_IOPRIO_READA (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_IDLE, 0))
...
@@ -207,138 +99,10 @@ static const int btrfs_csum_sizes[] = { 4 };
...
@@ -207,138 +99,10 @@ static const int btrfs_csum_sizes[] = { 4 };
#define BTRFS_MAX_EXTENT_SIZE SZ_128M
#define BTRFS_MAX_EXTENT_SIZE SZ_128M
/*
* The key defines the order in the tree, and so it also defines (optimal)
* block layout.
*
* objectid corresponds to the inode number.
*
* type tells us things about the object, and is a kind of stream selector.
* so for a given inode, keys with type of 1 might refer to the inode data,
* type of 2 may point to file data in the btree and type == 3 may point to
* extents.
*
* offset is the starting byte offset for this key in the stream.
*
* btrfs_disk_key is in disk byte order. struct btrfs_key is always
* in cpu native order. Otherwise they are identical and their sizes
* should be the same (ie both packed)
*/
struct
btrfs_disk_key
{
__le64
objectid
;
u8
type
;
__le64
offset
;
}
__attribute__
((
__packed__
));
struct
btrfs_key
{
u64
objectid
;
u8
type
;
u64
offset
;
}
__attribute__
((
__packed__
));
struct
btrfs_mapping_tree
{
struct
btrfs_mapping_tree
{
struct
extent_map_tree
map_tree
;
struct
extent_map_tree
map_tree
;
};
};
struct
btrfs_dev_item
{
/* the internal btrfs device id */
__le64
devid
;
/* size of the device */
__le64
total_bytes
;
/* bytes used */
__le64
bytes_used
;
/* optimal io alignment for this device */
__le32
io_align
;
/* optimal io width for this device */
__le32
io_width
;
/* minimal io size for this device */
__le32
sector_size
;
/* type and info about this device */
__le64
type
;
/* expected generation for this device */
__le64
generation
;
/*
* starting byte of this partition on the device,
* to allow for stripe alignment in the future
*/
__le64
start_offset
;
/* grouping information for allocation decisions */
__le32
dev_group
;
/* seek speed 0-100 where 100 is fastest */
u8
seek_speed
;
/* bandwidth 0-100 where 100 is fastest */
u8
bandwidth
;
/* btrfs generated uuid for this device */
u8
uuid
[
BTRFS_UUID_SIZE
];
/* uuid of FS who owns this device */
u8
fsid
[
BTRFS_UUID_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_stripe
{
__le64
devid
;
__le64
offset
;
u8
dev_uuid
[
BTRFS_UUID_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_chunk
{
/* size of this chunk in bytes */
__le64
length
;
/* objectid of the root referencing this chunk */
__le64
owner
;
__le64
stripe_len
;
__le64
type
;
/* optimal io alignment for this chunk */
__le32
io_align
;
/* optimal io width for this chunk */
__le32
io_width
;
/* minimal io size for this chunk */
__le32
sector_size
;
/* 2^16 stripes is quite a lot, a second limit is the size of a single
* item in the btree
*/
__le16
num_stripes
;
/* sub stripes only matter for raid10 */
__le16
sub_stripes
;
struct
btrfs_stripe
stripe
;
/* additional stripes go here */
}
__attribute__
((
__packed__
));
#define BTRFS_FREE_SPACE_EXTENT 1
#define BTRFS_FREE_SPACE_BITMAP 2
struct
btrfs_free_space_entry
{
__le64
offset
;
__le64
bytes
;
u8
type
;
}
__attribute__
((
__packed__
));
struct
btrfs_free_space_header
{
struct
btrfs_disk_key
location
;
__le64
generation
;
__le64
num_entries
;
__le64
num_bitmaps
;
}
__attribute__
((
__packed__
));
static
inline
unsigned
long
btrfs_chunk_item_size
(
int
num_stripes
)
static
inline
unsigned
long
btrfs_chunk_item_size
(
int
num_stripes
)
{
{
BUG_ON
(
num_stripes
==
0
);
BUG_ON
(
num_stripes
==
0
);
...
@@ -346,9 +110,6 @@ static inline unsigned long btrfs_chunk_item_size(int num_stripes)
...
@@ -346,9 +110,6 @@ static inline unsigned long btrfs_chunk_item_size(int num_stripes)
sizeof
(
struct
btrfs_stripe
)
*
(
num_stripes
-
1
);
sizeof
(
struct
btrfs_stripe
)
*
(
num_stripes
-
1
);
}
}
#define BTRFS_HEADER_FLAG_WRITTEN (1ULL << 0)
#define BTRFS_HEADER_FLAG_RELOC (1ULL << 1)
/*
/*
* File system states
* File system states
*/
*/
...
@@ -357,13 +118,6 @@ static inline unsigned long btrfs_chunk_item_size(int num_stripes)
...
@@ -357,13 +118,6 @@ static inline unsigned long btrfs_chunk_item_size(int num_stripes)
#define BTRFS_FS_STATE_TRANS_ABORTED 2
#define BTRFS_FS_STATE_TRANS_ABORTED 2
#define BTRFS_FS_STATE_DEV_REPLACING 3
#define BTRFS_FS_STATE_DEV_REPLACING 3
/* Super block flags */
/* Errors detected */
#define BTRFS_SUPER_FLAG_ERROR (1ULL << 2)
#define BTRFS_SUPER_FLAG_SEEDING (1ULL << 32)
#define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33)
#define BTRFS_BACKREF_REV_MAX 256
#define BTRFS_BACKREF_REV_MAX 256
#define BTRFS_BACKREF_REV_SHIFT 56
#define BTRFS_BACKREF_REV_SHIFT 56
#define BTRFS_BACKREF_REV_MASK (((u64)BTRFS_BACKREF_REV_MAX - 1) << \
#define BTRFS_BACKREF_REV_MASK (((u64)BTRFS_BACKREF_REV_MAX - 1) << \
...
@@ -410,7 +164,6 @@ struct btrfs_header {
...
@@ -410,7 +164,6 @@ struct btrfs_header {
* room to translate 14 chunks with 3 stripes each.
* room to translate 14 chunks with 3 stripes each.
*/
*/
#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
#define BTRFS_SYSTEM_CHUNK_ARRAY_SIZE 2048
#define BTRFS_LABEL_SIZE 256
/*
/*
* just in case we somehow lose the roots and are not able to mount,
* just in case we somehow lose the roots and are not able to mount,
...
@@ -507,31 +260,6 @@ struct btrfs_super_block {
...
@@ -507,31 +260,6 @@ struct btrfs_super_block {
* Compat flags that we support. If any incompat flags are set other than the
* Compat flags that we support. If any incompat flags are set other than the
* ones specified below then we will fail to mount
* ones specified below then we will fail to mount
*/
*/
#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE (1ULL << 0)
#define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0)
#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
#define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2)
#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO (1ULL << 3)
/*
* some patches floated around with a second compression method
* lets save that incompat here for when they do get in
* Note we don't actually support it, we're just reserving the
* number
*/
#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZOv2 (1ULL << 4)
/*
* older kernels tried to do bigger metadata blocks, but the
* code was pretty buggy. Lets not let them try anymore.
*/
#define BTRFS_FEATURE_INCOMPAT_BIG_METADATA (1ULL << 5)
#define BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF (1ULL << 6)
#define BTRFS_FEATURE_INCOMPAT_RAID56 (1ULL << 7)
#define BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA (1ULL << 8)
#define BTRFS_FEATURE_INCOMPAT_NO_HOLES (1ULL << 9)
#define BTRFS_FEATURE_COMPAT_SUPP 0ULL
#define BTRFS_FEATURE_COMPAT_SUPP 0ULL
#define BTRFS_FEATURE_COMPAT_SAFE_SET 0ULL
#define BTRFS_FEATURE_COMPAT_SAFE_SET 0ULL
#define BTRFS_FEATURE_COMPAT_SAFE_CLEAR 0ULL
#define BTRFS_FEATURE_COMPAT_SAFE_CLEAR 0ULL
...
@@ -624,357 +352,8 @@ struct btrfs_path {
...
@@ -624,357 +352,8 @@ struct btrfs_path {
unsigned
int
need_commit_sem
:
1
;
unsigned
int
need_commit_sem
:
1
;
unsigned
int
skip_release_on_error
:
1
;
unsigned
int
skip_release_on_error
:
1
;
};
};
/*
* items in the extent btree are used to record the objectid of the
* owner of the block and the number of references
*/
struct
btrfs_extent_item
{
__le64
refs
;
__le64
generation
;
__le64
flags
;
}
__attribute__
((
__packed__
));
struct
btrfs_extent_item_v0
{
__le32
refs
;
}
__attribute__
((
__packed__
));
#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r) >> 4) - \
#define BTRFS_MAX_EXTENT_ITEM_SIZE(r) ((BTRFS_LEAF_DATA_SIZE(r) >> 4) - \
sizeof(struct btrfs_item))
sizeof(struct btrfs_item))
#define BTRFS_EXTENT_FLAG_DATA (1ULL << 0)
#define BTRFS_EXTENT_FLAG_TREE_BLOCK (1ULL << 1)
/* following flags only apply to tree blocks */
/* use full backrefs for extent pointers in the block */
#define BTRFS_BLOCK_FLAG_FULL_BACKREF (1ULL << 8)
/*
* this flag is only used internally by scrub and may be changed at any time
* it is only declared here to avoid collisions
*/
#define BTRFS_EXTENT_FLAG_SUPER (1ULL << 48)
struct
btrfs_tree_block_info
{
struct
btrfs_disk_key
key
;
u8
level
;
}
__attribute__
((
__packed__
));
struct
btrfs_extent_data_ref
{
__le64
root
;
__le64
objectid
;
__le64
offset
;
__le32
count
;
}
__attribute__
((
__packed__
));
struct
btrfs_shared_data_ref
{
__le32
count
;
}
__attribute__
((
__packed__
));
struct
btrfs_extent_inline_ref
{
u8
type
;
__le64
offset
;
}
__attribute__
((
__packed__
));
/* old style backrefs item */
struct
btrfs_extent_ref_v0
{
__le64
root
;
__le64
generation
;
__le64
objectid
;
__le32
count
;
}
__attribute__
((
__packed__
));
/* dev extents record free space on individual devices. The owner
* field points back to the chunk allocation mapping tree that allocated
* the extent. The chunk tree uuid field is a way to double check the owner
*/
struct
btrfs_dev_extent
{
__le64
chunk_tree
;
__le64
chunk_objectid
;
__le64
chunk_offset
;
__le64
length
;
u8
chunk_tree_uuid
[
BTRFS_UUID_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_inode_ref
{
__le64
index
;
__le16
name_len
;
/* name goes here */
}
__attribute__
((
__packed__
));
struct
btrfs_inode_extref
{
__le64
parent_objectid
;
__le64
index
;
__le16
name_len
;
__u8
name
[
0
];
/* name goes here */
}
__attribute__
((
__packed__
));
struct
btrfs_timespec
{
__le64
sec
;
__le32
nsec
;
}
__attribute__
((
__packed__
));
struct
btrfs_inode_item
{
/* nfs style generation number */
__le64
generation
;
/* transid that last touched this inode */
__le64
transid
;
__le64
size
;
__le64
nbytes
;
__le64
block_group
;
__le32
nlink
;
__le32
uid
;
__le32
gid
;
__le32
mode
;
__le64
rdev
;
__le64
flags
;
/* modification sequence number for NFS */
__le64
sequence
;
/*
* a little future expansion, for more than this we can
* just grow the inode item and version it
*/
__le64
reserved
[
4
];
struct
btrfs_timespec
atime
;
struct
btrfs_timespec
ctime
;
struct
btrfs_timespec
mtime
;
struct
btrfs_timespec
otime
;
}
__attribute__
((
__packed__
));
struct
btrfs_dir_log_item
{
__le64
end
;
}
__attribute__
((
__packed__
));
struct
btrfs_dir_item
{
struct
btrfs_disk_key
location
;
__le64
transid
;
__le16
data_len
;
__le16
name_len
;
u8
type
;
}
__attribute__
((
__packed__
));
#define BTRFS_ROOT_SUBVOL_RDONLY (1ULL << 0)
/*
* Internal in-memory flag that a subvolume has been marked for deletion but
* still visible as a directory
*/
#define BTRFS_ROOT_SUBVOL_DEAD (1ULL << 48)
struct
btrfs_root_item
{
struct
btrfs_inode_item
inode
;
__le64
generation
;
__le64
root_dirid
;
__le64
bytenr
;
__le64
byte_limit
;
__le64
bytes_used
;
__le64
last_snapshot
;
__le64
flags
;
__le32
refs
;
struct
btrfs_disk_key
drop_progress
;
u8
drop_level
;
u8
level
;
/*
* The following fields appear after subvol_uuids+subvol_times
* were introduced.
*/
/*
* This generation number is used to test if the new fields are valid
* and up to date while reading the root item. Every time the root item
* is written out, the "generation" field is copied into this field. If
* anyone ever mounted the fs with an older kernel, we will have
* mismatching generation values here and thus must invalidate the
* new fields. See btrfs_update_root and btrfs_find_last_root for
* details.
* the offset of generation_v2 is also used as the start for the memset
* when invalidating the fields.
*/
__le64
generation_v2
;
u8
uuid
[
BTRFS_UUID_SIZE
];
u8
parent_uuid
[
BTRFS_UUID_SIZE
];
u8
received_uuid
[
BTRFS_UUID_SIZE
];
__le64
ctransid
;
/* updated when an inode changes */
__le64
otransid
;
/* trans when created */
__le64
stransid
;
/* trans when sent. non-zero for received subvol */
__le64
rtransid
;
/* trans when received. non-zero for received subvol */
struct
btrfs_timespec
ctime
;
struct
btrfs_timespec
otime
;
struct
btrfs_timespec
stime
;
struct
btrfs_timespec
rtime
;
__le64
reserved
[
8
];
/* for future */
}
__attribute__
((
__packed__
));
/*
* this is used for both forward and backward root refs
*/
struct
btrfs_root_ref
{
__le64
dirid
;
__le64
sequence
;
__le16
name_len
;
}
__attribute__
((
__packed__
));
struct
btrfs_disk_balance_args
{
/*
* profiles to operate on, single is denoted by
* BTRFS_AVAIL_ALLOC_BIT_SINGLE
*/
__le64
profiles
;
/*
* usage filter
* BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N'
* BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max
*/
union
{
__le64
usage
;
struct
{
__le32
usage_min
;
__le32
usage_max
;
};
};
/* devid filter */
__le64
devid
;
/* devid subset filter [pstart..pend) */
__le64
pstart
;
__le64
pend
;
/* btrfs virtual address space subset filter [vstart..vend) */
__le64
vstart
;
__le64
vend
;
/*
* profile to convert to, single is denoted by
* BTRFS_AVAIL_ALLOC_BIT_SINGLE
*/
__le64
target
;
/* BTRFS_BALANCE_ARGS_* */
__le64
flags
;
/*
* BTRFS_BALANCE_ARGS_LIMIT with value 'limit'
* BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum
* and maximum
*/
union
{
__le64
limit
;
struct
{
__le32
limit_min
;
__le32
limit_max
;
};
};
/*
* Process chunks that cross stripes_min..stripes_max devices,
* BTRFS_BALANCE_ARGS_STRIPES_RANGE
*/
__le32
stripes_min
;
__le32
stripes_max
;
__le64
unused
[
6
];
}
__attribute__
((
__packed__
));
/*
* store balance parameters to disk so that balance can be properly
* resumed after crash or unmount
*/
struct
btrfs_balance_item
{
/* BTRFS_BALANCE_* */
__le64
flags
;
struct
btrfs_disk_balance_args
data
;
struct
btrfs_disk_balance_args
meta
;
struct
btrfs_disk_balance_args
sys
;
__le64
unused
[
4
];
}
__attribute__
((
__packed__
));
#define BTRFS_FILE_EXTENT_INLINE 0
#define BTRFS_FILE_EXTENT_REG 1
#define BTRFS_FILE_EXTENT_PREALLOC 2
struct
btrfs_file_extent_item
{
/*
* transaction id that created this extent
*/
__le64
generation
;
/*
* max number of bytes to hold this extent in ram
* when we split a compressed extent we can't know how big
* each of the resulting pieces will be. So, this is
* an upper limit on the size of the extent in ram instead of
* an exact limit.
*/
__le64
ram_bytes
;
/*
* 32 bits for the various ways we might encode the data,
* including compression and encryption. If any of these
* are set to something a given disk format doesn't understand
* it is treated like an incompat flag for reading and writing,
* but not for stat.
*/
u8
compression
;
u8
encryption
;
__le16
other_encoding
;
/* spare for later use */
/* are we inline data or a real extent? */
u8
type
;
/*
* disk space consumed by the extent, checksum blocks are included
* in these numbers
*
* At this offset in the structure, the inline extent data start.
*/
__le64
disk_bytenr
;
__le64
disk_num_bytes
;
/*
* the logical offset in file blocks (no csums)
* this extent record is for. This allows a file extent to point
* into the middle of an existing extent on disk, sharing it
* between two snapshots (useful if some bytes in the middle of the
* extent have changed
*/
__le64
offset
;
/*
* the logical number of file blocks (no csums included). This
* always reflects the size uncompressed and without encoding.
*/
__le64
num_bytes
;
}
__attribute__
((
__packed__
));
struct
btrfs_csum_item
{
u8
csum
;
}
__attribute__
((
__packed__
));
struct
btrfs_dev_stats_item
{
/*
* grow this item struct at the end for future enhancements and keep
* the existing values unchanged
*/
__le64
values
[
BTRFS_DEV_STAT_VALUES_MAX
];
}
__attribute__
((
__packed__
));
#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS 0
#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID 1
#define BTRFS_DEV_REPLACE_ITEM_STATE_NEVER_STARTED 0
#define BTRFS_DEV_REPLACE_ITEM_STATE_STARTED 1
#define BTRFS_DEV_REPLACE_ITEM_STATE_SUSPENDED 2
#define BTRFS_DEV_REPLACE_ITEM_STATE_FINISHED 3
#define BTRFS_DEV_REPLACE_ITEM_STATE_CANCELED 4
struct
btrfs_dev_replace
{
struct
btrfs_dev_replace
{
u64
replace_state
;
/* see #define above */
u64
replace_state
;
/* see #define above */
u64
time_started
;
/* seconds since 1-Jan-1970 */
u64
time_started
;
/* seconds since 1-Jan-1970 */
...
@@ -1005,175 +384,6 @@ struct btrfs_dev_replace {
...
@@ -1005,175 +384,6 @@ struct btrfs_dev_replace {
struct
btrfs_scrub_progress
scrub_progress
;
struct
btrfs_scrub_progress
scrub_progress
;
};
};
struct
btrfs_dev_replace_item
{
/*
* grow this item struct at the end for future enhancements and keep
* the existing values unchanged
*/
__le64
src_devid
;
__le64
cursor_left
;
__le64
cursor_right
;
__le64
cont_reading_from_srcdev_mode
;
__le64
replace_state
;
__le64
time_started
;
__le64
time_stopped
;
__le64
num_write_errors
;
__le64
num_uncorrectable_read_errors
;
}
__attribute__
((
__packed__
));
/* different types of block groups (and chunks) */
#define BTRFS_BLOCK_GROUP_DATA (1ULL << 0)
#define BTRFS_BLOCK_GROUP_SYSTEM (1ULL << 1)
#define BTRFS_BLOCK_GROUP_METADATA (1ULL << 2)
#define BTRFS_BLOCK_GROUP_RAID0 (1ULL << 3)
#define BTRFS_BLOCK_GROUP_RAID1 (1ULL << 4)
#define BTRFS_BLOCK_GROUP_DUP (1ULL << 5)
#define BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6)
#define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7)
#define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8)
#define BTRFS_BLOCK_GROUP_RESERVED (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \
BTRFS_SPACE_INFO_GLOBAL_RSV)
enum
btrfs_raid_types
{
BTRFS_RAID_RAID10
,
BTRFS_RAID_RAID1
,
BTRFS_RAID_DUP
,
BTRFS_RAID_RAID0
,
BTRFS_RAID_SINGLE
,
BTRFS_RAID_RAID5
,
BTRFS_RAID_RAID6
,
BTRFS_NR_RAID_TYPES
};
#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \
BTRFS_BLOCK_GROUP_SYSTEM | \
BTRFS_BLOCK_GROUP_METADATA)
#define BTRFS_BLOCK_GROUP_PROFILE_MASK (BTRFS_BLOCK_GROUP_RAID0 | \
BTRFS_BLOCK_GROUP_RAID1 | \
BTRFS_BLOCK_GROUP_RAID5 | \
BTRFS_BLOCK_GROUP_RAID6 | \
BTRFS_BLOCK_GROUP_DUP | \
BTRFS_BLOCK_GROUP_RAID10)
#define BTRFS_BLOCK_GROUP_RAID56_MASK (BTRFS_BLOCK_GROUP_RAID5 | \
BTRFS_BLOCK_GROUP_RAID6)
/*
* We need a bit for restriper to be able to tell when chunks of type
* SINGLE are available. This "extended" profile format is used in
* fs_info->avail_*_alloc_bits (in-memory) and balance item fields
* (on-disk). The corresponding on-disk bit in chunk.type is reserved
* to avoid remappings between two formats in future.
*/
#define BTRFS_AVAIL_ALLOC_BIT_SINGLE (1ULL << 48)
/*
* A fake block group type that is used to communicate global block reserve
* size to userspace via the SPACE_INFO ioctl.
*/
#define BTRFS_SPACE_INFO_GLOBAL_RSV (1ULL << 49)
#define BTRFS_EXTENDED_PROFILE_MASK (BTRFS_BLOCK_GROUP_PROFILE_MASK | \
BTRFS_AVAIL_ALLOC_BIT_SINGLE)
static
inline
u64
chunk_to_extended
(
u64
flags
)
{
if
((
flags
&
BTRFS_BLOCK_GROUP_PROFILE_MASK
)
==
0
)
flags
|=
BTRFS_AVAIL_ALLOC_BIT_SINGLE
;
return
flags
;
}
static
inline
u64
extended_to_chunk
(
u64
flags
)
{
return
flags
&
~
BTRFS_AVAIL_ALLOC_BIT_SINGLE
;
}
struct
btrfs_block_group_item
{
__le64
used
;
__le64
chunk_objectid
;
__le64
flags
;
}
__attribute__
((
__packed__
));
struct
btrfs_free_space_info
{
__le32
extent_count
;
__le32
flags
;
}
__attribute__
((
__packed__
));
#define BTRFS_FREE_SPACE_USING_BITMAPS (1ULL << 0)
#define BTRFS_QGROUP_LEVEL_SHIFT 48
static
inline
u64
btrfs_qgroup_level
(
u64
qgroupid
)
{
return
qgroupid
>>
BTRFS_QGROUP_LEVEL_SHIFT
;
}
/*
* is subvolume quota turned on?
*/
#define BTRFS_QGROUP_STATUS_FLAG_ON (1ULL << 0)
/*
* RESCAN is set during the initialization phase
*/
#define BTRFS_QGROUP_STATUS_FLAG_RESCAN (1ULL << 1)
/*
* Some qgroup entries are known to be out of date,
* either because the configuration has changed in a way that
* makes a rescan necessary, or because the fs has been mounted
* with a non-qgroup-aware version.
* Turning qouta off and on again makes it inconsistent, too.
*/
#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT (1ULL << 2)
#define BTRFS_QGROUP_STATUS_VERSION 1
struct
btrfs_qgroup_status_item
{
__le64
version
;
/*
* the generation is updated during every commit. As older
* versions of btrfs are not aware of qgroups, it will be
* possible to detect inconsistencies by checking the
* generation on mount time
*/
__le64
generation
;
/* flag definitions see above */
__le64
flags
;
/*
* only used during scanning to record the progress
* of the scan. It contains a logical address
*/
__le64
rescan
;
}
__attribute__
((
__packed__
));
struct
btrfs_qgroup_info_item
{
__le64
generation
;
__le64
rfer
;
__le64
rfer_cmpr
;
__le64
excl
;
__le64
excl_cmpr
;
}
__attribute__
((
__packed__
));
/* flags definition for qgroup limits */
#define BTRFS_QGROUP_LIMIT_MAX_RFER (1ULL << 0)
#define BTRFS_QGROUP_LIMIT_MAX_EXCL (1ULL << 1)
#define BTRFS_QGROUP_LIMIT_RSV_RFER (1ULL << 2)
#define BTRFS_QGROUP_LIMIT_RSV_EXCL (1ULL << 3)
#define BTRFS_QGROUP_LIMIT_RFER_CMPR (1ULL << 4)
#define BTRFS_QGROUP_LIMIT_EXCL_CMPR (1ULL << 5)
struct
btrfs_qgroup_limit_item
{
/*
* only updated when any of the other values change
*/
__le64
flags
;
__le64
max_rfer
;
__le64
max_excl
;
__le64
rsv_rfer
;
__le64
rsv_excl
;
}
__attribute__
((
__packed__
));
/* For raid type sysfs entries */
/* For raid type sysfs entries */
struct
raid_kobject
{
struct
raid_kobject
{
int
raid_type
;
int
raid_type
;
...
@@ -2026,228 +1236,6 @@ struct btrfs_root {
...
@@ -2026,228 +1236,6 @@ struct btrfs_root {
atomic_t
qgroup_meta_rsv
;
atomic_t
qgroup_meta_rsv
;
};
};
struct
btrfs_ioctl_defrag_range_args
{
/* start of the defrag operation */
__u64
start
;
/* number of bytes to defrag, use (u64)-1 to say all */
__u64
len
;
/*
* flags for the operation, which can include turning
* on compression for this one defrag
*/
__u64
flags
;
/*
* any extent bigger than this will be considered
* already defragged. Use 0 to take the kernel default
* Use 1 to say every single extent must be rewritten
*/
__u32
extent_thresh
;
/*
* which compression method to use if turning on compression
* for this defrag operation. If unspecified, zlib will
* be used
*/
__u32
compress_type
;
/* spare for later */
__u32
unused
[
4
];
};
/*
* inode items have the data typically returned from stat and store other
* info about object characteristics. There is one for every file and dir in
* the FS
*/
#define BTRFS_INODE_ITEM_KEY 1
#define BTRFS_INODE_REF_KEY 12
#define BTRFS_INODE_EXTREF_KEY 13
#define BTRFS_XATTR_ITEM_KEY 24
#define BTRFS_ORPHAN_ITEM_KEY 48
/* reserve 2-15 close to the inode for later flexibility */
/*
* dir items are the name -> inode pointers in a directory. There is one
* for every name in a directory.
*/
#define BTRFS_DIR_LOG_ITEM_KEY 60
#define BTRFS_DIR_LOG_INDEX_KEY 72
#define BTRFS_DIR_ITEM_KEY 84
#define BTRFS_DIR_INDEX_KEY 96
/*
* extent data is for file data
*/
#define BTRFS_EXTENT_DATA_KEY 108
/*
* extent csums are stored in a separate tree and hold csums for
* an entire extent on disk.
*/
#define BTRFS_EXTENT_CSUM_KEY 128
/*
* root items point to tree roots. They are typically in the root
* tree used by the super block to find all the other trees
*/
#define BTRFS_ROOT_ITEM_KEY 132
/*
* root backrefs tie subvols and snapshots to the directory entries that
* reference them
*/
#define BTRFS_ROOT_BACKREF_KEY 144
/*
* root refs make a fast index for listing all of the snapshots and
* subvolumes referenced by a given root. They point directly to the
* directory item in the root that references the subvol
*/
#define BTRFS_ROOT_REF_KEY 156
/*
* extent items are in the extent map tree. These record which blocks
* are used, and how many references there are to each block
*/
#define BTRFS_EXTENT_ITEM_KEY 168
/*
* The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know
* the length, so we save the level in key->offset instead of the length.
*/
#define BTRFS_METADATA_ITEM_KEY 169
#define BTRFS_TREE_BLOCK_REF_KEY 176
#define BTRFS_EXTENT_DATA_REF_KEY 178
#define BTRFS_EXTENT_REF_V0_KEY 180
#define BTRFS_SHARED_BLOCK_REF_KEY 182
#define BTRFS_SHARED_DATA_REF_KEY 184
/*
* block groups give us hints into the extent allocation trees. Which
* blocks are free etc etc
*/
#define BTRFS_BLOCK_GROUP_ITEM_KEY 192
/*
* Every block group is represented in the free space tree by a free space info
* item, which stores some accounting information. It is keyed on
* (block_group_start, FREE_SPACE_INFO, block_group_length).
*/
#define BTRFS_FREE_SPACE_INFO_KEY 198
/*
* A free space extent tracks an extent of space that is free in a block group.
* It is keyed on (start, FREE_SPACE_EXTENT, length).
*/
#define BTRFS_FREE_SPACE_EXTENT_KEY 199
/*
* When a block group becomes very fragmented, we convert it to use bitmaps
* instead of extents. A free space bitmap is keyed on
* (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with
* (length / sectorsize) bits.
*/
#define BTRFS_FREE_SPACE_BITMAP_KEY 200
#define BTRFS_DEV_EXTENT_KEY 204
#define BTRFS_DEV_ITEM_KEY 216
#define BTRFS_CHUNK_ITEM_KEY 228
/*
* Records the overall state of the qgroups.
* There's only one instance of this key present,
* (0, BTRFS_QGROUP_STATUS_KEY, 0)
*/
#define BTRFS_QGROUP_STATUS_KEY 240
/*
* Records the currently used space of the qgroup.
* One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid).
*/
#define BTRFS_QGROUP_INFO_KEY 242
/*
* Contains the user configured limits for the qgroup.
* One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid).
*/
#define BTRFS_QGROUP_LIMIT_KEY 244
/*
* Records the child-parent relationship of qgroups. For
* each relation, 2 keys are present:
* (childid, BTRFS_QGROUP_RELATION_KEY, parentid)
* (parentid, BTRFS_QGROUP_RELATION_KEY, childid)
*/
#define BTRFS_QGROUP_RELATION_KEY 246
/*
* Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY.
*/
#define BTRFS_BALANCE_ITEM_KEY 248
/*
* The key type for tree items that are stored persistently, but do not need to
* exist for extended period of time. The items can exist in any tree.
*
* [subtype, BTRFS_TEMPORARY_ITEM_KEY, data]
*
* Existing items:
*
* - balance status item
* (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0)
*/
#define BTRFS_TEMPORARY_ITEM_KEY 248
/*
* Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY
*/
#define BTRFS_DEV_STATS_KEY 249
/*
* The key type for tree items that are stored persistently and usually exist
* for a long period, eg. filesystem lifetime. The item kinds can be status
* information, stats or preference values. The item can exist in any tree.
*
* [subtype, BTRFS_PERSISTENT_ITEM_KEY, data]
*
* Existing items:
*
* - device statistics, store IO stats in the device tree, one key for all
* stats
* (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0)
*/
#define BTRFS_PERSISTENT_ITEM_KEY 249
/*
* Persistantly stores the device replace state in the device tree.
* The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0).
*/
#define BTRFS_DEV_REPLACE_KEY 250
/*
* Stores items that allow to quickly map UUIDs to something else.
* These items are part of the filesystem UUID tree.
* The key is built like this:
* (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits).
*/
#if BTRFS_UUID_SIZE != 16
#error "UUID items require BTRFS_UUID_SIZE == 16!"
#endif
#define BTRFS_UUID_KEY_SUBVOL 251
/* for UUIDs assigned to subvols */
#define BTRFS_UUID_KEY_RECEIVED_SUBVOL 252
/* for UUIDs assigned to
* received subvols */
/*
* string items are for debugging. They just store a short string of
* data in the FS
*/
#define BTRFS_STRING_ITEM_KEY 253
/*
/*
* Flags for mount options.
* Flags for mount options.
*
*
...
...
fs/btrfs/volumes.h
浏览文件 @
680834ca
...
@@ -357,52 +357,6 @@ struct map_lookup {
...
@@ -357,52 +357,6 @@ struct map_lookup {
#define map_lookup_size(n) (sizeof(struct map_lookup) + \
#define map_lookup_size(n) (sizeof(struct map_lookup) + \
(sizeof(struct btrfs_bio_stripe) * (n)))
(sizeof(struct btrfs_bio_stripe) * (n)))
/*
* Restriper's general type filter
*/
#define BTRFS_BALANCE_DATA (1ULL << 0)
#define BTRFS_BALANCE_SYSTEM (1ULL << 1)
#define BTRFS_BALANCE_METADATA (1ULL << 2)
#define BTRFS_BALANCE_TYPE_MASK (BTRFS_BALANCE_DATA | \
BTRFS_BALANCE_SYSTEM | \
BTRFS_BALANCE_METADATA)
#define BTRFS_BALANCE_FORCE (1ULL << 3)
#define BTRFS_BALANCE_RESUME (1ULL << 4)
/*
* Balance filters
*/
#define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0)
#define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1)
#define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2)
#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
#define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5)
#define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6)
#define BTRFS_BALANCE_ARGS_STRIPES_RANGE (1ULL << 7)
#define BTRFS_BALANCE_ARGS_USAGE_RANGE (1ULL << 10)
#define BTRFS_BALANCE_ARGS_MASK \
(BTRFS_BALANCE_ARGS_PROFILES | \
BTRFS_BALANCE_ARGS_USAGE | \
BTRFS_BALANCE_ARGS_DEVID | \
BTRFS_BALANCE_ARGS_DRANGE | \
BTRFS_BALANCE_ARGS_VRANGE | \
BTRFS_BALANCE_ARGS_LIMIT | \
BTRFS_BALANCE_ARGS_LIMIT_RANGE | \
BTRFS_BALANCE_ARGS_STRIPES_RANGE | \
BTRFS_BALANCE_ARGS_USAGE_RANGE)
/*
* Profile changing flags. When SOFT is set we won't relocate chunk if
* it already has the target profile (even though it may be
* half-filled).
*/
#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8)
#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9)
struct
btrfs_balance_args
;
struct
btrfs_balance_args
;
struct
btrfs_balance_progress
;
struct
btrfs_balance_progress
;
struct
btrfs_balance_control
{
struct
btrfs_balance_control
{
...
...
include/uapi/linux/btrfs.h
浏览文件 @
680834ca
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#define BTRFS_IOCTL_MAGIC 0x94
#define BTRFS_IOCTL_MAGIC 0x94
#define BTRFS_VOL_NAME_MAX 255
#define BTRFS_VOL_NAME_MAX 255
#define BTRFS_LABEL_SIZE 256
/* this should be 4k */
/* this should be 4k */
#define BTRFS_PATH_NAME_MAX 4087
#define BTRFS_PATH_NAME_MAX 4087
...
@@ -33,9 +34,6 @@ struct btrfs_ioctl_vol_args {
...
@@ -33,9 +34,6 @@ struct btrfs_ioctl_vol_args {
#define BTRFS_DEVICE_PATH_NAME_MAX 1024
#define BTRFS_DEVICE_PATH_NAME_MAX 1024
#define BTRFS_SUBVOL_CREATE_ASYNC (1ULL << 0)
#define BTRFS_SUBVOL_RDONLY (1ULL << 1)
#define BTRFS_SUBVOL_QGROUP_INHERIT (1ULL << 2)
#define BTRFS_DEVICE_SPEC_BY_ID (1ULL << 3)
#define BTRFS_DEVICE_SPEC_BY_ID (1ULL << 3)
#define BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED \
#define BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED \
...
@@ -48,7 +46,19 @@ struct btrfs_ioctl_vol_args {
...
@@ -48,7 +46,19 @@ struct btrfs_ioctl_vol_args {
#define BTRFS_UUID_SIZE 16
#define BTRFS_UUID_SIZE 16
#define BTRFS_UUID_UNPARSED_SIZE 37
#define BTRFS_UUID_UNPARSED_SIZE 37
#define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0)
/*
* flags definition for qgroup limits
*
* Used by:
* struct btrfs_qgroup_limit.flags
* struct btrfs_qgroup_limit_item.flags
*/
#define BTRFS_QGROUP_LIMIT_MAX_RFER (1ULL << 0)
#define BTRFS_QGROUP_LIMIT_MAX_EXCL (1ULL << 1)
#define BTRFS_QGROUP_LIMIT_RSV_RFER (1ULL << 2)
#define BTRFS_QGROUP_LIMIT_RSV_EXCL (1ULL << 3)
#define BTRFS_QGROUP_LIMIT_RFER_CMPR (1ULL << 4)
#define BTRFS_QGROUP_LIMIT_EXCL_CMPR (1ULL << 5)
struct
btrfs_qgroup_limit
{
struct
btrfs_qgroup_limit
{
__u64
flags
;
__u64
flags
;
...
@@ -58,6 +68,14 @@ struct btrfs_qgroup_limit {
...
@@ -58,6 +68,14 @@ struct btrfs_qgroup_limit {
__u64
rsv_excl
;
__u64
rsv_excl
;
};
};
/*
* flags definition for qgroup inheritance
*
* Used by:
* struct btrfs_qgroup_inherit.flags
*/
#define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0)
struct
btrfs_qgroup_inherit
{
struct
btrfs_qgroup_inherit
{
__u64
flags
;
__u64
flags
;
__u64
num_qgroups
;
__u64
num_qgroups
;
...
@@ -72,6 +90,20 @@ struct btrfs_ioctl_qgroup_limit_args {
...
@@ -72,6 +90,20 @@ struct btrfs_ioctl_qgroup_limit_args {
struct
btrfs_qgroup_limit
lim
;
struct
btrfs_qgroup_limit
lim
;
};
};
/*
* flags for subvolumes
*
* Used by:
* struct btrfs_ioctl_vol_args_v2.flags
*
* BTRFS_SUBVOL_RDONLY is also provided/consumed by the following ioctls:
* - BTRFS_IOC_SUBVOL_GETFLAGS
* - BTRFS_IOC_SUBVOL_SETFLAGS
*/
#define BTRFS_SUBVOL_CREATE_ASYNC (1ULL << 0)
#define BTRFS_SUBVOL_RDONLY (1ULL << 1)
#define BTRFS_SUBVOL_QGROUP_INHERIT (1ULL << 2)
#define BTRFS_SUBVOL_NAME_MAX 4039
#define BTRFS_SUBVOL_NAME_MAX 4039
struct
btrfs_ioctl_vol_args_v2
{
struct
btrfs_ioctl_vol_args_v2
{
__s64
fd
;
__s64
fd
;
...
@@ -201,6 +233,37 @@ struct btrfs_ioctl_fs_info_args {
...
@@ -201,6 +233,37 @@ struct btrfs_ioctl_fs_info_args {
__u64
reserved
[
122
];
/* pad to 1k */
__u64
reserved
[
122
];
/* pad to 1k */
};
};
/*
* feature flags
*
* Used by:
* struct btrfs_ioctl_feature_flags
*/
#define BTRFS_FEATURE_COMPAT_RO_FREE_SPACE_TREE (1ULL << 0)
#define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0)
#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (1ULL << 1)
#define BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS (1ULL << 2)
#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO (1ULL << 3)
/*
* some patches floated around with a second compression method
* lets save that incompat here for when they do get in
* Note we don't actually support it, we're just reserving the
* number
*/
#define BTRFS_FEATURE_INCOMPAT_COMPRESS_LZOv2 (1ULL << 4)
/*
* older kernels tried to do bigger metadata blocks, but the
* code was pretty buggy. Lets not let them try anymore.
*/
#define BTRFS_FEATURE_INCOMPAT_BIG_METADATA (1ULL << 5)
#define BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF (1ULL << 6)
#define BTRFS_FEATURE_INCOMPAT_RAID56 (1ULL << 7)
#define BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA (1ULL << 8)
#define BTRFS_FEATURE_INCOMPAT_NO_HOLES (1ULL << 9)
struct
btrfs_ioctl_feature_flags
{
struct
btrfs_ioctl_feature_flags
{
__u64
compat_flags
;
__u64
compat_flags
;
__u64
compat_ro_flags
;
__u64
compat_ro_flags
;
...
@@ -265,6 +328,70 @@ struct btrfs_balance_progress {
...
@@ -265,6 +328,70 @@ struct btrfs_balance_progress {
__u64
completed
;
/* # of chunks relocated so far */
__u64
completed
;
/* # of chunks relocated so far */
};
};
/*
* flags definition for balance
*
* Restriper's general type filter
*
* Used by:
* btrfs_ioctl_balance_args.flags
* btrfs_balance_control.flags (internal)
*/
#define BTRFS_BALANCE_DATA (1ULL << 0)
#define BTRFS_BALANCE_SYSTEM (1ULL << 1)
#define BTRFS_BALANCE_METADATA (1ULL << 2)
#define BTRFS_BALANCE_TYPE_MASK (BTRFS_BALANCE_DATA | \
BTRFS_BALANCE_SYSTEM | \
BTRFS_BALANCE_METADATA)
#define BTRFS_BALANCE_FORCE (1ULL << 3)
#define BTRFS_BALANCE_RESUME (1ULL << 4)
/*
* flags definitions for per-type balance args
*
* Balance filters
*
* Used by:
* struct btrfs_balance_args
*/
#define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0)
#define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1)
#define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2)
#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
#define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5)
#define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6)
#define BTRFS_BALANCE_ARGS_STRIPES_RANGE (1ULL << 7)
#define BTRFS_BALANCE_ARGS_USAGE_RANGE (1ULL << 10)
#define BTRFS_BALANCE_ARGS_MASK \
(BTRFS_BALANCE_ARGS_PROFILES | \
BTRFS_BALANCE_ARGS_USAGE | \
BTRFS_BALANCE_ARGS_DEVID | \
BTRFS_BALANCE_ARGS_DRANGE | \
BTRFS_BALANCE_ARGS_VRANGE | \
BTRFS_BALANCE_ARGS_LIMIT | \
BTRFS_BALANCE_ARGS_LIMIT_RANGE | \
BTRFS_BALANCE_ARGS_STRIPES_RANGE | \
BTRFS_BALANCE_ARGS_USAGE_RANGE)
/*
* Profile changing flags. When SOFT is set we won't relocate chunk if
* it already has the target profile (even though it may be
* half-filled).
*/
#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8)
#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9)
/*
* flags definition for balance state
*
* Used by:
* struct btrfs_ioctl_balance_args.state
*/
#define BTRFS_BALANCE_STATE_RUNNING (1ULL << 0)
#define BTRFS_BALANCE_STATE_RUNNING (1ULL << 0)
#define BTRFS_BALANCE_STATE_PAUSE_REQ (1ULL << 1)
#define BTRFS_BALANCE_STATE_PAUSE_REQ (1ULL << 1)
#define BTRFS_BALANCE_STATE_CANCEL_REQ (1ULL << 2)
#define BTRFS_BALANCE_STATE_CANCEL_REQ (1ULL << 2)
...
@@ -358,9 +485,45 @@ struct btrfs_ioctl_clone_range_args {
...
@@ -358,9 +485,45 @@ struct btrfs_ioctl_clone_range_args {
__u64
dest_offset
;
__u64
dest_offset
;
};
};
/* flags for the defrag range ioctl */
/*
* flags definition for the defrag range ioctl
*
* Used by:
* struct btrfs_ioctl_defrag_range_args.flags
*/
#define BTRFS_DEFRAG_RANGE_COMPRESS 1
#define BTRFS_DEFRAG_RANGE_COMPRESS 1
#define BTRFS_DEFRAG_RANGE_START_IO 2
#define BTRFS_DEFRAG_RANGE_START_IO 2
struct
btrfs_ioctl_defrag_range_args
{
/* start of the defrag operation */
__u64
start
;
/* number of bytes to defrag, use (u64)-1 to say all */
__u64
len
;
/*
* flags for the operation, which can include turning
* on compression for this one defrag
*/
__u64
flags
;
/*
* any extent bigger than this will be considered
* already defragged. Use 0 to take the kernel default
* Use 1 to say every single extent must be rewritten
*/
__u32
extent_thresh
;
/*
* which compression method to use if turning on compression
* for this defrag operation. If unspecified, zlib will
* be used
*/
__u32
compress_type
;
/* spare for later */
__u32
unused
[
4
];
};
#define BTRFS_SAME_DATA_DIFFERS 1
#define BTRFS_SAME_DATA_DIFFERS 1
/* For extent-same ioctl */
/* For extent-same ioctl */
...
...
include/uapi/linux/btrfs_tree.h
0 → 100644
浏览文件 @
680834ca
#ifndef _BTRFS_CTREE_H_
#define _BTRFS_CTREE_H_
/*
* This header contains the structure definitions and constants used
* by file system objects that can be retrieved using
* the BTRFS_IOC_SEARCH_TREE ioctl. That means basically anything that
* is needed to describe a leaf node's key or item contents.
*/
/* holds pointers to all of the tree roots */
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
/* stores information about which extents are in use, and reference counts */
#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
/*
* chunk tree stores translations from logical -> physical block numbering
* the super block points to the chunk tree
*/
#define BTRFS_CHUNK_TREE_OBJECTID 3ULL
/*
* stores information about which areas of a given device are in use.
* one per device. The tree of tree roots points to the device tree
*/
#define BTRFS_DEV_TREE_OBJECTID 4ULL
/* one per subvolume, storing files and directories */
#define BTRFS_FS_TREE_OBJECTID 5ULL
/* directory objectid inside the root tree */
#define BTRFS_ROOT_TREE_DIR_OBJECTID 6ULL
/* holds checksums of all the data extents */
#define BTRFS_CSUM_TREE_OBJECTID 7ULL
/* holds quota configuration and tracking */
#define BTRFS_QUOTA_TREE_OBJECTID 8ULL
/* for storing items that use the BTRFS_UUID_KEY* types */
#define BTRFS_UUID_TREE_OBJECTID 9ULL
/* tracks free space in block groups. */
#define BTRFS_FREE_SPACE_TREE_OBJECTID 10ULL
/* device stats in the device tree */
#define BTRFS_DEV_STATS_OBJECTID 0ULL
/* for storing balance parameters in the root tree */
#define BTRFS_BALANCE_OBJECTID -4ULL
/* orhpan objectid for tracking unlinked/truncated files */
#define BTRFS_ORPHAN_OBJECTID -5ULL
/* does write ahead logging to speed up fsyncs */
#define BTRFS_TREE_LOG_OBJECTID -6ULL
#define BTRFS_TREE_LOG_FIXUP_OBJECTID -7ULL
/* for space balancing */
#define BTRFS_TREE_RELOC_OBJECTID -8ULL
#define BTRFS_DATA_RELOC_TREE_OBJECTID -9ULL
/*
* extent checksums all have this objectid
* this allows them to share the logging tree
* for fsyncs
*/
#define BTRFS_EXTENT_CSUM_OBJECTID -10ULL
/* For storing free space cache */
#define BTRFS_FREE_SPACE_OBJECTID -11ULL
/*
* The inode number assigned to the special inode for storing
* free ino cache
*/
#define BTRFS_FREE_INO_OBJECTID -12ULL
/* dummy objectid represents multiple objectids */
#define BTRFS_MULTIPLE_OBJECTIDS -255ULL
/*
* All files have objectids in this range.
*/
#define BTRFS_FIRST_FREE_OBJECTID 256ULL
#define BTRFS_LAST_FREE_OBJECTID -256ULL
#define BTRFS_FIRST_CHUNK_TREE_OBJECTID 256ULL
/*
* the device items go into the chunk tree. The key is in the form
* [ 1 BTRFS_DEV_ITEM_KEY device_id ]
*/
#define BTRFS_DEV_ITEMS_OBJECTID 1ULL
#define BTRFS_BTREE_INODE_OBJECTID 1
#define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2
#define BTRFS_DEV_REPLACE_DEVID 0ULL
/*
* inode items have the data typically returned from stat and store other
* info about object characteristics. There is one for every file and dir in
* the FS
*/
#define BTRFS_INODE_ITEM_KEY 1
#define BTRFS_INODE_REF_KEY 12
#define BTRFS_INODE_EXTREF_KEY 13
#define BTRFS_XATTR_ITEM_KEY 24
#define BTRFS_ORPHAN_ITEM_KEY 48
/* reserve 2-15 close to the inode for later flexibility */
/*
* dir items are the name -> inode pointers in a directory. There is one
* for every name in a directory.
*/
#define BTRFS_DIR_LOG_ITEM_KEY 60
#define BTRFS_DIR_LOG_INDEX_KEY 72
#define BTRFS_DIR_ITEM_KEY 84
#define BTRFS_DIR_INDEX_KEY 96
/*
* extent data is for file data
*/
#define BTRFS_EXTENT_DATA_KEY 108
/*
* extent csums are stored in a separate tree and hold csums for
* an entire extent on disk.
*/
#define BTRFS_EXTENT_CSUM_KEY 128
/*
* root items point to tree roots. They are typically in the root
* tree used by the super block to find all the other trees
*/
#define BTRFS_ROOT_ITEM_KEY 132
/*
* root backrefs tie subvols and snapshots to the directory entries that
* reference them
*/
#define BTRFS_ROOT_BACKREF_KEY 144
/*
* root refs make a fast index for listing all of the snapshots and
* subvolumes referenced by a given root. They point directly to the
* directory item in the root that references the subvol
*/
#define BTRFS_ROOT_REF_KEY 156
/*
* extent items are in the extent map tree. These record which blocks
* are used, and how many references there are to each block
*/
#define BTRFS_EXTENT_ITEM_KEY 168
/*
* The same as the BTRFS_EXTENT_ITEM_KEY, except it's metadata we already know
* the length, so we save the level in key->offset instead of the length.
*/
#define BTRFS_METADATA_ITEM_KEY 169
#define BTRFS_TREE_BLOCK_REF_KEY 176
#define BTRFS_EXTENT_DATA_REF_KEY 178
#define BTRFS_EXTENT_REF_V0_KEY 180
#define BTRFS_SHARED_BLOCK_REF_KEY 182
#define BTRFS_SHARED_DATA_REF_KEY 184
/*
* block groups give us hints into the extent allocation trees. Which
* blocks are free etc etc
*/
#define BTRFS_BLOCK_GROUP_ITEM_KEY 192
/*
* Every block group is represented in the free space tree by a free space info
* item, which stores some accounting information. It is keyed on
* (block_group_start, FREE_SPACE_INFO, block_group_length).
*/
#define BTRFS_FREE_SPACE_INFO_KEY 198
/*
* A free space extent tracks an extent of space that is free in a block group.
* It is keyed on (start, FREE_SPACE_EXTENT, length).
*/
#define BTRFS_FREE_SPACE_EXTENT_KEY 199
/*
* When a block group becomes very fragmented, we convert it to use bitmaps
* instead of extents. A free space bitmap is keyed on
* (start, FREE_SPACE_BITMAP, length); the corresponding item is a bitmap with
* (length / sectorsize) bits.
*/
#define BTRFS_FREE_SPACE_BITMAP_KEY 200
#define BTRFS_DEV_EXTENT_KEY 204
#define BTRFS_DEV_ITEM_KEY 216
#define BTRFS_CHUNK_ITEM_KEY 228
/*
* Records the overall state of the qgroups.
* There's only one instance of this key present,
* (0, BTRFS_QGROUP_STATUS_KEY, 0)
*/
#define BTRFS_QGROUP_STATUS_KEY 240
/*
* Records the currently used space of the qgroup.
* One key per qgroup, (0, BTRFS_QGROUP_INFO_KEY, qgroupid).
*/
#define BTRFS_QGROUP_INFO_KEY 242
/*
* Contains the user configured limits for the qgroup.
* One key per qgroup, (0, BTRFS_QGROUP_LIMIT_KEY, qgroupid).
*/
#define BTRFS_QGROUP_LIMIT_KEY 244
/*
* Records the child-parent relationship of qgroups. For
* each relation, 2 keys are present:
* (childid, BTRFS_QGROUP_RELATION_KEY, parentid)
* (parentid, BTRFS_QGROUP_RELATION_KEY, childid)
*/
#define BTRFS_QGROUP_RELATION_KEY 246
/*
* Obsolete name, see BTRFS_TEMPORARY_ITEM_KEY.
*/
#define BTRFS_BALANCE_ITEM_KEY 248
/*
* The key type for tree items that are stored persistently, but do not need to
* exist for extended period of time. The items can exist in any tree.
*
* [subtype, BTRFS_TEMPORARY_ITEM_KEY, data]
*
* Existing items:
*
* - balance status item
* (BTRFS_BALANCE_OBJECTID, BTRFS_TEMPORARY_ITEM_KEY, 0)
*/
#define BTRFS_TEMPORARY_ITEM_KEY 248
/*
* Obsolete name, see BTRFS_PERSISTENT_ITEM_KEY
*/
#define BTRFS_DEV_STATS_KEY 249
/*
* The key type for tree items that are stored persistently and usually exist
* for a long period, eg. filesystem lifetime. The item kinds can be status
* information, stats or preference values. The item can exist in any tree.
*
* [subtype, BTRFS_PERSISTENT_ITEM_KEY, data]
*
* Existing items:
*
* - device statistics, store IO stats in the device tree, one key for all
* stats
* (BTRFS_DEV_STATS_OBJECTID, BTRFS_DEV_STATS_KEY, 0)
*/
#define BTRFS_PERSISTENT_ITEM_KEY 249
/*
* Persistantly stores the device replace state in the device tree.
* The key is built like this: (0, BTRFS_DEV_REPLACE_KEY, 0).
*/
#define BTRFS_DEV_REPLACE_KEY 250
/*
* Stores items that allow to quickly map UUIDs to something else.
* These items are part of the filesystem UUID tree.
* The key is built like this:
* (UUID_upper_64_bits, BTRFS_UUID_KEY*, UUID_lower_64_bits).
*/
#if BTRFS_UUID_SIZE != 16
#error "UUID items require BTRFS_UUID_SIZE == 16!"
#endif
#define BTRFS_UUID_KEY_SUBVOL 251
/* for UUIDs assigned to subvols */
#define BTRFS_UUID_KEY_RECEIVED_SUBVOL 252
/* for UUIDs assigned to
* received subvols */
/*
* string items are for debugging. They just store a short string of
* data in the FS
*/
#define BTRFS_STRING_ITEM_KEY 253
/* 32 bytes in various csum fields */
#define BTRFS_CSUM_SIZE 32
/* csum types */
#define BTRFS_CSUM_TYPE_CRC32 0
/*
* flags definitions for directory entry item type
*
* Used by:
* struct btrfs_dir_item.type
*/
#define BTRFS_FT_UNKNOWN 0
#define BTRFS_FT_REG_FILE 1
#define BTRFS_FT_DIR 2
#define BTRFS_FT_CHRDEV 3
#define BTRFS_FT_BLKDEV 4
#define BTRFS_FT_FIFO 5
#define BTRFS_FT_SOCK 6
#define BTRFS_FT_SYMLINK 7
#define BTRFS_FT_XATTR 8
#define BTRFS_FT_MAX 9
/*
* The key defines the order in the tree, and so it also defines (optimal)
* block layout.
*
* objectid corresponds to the inode number.
*
* type tells us things about the object, and is a kind of stream selector.
* so for a given inode, keys with type of 1 might refer to the inode data,
* type of 2 may point to file data in the btree and type == 3 may point to
* extents.
*
* offset is the starting byte offset for this key in the stream.
*
* btrfs_disk_key is in disk byte order. struct btrfs_key is always
* in cpu native order. Otherwise they are identical and their sizes
* should be the same (ie both packed)
*/
struct
btrfs_disk_key
{
__le64
objectid
;
__u8
type
;
__le64
offset
;
}
__attribute__
((
__packed__
));
struct
btrfs_key
{
__u64
objectid
;
__u8
type
;
__u64
offset
;
}
__attribute__
((
__packed__
));
struct
btrfs_dev_item
{
/* the internal btrfs device id */
__le64
devid
;
/* size of the device */
__le64
total_bytes
;
/* bytes used */
__le64
bytes_used
;
/* optimal io alignment for this device */
__le32
io_align
;
/* optimal io width for this device */
__le32
io_width
;
/* minimal io size for this device */
__le32
sector_size
;
/* type and info about this device */
__le64
type
;
/* expected generation for this device */
__le64
generation
;
/*
* starting byte of this partition on the device,
* to allow for stripe alignment in the future
*/
__le64
start_offset
;
/* grouping information for allocation decisions */
__le32
dev_group
;
/* seek speed 0-100 where 100 is fastest */
__u8
seek_speed
;
/* bandwidth 0-100 where 100 is fastest */
__u8
bandwidth
;
/* btrfs generated uuid for this device */
__u8
uuid
[
BTRFS_UUID_SIZE
];
/* uuid of FS who owns this device */
__u8
fsid
[
BTRFS_UUID_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_stripe
{
__le64
devid
;
__le64
offset
;
__u8
dev_uuid
[
BTRFS_UUID_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_chunk
{
/* size of this chunk in bytes */
__le64
length
;
/* objectid of the root referencing this chunk */
__le64
owner
;
__le64
stripe_len
;
__le64
type
;
/* optimal io alignment for this chunk */
__le32
io_align
;
/* optimal io width for this chunk */
__le32
io_width
;
/* minimal io size for this chunk */
__le32
sector_size
;
/* 2^16 stripes is quite a lot, a second limit is the size of a single
* item in the btree
*/
__le16
num_stripes
;
/* sub stripes only matter for raid10 */
__le16
sub_stripes
;
struct
btrfs_stripe
stripe
;
/* additional stripes go here */
}
__attribute__
((
__packed__
));
#define BTRFS_FREE_SPACE_EXTENT 1
#define BTRFS_FREE_SPACE_BITMAP 2
struct
btrfs_free_space_entry
{
__le64
offset
;
__le64
bytes
;
__u8
type
;
}
__attribute__
((
__packed__
));
struct
btrfs_free_space_header
{
struct
btrfs_disk_key
location
;
__le64
generation
;
__le64
num_entries
;
__le64
num_bitmaps
;
}
__attribute__
((
__packed__
));
#define BTRFS_HEADER_FLAG_WRITTEN (1ULL << 0)
#define BTRFS_HEADER_FLAG_RELOC (1ULL << 1)
/* Super block flags */
/* Errors detected */
#define BTRFS_SUPER_FLAG_ERROR (1ULL << 2)
#define BTRFS_SUPER_FLAG_SEEDING (1ULL << 32)
#define BTRFS_SUPER_FLAG_METADUMP (1ULL << 33)
/*
* items in the extent btree are used to record the objectid of the
* owner of the block and the number of references
*/
struct
btrfs_extent_item
{
__le64
refs
;
__le64
generation
;
__le64
flags
;
}
__attribute__
((
__packed__
));
struct
btrfs_extent_item_v0
{
__le32
refs
;
}
__attribute__
((
__packed__
));
#define BTRFS_EXTENT_FLAG_DATA (1ULL << 0)
#define BTRFS_EXTENT_FLAG_TREE_BLOCK (1ULL << 1)
/* following flags only apply to tree blocks */
/* use full backrefs for extent pointers in the block */
#define BTRFS_BLOCK_FLAG_FULL_BACKREF (1ULL << 8)
/*
* this flag is only used internally by scrub and may be changed at any time
* it is only declared here to avoid collisions
*/
#define BTRFS_EXTENT_FLAG_SUPER (1ULL << 48)
struct
btrfs_tree_block_info
{
struct
btrfs_disk_key
key
;
__u8
level
;
}
__attribute__
((
__packed__
));
struct
btrfs_extent_data_ref
{
__le64
root
;
__le64
objectid
;
__le64
offset
;
__le32
count
;
}
__attribute__
((
__packed__
));
struct
btrfs_shared_data_ref
{
__le32
count
;
}
__attribute__
((
__packed__
));
struct
btrfs_extent_inline_ref
{
__u8
type
;
__le64
offset
;
}
__attribute__
((
__packed__
));
/* old style backrefs item */
struct
btrfs_extent_ref_v0
{
__le64
root
;
__le64
generation
;
__le64
objectid
;
__le32
count
;
}
__attribute__
((
__packed__
));
/* dev extents record free space on individual devices. The owner
* field points back to the chunk allocation mapping tree that allocated
* the extent. The chunk tree uuid field is a way to double check the owner
*/
struct
btrfs_dev_extent
{
__le64
chunk_tree
;
__le64
chunk_objectid
;
__le64
chunk_offset
;
__le64
length
;
__u8
chunk_tree_uuid
[
BTRFS_UUID_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_inode_ref
{
__le64
index
;
__le16
name_len
;
/* name goes here */
}
__attribute__
((
__packed__
));
struct
btrfs_inode_extref
{
__le64
parent_objectid
;
__le64
index
;
__le16
name_len
;
__u8
name
[
0
];
/* name goes here */
}
__attribute__
((
__packed__
));
struct
btrfs_timespec
{
__le64
sec
;
__le32
nsec
;
}
__attribute__
((
__packed__
));
struct
btrfs_inode_item
{
/* nfs style generation number */
__le64
generation
;
/* transid that last touched this inode */
__le64
transid
;
__le64
size
;
__le64
nbytes
;
__le64
block_group
;
__le32
nlink
;
__le32
uid
;
__le32
gid
;
__le32
mode
;
__le64
rdev
;
__le64
flags
;
/* modification sequence number for NFS */
__le64
sequence
;
/*
* a little future expansion, for more than this we can
* just grow the inode item and version it
*/
__le64
reserved
[
4
];
struct
btrfs_timespec
atime
;
struct
btrfs_timespec
ctime
;
struct
btrfs_timespec
mtime
;
struct
btrfs_timespec
otime
;
}
__attribute__
((
__packed__
));
struct
btrfs_dir_log_item
{
__le64
end
;
}
__attribute__
((
__packed__
));
struct
btrfs_dir_item
{
struct
btrfs_disk_key
location
;
__le64
transid
;
__le16
data_len
;
__le16
name_len
;
__u8
type
;
}
__attribute__
((
__packed__
));
#define BTRFS_ROOT_SUBVOL_RDONLY (1ULL << 0)
/*
* Internal in-memory flag that a subvolume has been marked for deletion but
* still visible as a directory
*/
#define BTRFS_ROOT_SUBVOL_DEAD (1ULL << 48)
struct
btrfs_root_item
{
struct
btrfs_inode_item
inode
;
__le64
generation
;
__le64
root_dirid
;
__le64
bytenr
;
__le64
byte_limit
;
__le64
bytes_used
;
__le64
last_snapshot
;
__le64
flags
;
__le32
refs
;
struct
btrfs_disk_key
drop_progress
;
__u8
drop_level
;
__u8
level
;
/*
* The following fields appear after subvol_uuids+subvol_times
* were introduced.
*/
/*
* This generation number is used to test if the new fields are valid
* and up to date while reading the root item. Every time the root item
* is written out, the "generation" field is copied into this field. If
* anyone ever mounted the fs with an older kernel, we will have
* mismatching generation values here and thus must invalidate the
* new fields. See btrfs_update_root and btrfs_find_last_root for
* details.
* the offset of generation_v2 is also used as the start for the memset
* when invalidating the fields.
*/
__le64
generation_v2
;
__u8
uuid
[
BTRFS_UUID_SIZE
];
__u8
parent_uuid
[
BTRFS_UUID_SIZE
];
__u8
received_uuid
[
BTRFS_UUID_SIZE
];
__le64
ctransid
;
/* updated when an inode changes */
__le64
otransid
;
/* trans when created */
__le64
stransid
;
/* trans when sent. non-zero for received subvol */
__le64
rtransid
;
/* trans when received. non-zero for received subvol */
struct
btrfs_timespec
ctime
;
struct
btrfs_timespec
otime
;
struct
btrfs_timespec
stime
;
struct
btrfs_timespec
rtime
;
__le64
reserved
[
8
];
/* for future */
}
__attribute__
((
__packed__
));
/*
* this is used for both forward and backward root refs
*/
struct
btrfs_root_ref
{
__le64
dirid
;
__le64
sequence
;
__le16
name_len
;
}
__attribute__
((
__packed__
));
struct
btrfs_disk_balance_args
{
/*
* profiles to operate on, single is denoted by
* BTRFS_AVAIL_ALLOC_BIT_SINGLE
*/
__le64
profiles
;
/*
* usage filter
* BTRFS_BALANCE_ARGS_USAGE with a single value means '0..N'
* BTRFS_BALANCE_ARGS_USAGE_RANGE - range syntax, min..max
*/
union
{
__le64
usage
;
struct
{
__le32
usage_min
;
__le32
usage_max
;
};
};
/* devid filter */
__le64
devid
;
/* devid subset filter [pstart..pend) */
__le64
pstart
;
__le64
pend
;
/* btrfs virtual address space subset filter [vstart..vend) */
__le64
vstart
;
__le64
vend
;
/*
* profile to convert to, single is denoted by
* BTRFS_AVAIL_ALLOC_BIT_SINGLE
*/
__le64
target
;
/* BTRFS_BALANCE_ARGS_* */
__le64
flags
;
/*
* BTRFS_BALANCE_ARGS_LIMIT with value 'limit'
* BTRFS_BALANCE_ARGS_LIMIT_RANGE - the extend version can use minimum
* and maximum
*/
union
{
__le64
limit
;
struct
{
__le32
limit_min
;
__le32
limit_max
;
};
};
/*
* Process chunks that cross stripes_min..stripes_max devices,
* BTRFS_BALANCE_ARGS_STRIPES_RANGE
*/
__le32
stripes_min
;
__le32
stripes_max
;
__le64
unused
[
6
];
}
__attribute__
((
__packed__
));
/*
* store balance parameters to disk so that balance can be properly
* resumed after crash or unmount
*/
struct
btrfs_balance_item
{
/* BTRFS_BALANCE_* */
__le64
flags
;
struct
btrfs_disk_balance_args
data
;
struct
btrfs_disk_balance_args
meta
;
struct
btrfs_disk_balance_args
sys
;
__le64
unused
[
4
];
}
__attribute__
((
__packed__
));
#define BTRFS_FILE_EXTENT_INLINE 0
#define BTRFS_FILE_EXTENT_REG 1
#define BTRFS_FILE_EXTENT_PREALLOC 2
struct
btrfs_file_extent_item
{
/*
* transaction id that created this extent
*/
__le64
generation
;
/*
* max number of bytes to hold this extent in ram
* when we split a compressed extent we can't know how big
* each of the resulting pieces will be. So, this is
* an upper limit on the size of the extent in ram instead of
* an exact limit.
*/
__le64
ram_bytes
;
/*
* 32 bits for the various ways we might encode the data,
* including compression and encryption. If any of these
* are set to something a given disk format doesn't understand
* it is treated like an incompat flag for reading and writing,
* but not for stat.
*/
__u8
compression
;
__u8
encryption
;
__le16
other_encoding
;
/* spare for later use */
/* are we inline data or a real extent? */
__u8
type
;
/*
* disk space consumed by the extent, checksum blocks are included
* in these numbers
*
* At this offset in the structure, the inline extent data start.
*/
__le64
disk_bytenr
;
__le64
disk_num_bytes
;
/*
* the logical offset in file blocks (no csums)
* this extent record is for. This allows a file extent to point
* into the middle of an existing extent on disk, sharing it
* between two snapshots (useful if some bytes in the middle of the
* extent have changed
*/
__le64
offset
;
/*
* the logical number of file blocks (no csums included). This
* always reflects the size uncompressed and without encoding.
*/
__le64
num_bytes
;
}
__attribute__
((
__packed__
));
struct
btrfs_csum_item
{
__u8
csum
;
}
__attribute__
((
__packed__
));
struct
btrfs_dev_stats_item
{
/*
* grow this item struct at the end for future enhancements and keep
* the existing values unchanged
*/
__le64
values
[
BTRFS_DEV_STAT_VALUES_MAX
];
}
__attribute__
((
__packed__
));
#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_ALWAYS 0
#define BTRFS_DEV_REPLACE_ITEM_CONT_READING_FROM_SRCDEV_MODE_AVOID 1
#define BTRFS_DEV_REPLACE_ITEM_STATE_NEVER_STARTED 0
#define BTRFS_DEV_REPLACE_ITEM_STATE_STARTED 1
#define BTRFS_DEV_REPLACE_ITEM_STATE_SUSPENDED 2
#define BTRFS_DEV_REPLACE_ITEM_STATE_FINISHED 3
#define BTRFS_DEV_REPLACE_ITEM_STATE_CANCELED 4
struct
btrfs_dev_replace_item
{
/*
* grow this item struct at the end for future enhancements and keep
* the existing values unchanged
*/
__le64
src_devid
;
__le64
cursor_left
;
__le64
cursor_right
;
__le64
cont_reading_from_srcdev_mode
;
__le64
replace_state
;
__le64
time_started
;
__le64
time_stopped
;
__le64
num_write_errors
;
__le64
num_uncorrectable_read_errors
;
}
__attribute__
((
__packed__
));
/* different types of block groups (and chunks) */
#define BTRFS_BLOCK_GROUP_DATA (1ULL << 0)
#define BTRFS_BLOCK_GROUP_SYSTEM (1ULL << 1)
#define BTRFS_BLOCK_GROUP_METADATA (1ULL << 2)
#define BTRFS_BLOCK_GROUP_RAID0 (1ULL << 3)
#define BTRFS_BLOCK_GROUP_RAID1 (1ULL << 4)
#define BTRFS_BLOCK_GROUP_DUP (1ULL << 5)
#define BTRFS_BLOCK_GROUP_RAID10 (1ULL << 6)
#define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7)
#define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8)
#define BTRFS_BLOCK_GROUP_RESERVED (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \
BTRFS_SPACE_INFO_GLOBAL_RSV)
enum
btrfs_raid_types
{
BTRFS_RAID_RAID10
,
BTRFS_RAID_RAID1
,
BTRFS_RAID_DUP
,
BTRFS_RAID_RAID0
,
BTRFS_RAID_SINGLE
,
BTRFS_RAID_RAID5
,
BTRFS_RAID_RAID6
,
BTRFS_NR_RAID_TYPES
};
#define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \
BTRFS_BLOCK_GROUP_SYSTEM | \
BTRFS_BLOCK_GROUP_METADATA)
#define BTRFS_BLOCK_GROUP_PROFILE_MASK (BTRFS_BLOCK_GROUP_RAID0 | \
BTRFS_BLOCK_GROUP_RAID1 | \
BTRFS_BLOCK_GROUP_RAID5 | \
BTRFS_BLOCK_GROUP_RAID6 | \
BTRFS_BLOCK_GROUP_DUP | \
BTRFS_BLOCK_GROUP_RAID10)
#define BTRFS_BLOCK_GROUP_RAID56_MASK (BTRFS_BLOCK_GROUP_RAID5 | \
BTRFS_BLOCK_GROUP_RAID6)
/*
* We need a bit for restriper to be able to tell when chunks of type
* SINGLE are available. This "extended" profile format is used in
* fs_info->avail_*_alloc_bits (in-memory) and balance item fields
* (on-disk). The corresponding on-disk bit in chunk.type is reserved
* to avoid remappings between two formats in future.
*/
#define BTRFS_AVAIL_ALLOC_BIT_SINGLE (1ULL << 48)
/*
* A fake block group type that is used to communicate global block reserve
* size to userspace via the SPACE_INFO ioctl.
*/
#define BTRFS_SPACE_INFO_GLOBAL_RSV (1ULL << 49)
#define BTRFS_EXTENDED_PROFILE_MASK (BTRFS_BLOCK_GROUP_PROFILE_MASK | \
BTRFS_AVAIL_ALLOC_BIT_SINGLE)
static
inline
__u64
chunk_to_extended
(
__u64
flags
)
{
if
((
flags
&
BTRFS_BLOCK_GROUP_PROFILE_MASK
)
==
0
)
flags
|=
BTRFS_AVAIL_ALLOC_BIT_SINGLE
;
return
flags
;
}
static
inline
__u64
extended_to_chunk
(
__u64
flags
)
{
return
flags
&
~
BTRFS_AVAIL_ALLOC_BIT_SINGLE
;
}
struct
btrfs_block_group_item
{
__le64
used
;
__le64
chunk_objectid
;
__le64
flags
;
}
__attribute__
((
__packed__
));
struct
btrfs_free_space_info
{
__le32
extent_count
;
__le32
flags
;
}
__attribute__
((
__packed__
));
#define BTRFS_FREE_SPACE_USING_BITMAPS (1ULL << 0)
#define BTRFS_QGROUP_LEVEL_SHIFT 48
static
inline
__u64
btrfs_qgroup_level
(
__u64
qgroupid
)
{
return
qgroupid
>>
BTRFS_QGROUP_LEVEL_SHIFT
;
}
/*
* is subvolume quota turned on?
*/
#define BTRFS_QGROUP_STATUS_FLAG_ON (1ULL << 0)
/*
* RESCAN is set during the initialization phase
*/
#define BTRFS_QGROUP_STATUS_FLAG_RESCAN (1ULL << 1)
/*
* Some qgroup entries are known to be out of date,
* either because the configuration has changed in a way that
* makes a rescan necessary, or because the fs has been mounted
* with a non-qgroup-aware version.
* Turning qouta off and on again makes it inconsistent, too.
*/
#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT (1ULL << 2)
#define BTRFS_QGROUP_STATUS_VERSION 1
struct
btrfs_qgroup_status_item
{
__le64
version
;
/*
* the generation is updated during every commit. As older
* versions of btrfs are not aware of qgroups, it will be
* possible to detect inconsistencies by checking the
* generation on mount time
*/
__le64
generation
;
/* flag definitions see above */
__le64
flags
;
/*
* only used during scanning to record the progress
* of the scan. It contains a logical address
*/
__le64
rescan
;
}
__attribute__
((
__packed__
));
struct
btrfs_qgroup_info_item
{
__le64
generation
;
__le64
rfer
;
__le64
rfer_cmpr
;
__le64
excl
;
__le64
excl_cmpr
;
}
__attribute__
((
__packed__
));
struct
btrfs_qgroup_limit_item
{
/*
* only updated when any of the other values change
*/
__le64
flags
;
__le64
max_rfer
;
__le64
max_excl
;
__le64
rsv_rfer
;
__le64
rsv_excl
;
}
__attribute__
((
__packed__
));
#endif
/* _BTRFS_CTREE_H_ */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录