Skip to content

Commit 80cd98e

Browse files
maharmstonekdave
authored andcommitted
btrfs-progs: mkfs: add dev stats and device items
The kernel adds a zeroed btrfs_dev_stats_item for each device on the first mount. Preempt this by doing it at mkfs time. Signed-off-by: Mark Harmstone <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 7535901 commit 80cd98e

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

kernel-shared/ctree.h

+10
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,16 @@ static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb,
831831
return val;
832832
}
833833

834+
static inline void btrfs_set_dev_stats_value(struct extent_buffer *eb,
835+
struct btrfs_dev_stats_item *ptr,
836+
int index, u64 val)
837+
{
838+
write_extent_buffer(eb, &val,
839+
offsetof(struct btrfs_dev_stats_item, values) +
840+
((unsigned long)ptr) + (index * sizeof(u64)),
841+
sizeof(val));
842+
}
843+
834844
/* struct btrfs_ioctl_search_header */
835845
static inline u64 btrfs_search_header_transid(struct btrfs_ioctl_search_header *sh)
836846
{

kernel-shared/volumes.c

+23
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,7 @@ int btrfs_add_device(struct btrfs_trans_handle *trans,
11351135
int ret;
11361136
struct btrfs_path *path;
11371137
struct btrfs_dev_item *dev_item;
1138+
struct btrfs_dev_stats_item *dev_stats;
11381139
struct extent_buffer *leaf;
11391140
struct btrfs_key key;
11401141
struct btrfs_root *root = fs_info->chunk_root;
@@ -1149,6 +1150,7 @@ int btrfs_add_device(struct btrfs_trans_handle *trans,
11491150
if (ret)
11501151
goto out;
11511152

1153+
/* Add DEV_ITEM. */
11521154
key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
11531155
key.type = BTRFS_DEV_ITEM_KEY;
11541156
key.offset = free_devid;
@@ -1182,6 +1184,27 @@ int btrfs_add_device(struct btrfs_trans_handle *trans,
11821184
BTRFS_UUID_SIZE);
11831185
btrfs_mark_buffer_dirty(leaf);
11841186
fs_info->fs_devices->total_rw_bytes += device->total_bytes;
1187+
1188+
btrfs_release_path(path);
1189+
1190+
/* Add DEV STATS item. */
1191+
key.objectid = BTRFS_DEV_STATS_OBJECTID;
1192+
key.type = BTRFS_PERSISTENT_ITEM_KEY;
1193+
key.offset = free_devid;
1194+
1195+
ret = btrfs_insert_empty_item(trans, fs_info->dev_root, path, &key,
1196+
sizeof(*dev_stats));
1197+
if (ret)
1198+
goto out;
1199+
1200+
leaf = path->nodes[0];
1201+
dev_stats = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dev_stats_item);
1202+
1203+
for (int i = 0; i < BTRFS_DEV_STAT_VALUES_MAX; i++)
1204+
btrfs_set_dev_stats_value(leaf, dev_stats, i, 0);
1205+
1206+
btrfs_mark_buffer_dirty(leaf);
1207+
11851208
ret = 0;
11861209

11871210
out:

mkfs/common.c

+19-1
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
369369
struct btrfs_chunk *chunk;
370370
struct btrfs_dev_item *dev_item;
371371
struct btrfs_dev_extent *dev_extent;
372+
struct btrfs_dev_stats_item *dev_stats;
372373
enum btrfs_mkfs_block blocks[MKFS_BLOCK_COUNT];
373374
u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
374375
u8 *ptr;
@@ -673,8 +674,25 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
673674
memset(buf->data + sizeof(struct btrfs_header), 0,
674675
cfg->nodesize - sizeof(struct btrfs_header));
675676
nritems = 0;
676-
itemoff = cfg->leaf_data_size - sizeof(struct btrfs_dev_extent);
677+
itemoff = cfg->leaf_data_size;
678+
679+
/* Add a DEV_STATS item for device 1. */
680+
itemoff -= sizeof(struct btrfs_dev_stats_item);
681+
btrfs_set_disk_key_objectid(&disk_key, BTRFS_DEV_STATS_OBJECTID);
682+
btrfs_set_disk_key_type(&disk_key, BTRFS_PERSISTENT_ITEM_KEY);
683+
btrfs_set_disk_key_offset(&disk_key, 1);
684+
btrfs_set_item_key(buf, &disk_key, nritems);
685+
btrfs_set_item_offset(buf, nritems, itemoff);
686+
btrfs_set_item_size(buf, nritems, sizeof(struct btrfs_dev_stats_item));
687+
dev_stats = btrfs_item_ptr(buf, nritems, struct btrfs_dev_stats_item);
688+
689+
for (i = 0; i < BTRFS_DEV_STAT_VALUES_MAX; i++)
690+
btrfs_set_dev_stats_value(buf, dev_stats, i, 0);
691+
692+
nritems++;
677693

694+
/* Add the DEV_EXTENT item for the system chunk. */
695+
itemoff -= sizeof(struct btrfs_dev_extent);
678696
btrfs_set_disk_key_objectid(&disk_key, 1);
679697
btrfs_set_disk_key_offset(&disk_key, system_group_offset);
680698
btrfs_set_disk_key_type(&disk_key, BTRFS_DEV_EXTENT_KEY);

0 commit comments

Comments
 (0)