forked from Mirrors/btrfs-progs
btrfs-progs support for root block accounting
This adds support for keeping track of the number of blocks used by root_item's. This makes it so that mkfs lays down the "default" subvol with the correct block accounting in place. Thank you,master v0.8
parent
dbd1848d1f
commit
ffaff17911
11
ctree.h
11
ctree.h
|
@ -784,6 +784,17 @@ static inline void btrfs_set_root_flags(struct btrfs_root_item *item, u32 val)
|
||||||
item->flags = cpu_to_le32(val);
|
item->flags = cpu_to_le32(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void btrfs_set_root_blocks_used(struct btrfs_root_item *item,
|
||||||
|
u64 val)
|
||||||
|
{
|
||||||
|
item->blocks_used = cpu_to_le64(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u64 btrfs_root_blocks_used(struct btrfs_root_item *item)
|
||||||
|
{
|
||||||
|
return le64_to_cpu(item->blocks_used);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s)
|
static inline u64 btrfs_super_blocknr(struct btrfs_super_block *s)
|
||||||
{
|
{
|
||||||
return le64_to_cpu(s->blocknr);
|
return le64_to_cpu(s->blocknr);
|
||||||
|
|
|
@ -252,7 +252,7 @@ static int finish_current_insert(struct btrfs_trans_handle *trans, struct
|
||||||
struct btrfs_extent_item extent_item;
|
struct btrfs_extent_item extent_item;
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
u64 super_blocks_used;
|
u64 super_blocks_used, root_blocks_used;
|
||||||
struct btrfs_fs_info *info = extent_root->fs_info;
|
struct btrfs_fs_info *info = extent_root->fs_info;
|
||||||
|
|
||||||
btrfs_set_extent_refs(&extent_item, 1);
|
btrfs_set_extent_refs(&extent_item, 1);
|
||||||
|
@ -267,6 +267,9 @@ static int finish_current_insert(struct btrfs_trans_handle *trans, struct
|
||||||
super_blocks_used = btrfs_super_blocks_used(info->disk_super);
|
super_blocks_used = btrfs_super_blocks_used(info->disk_super);
|
||||||
btrfs_set_super_blocks_used(info->disk_super,
|
btrfs_set_super_blocks_used(info->disk_super,
|
||||||
super_blocks_used + 1);
|
super_blocks_used + 1);
|
||||||
|
root_blocks_used = btrfs_root_blocks_used(&extent_root->root_item);
|
||||||
|
btrfs_set_root_blocks_used(&extent_root->root_item,
|
||||||
|
root_blocks_used + 1);
|
||||||
ret = btrfs_insert_item(trans, extent_root, &ins, &extent_item,
|
ret = btrfs_insert_item(trans, extent_root, &ins, &extent_item,
|
||||||
sizeof(extent_item));
|
sizeof(extent_item));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -314,7 +317,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
|
||||||
refs = btrfs_extent_refs(ei) - 1;
|
refs = btrfs_extent_refs(ei) - 1;
|
||||||
btrfs_set_extent_refs(ei, refs);
|
btrfs_set_extent_refs(ei, refs);
|
||||||
if (refs == 0) {
|
if (refs == 0) {
|
||||||
u64 super_blocks_used;
|
u64 super_blocks_used, root_blocks_used;
|
||||||
if (pin) {
|
if (pin) {
|
||||||
int err;
|
int err;
|
||||||
unsigned long bl = blocknr;
|
unsigned long bl = blocknr;
|
||||||
|
@ -327,6 +330,10 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
|
||||||
super_blocks_used = btrfs_super_blocks_used(info->disk_super);
|
super_blocks_used = btrfs_super_blocks_used(info->disk_super);
|
||||||
btrfs_set_super_blocks_used(info->disk_super,
|
btrfs_set_super_blocks_used(info->disk_super,
|
||||||
super_blocks_used - num_blocks);
|
super_blocks_used - num_blocks);
|
||||||
|
root_blocks_used = btrfs_root_blocks_used(&root->root_item);
|
||||||
|
btrfs_set_root_blocks_used(&root->root_item,
|
||||||
|
root_blocks_used - num_blocks);
|
||||||
|
|
||||||
ret = btrfs_del_item(trans, extent_root, &path);
|
ret = btrfs_del_item(trans, extent_root, &path);
|
||||||
if (!pin && extent_root->fs_info->last_insert.objectid >
|
if (!pin && extent_root->fs_info->last_insert.objectid >
|
||||||
blocknr)
|
blocknr)
|
||||||
|
@ -527,7 +534,7 @@ static int alloc_extent(struct btrfs_trans_handle *trans, struct btrfs_root
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int pending_ret;
|
int pending_ret;
|
||||||
u64 super_blocks_used;
|
u64 super_blocks_used, root_blocks_used;
|
||||||
struct btrfs_fs_info *info = root->fs_info;
|
struct btrfs_fs_info *info = root->fs_info;
|
||||||
struct btrfs_root *extent_root = info->extent_root;
|
struct btrfs_root *extent_root = info->extent_root;
|
||||||
struct btrfs_extent_item extent_item;
|
struct btrfs_extent_item extent_item;
|
||||||
|
@ -553,6 +560,10 @@ static int alloc_extent(struct btrfs_trans_handle *trans, struct btrfs_root
|
||||||
super_blocks_used = btrfs_super_blocks_used(info->disk_super);
|
super_blocks_used = btrfs_super_blocks_used(info->disk_super);
|
||||||
btrfs_set_super_blocks_used(info->disk_super, super_blocks_used +
|
btrfs_set_super_blocks_used(info->disk_super, super_blocks_used +
|
||||||
num_blocks);
|
num_blocks);
|
||||||
|
root_blocks_used = btrfs_root_blocks_used(&root->root_item);
|
||||||
|
btrfs_set_root_blocks_used(&root->root_item, root_blocks_used +
|
||||||
|
num_blocks);
|
||||||
|
|
||||||
ret = btrfs_insert_item(trans, extent_root, ins, &extent_item,
|
ret = btrfs_insert_item(trans, extent_root, ins, &extent_item,
|
||||||
sizeof(extent_item));
|
sizeof(extent_item));
|
||||||
|
|
||||||
|
|
3
mkfs.c
3
mkfs.c
|
@ -166,7 +166,7 @@ static int make_root_dir(int fd) {
|
||||||
memcpy(&location, &root->fs_info->fs_root->root_key, sizeof(location));
|
memcpy(&location, &root->fs_info->fs_root->root_key, sizeof(location));
|
||||||
location.offset = (u64)-1;
|
location.offset = (u64)-1;
|
||||||
ret = btrfs_insert_dir_item(trans, root->fs_info->tree_root,
|
ret = btrfs_insert_dir_item(trans, root->fs_info->tree_root,
|
||||||
"default", strlen("default"),
|
"default", 7,
|
||||||
btrfs_super_root_dir(root->fs_info->disk_super),
|
btrfs_super_root_dir(root->fs_info->disk_super),
|
||||||
&location, BTRFS_FT_DIR);
|
&location, BTRFS_FT_DIR);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -242,6 +242,7 @@ int mkfs(int fd, char *pathname, u64 num_blocks, u32 blocksize)
|
||||||
&root_item, sizeof(root_item));
|
&root_item, sizeof(root_item));
|
||||||
|
|
||||||
btrfs_set_root_blocknr(&root_item, start_block + 3);
|
btrfs_set_root_blocknr(&root_item, start_block + 3);
|
||||||
|
btrfs_set_root_blocks_used(&root_item, 1);
|
||||||
itemoff = itemoff - sizeof(root_item);
|
itemoff = itemoff - sizeof(root_item);
|
||||||
btrfs_set_item_offset(&item, itemoff);
|
btrfs_set_item_offset(&item, itemoff);
|
||||||
btrfs_set_disk_key_objectid(&item.key, BTRFS_FS_TREE_OBJECTID);
|
btrfs_set_disk_key_objectid(&item.key, BTRFS_FS_TREE_OBJECTID);
|
||||||
|
|
Loading…
Reference in New Issue