Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
b4100d64
Commit
b4100d64
authored
Apr 12, 2007
by
Chris Mason
Committed by
David Woodhouse
Apr 12, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Btrfs: add a device id to device items
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
8352d8a4
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
65 additions
and
12 deletions
+65
-12
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+36
-0
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+20
-11
fs/btrfs/disk-io.h
fs/btrfs/disk-io.h
+1
-0
fs/btrfs/super.c
fs/btrfs/super.c
+8
-1
No files found.
fs/btrfs/ctree.h
View file @
b4100d64
...
...
@@ -91,10 +91,12 @@ struct btrfs_super_block {
__le64
total_blocks
;
__le64
blocks_used
;
__le64
root_dir_objectid
;
__le64
last_device_id
;
/* fields below here vary with the underlying disk */
__le64
device_block_start
;
__le64
device_num_blocks
;
__le64
device_root
;
__le64
device_id
;
}
__attribute__
((
__packed__
));
/*
...
...
@@ -230,6 +232,7 @@ struct btrfs_csum_item {
struct
btrfs_device_item
{
__le16
pathlen
;
__le64
device_id
;
}
__attribute__
((
__packed__
));
struct
crypto_hash
;
...
...
@@ -798,6 +801,28 @@ static inline void btrfs_set_super_root_dir(struct btrfs_super_block *s, u64
s
->
root_dir_objectid
=
cpu_to_le64
(
val
);
}
static
inline
u64
btrfs_super_last_device_id
(
struct
btrfs_super_block
*
s
)
{
return
le64_to_cpu
(
s
->
last_device_id
);
}
static
inline
void
btrfs_set_super_last_device_id
(
struct
btrfs_super_block
*
s
,
u64
val
)
{
s
->
last_device_id
=
cpu_to_le64
(
val
);
}
static
inline
u64
btrfs_super_device_id
(
struct
btrfs_super_block
*
s
)
{
return
le64_to_cpu
(
s
->
device_id
);
}
static
inline
void
btrfs_set_super_device_id
(
struct
btrfs_super_block
*
s
,
u64
val
)
{
s
->
device_id
=
cpu_to_le64
(
val
);
}
static
inline
u64
btrfs_super_device_block_start
(
struct
btrfs_super_block
*
s
)
{
return
le64_to_cpu
(
s
->
device_block_start
);
...
...
@@ -910,6 +935,17 @@ static inline void btrfs_set_device_pathlen(struct btrfs_device_item *d,
d
->
pathlen
=
cpu_to_le16
(
val
);
}
static
inline
u64
btrfs_device_id
(
struct
btrfs_device_item
*
d
)
{
return
le64_to_cpu
(
d
->
device_id
);
}
static
inline
void
btrfs_set_device_id
(
struct
btrfs_device_item
*
d
,
u64
val
)
{
d
->
device_id
=
cpu_to_le64
(
val
);
}
static
inline
struct
btrfs_root
*
btrfs_sb
(
struct
super_block
*
sb
)
{
return
sb
->
s_fs_info
;
...
...
fs/btrfs/disk-io.c
View file @
b4100d64
...
...
@@ -13,11 +13,13 @@
struct
dev_lookup
{
u64
block_start
;
u64
num_blocks
;
u64
device_id
;
struct
block_device
*
bdev
;
};
int
btrfs_insert_dev_radix
(
struct
btrfs_root
*
root
,
struct
block_device
*
bdev
,
u64
device_id
,
u64
block_start
,
u64
num_blocks
)
{
...
...
@@ -31,6 +33,7 @@ int btrfs_insert_dev_radix(struct btrfs_root *root,
lookup
->
block_start
=
block_start
;
lookup
->
num_blocks
=
num_blocks
;
lookup
->
bdev
=
bdev
;
lookup
->
device_id
=
device_id
;
printk
(
"inserting %s into dev radix %Lu %Lu
\n
"
,
bdevname
(
bdev
,
b
),
block_start
,
num_blocks
);
ret
=
radix_tree_insert
(
&
root
->
fs_info
->
dev_radix
,
block_start
+
...
...
@@ -418,17 +421,14 @@ printk("all worked\n");
return
root
;
}
int
btrfs_open_disk
(
struct
btrfs_root
*
root
,
u64
block_start
,
u64
num_blocks
,
char
*
filename
,
int
name_len
)
static
int
btrfs_open_disk
(
struct
btrfs_root
*
root
,
u64
device_id
,
u64
block_start
,
u64
num_blocks
,
char
*
filename
,
int
name_len
)
{
char
*
null_filename
;
struct
block_device
*
bdev
;
int
ret
;
if
(
block_start
==
0
)
{
printk
(
"skipping disk with block_start == 0
\n
"
);
return
0
;
}
null_filename
=
kmalloc
(
name_len
+
1
,
GFP_NOFS
);
if
(
!
null_filename
)
return
-
ENOMEM
;
...
...
@@ -441,7 +441,8 @@ return 0;
goto
out
;
}
set_blocksize
(
bdev
,
root
->
fs_info
->
sb
->
s_blocksize
);
ret
=
btrfs_insert_dev_radix
(
root
,
bdev
,
block_start
,
num_blocks
);
ret
=
btrfs_insert_dev_radix
(
root
,
bdev
,
device_id
,
block_start
,
num_blocks
);
BUG_ON
(
ret
);
ret
=
0
;
out:
...
...
@@ -490,10 +491,14 @@ static int read_device_info(struct btrfs_root *root)
}
dev_item
=
btrfs_item_ptr
(
leaf
,
slot
,
struct
btrfs_device_item
);
printk
(
"found key %Lu %Lu
\n
"
,
key
.
objectid
,
key
.
offset
);
ret
=
btrfs_open_disk
(
root
,
key
.
objectid
,
key
.
offset
,
(
char
*
)(
dev_item
+
1
),
btrfs_device_pathlen
(
dev_item
));
BUG_ON
(
ret
);
if
(
btrfs_device_id
(
dev_item
)
!=
btrfs_super_device_id
(
root
->
fs_info
->
disk_super
))
{
ret
=
btrfs_open_disk
(
root
,
btrfs_device_id
(
dev_item
),
key
.
objectid
,
key
.
offset
,
(
char
*
)(
dev_item
+
1
),
btrfs_device_pathlen
(
dev_item
));
BUG_ON
(
ret
);
}
path
->
slots
[
0
]
++
;
}
btrfs_free_path
(
path
);
...
...
@@ -556,6 +561,7 @@ struct btrfs_root *open_ctree(struct super_block *sb)
dev_lookup
->
block_start
=
0
;
dev_lookup
->
num_blocks
=
(
u32
)
-
2
;
dev_lookup
->
bdev
=
sb
->
s_bdev
;
dev_lookup
->
device_id
=
0
;
ret
=
radix_tree_insert
(
&
fs_info
->
dev_radix
,
(
u32
)
-
2
,
dev_lookup
);
BUG_ON
(
ret
);
fs_info
->
sb_buffer
=
read_tree_block
(
tree_root
,
...
...
@@ -575,6 +581,8 @@ struct btrfs_root *open_ctree(struct super_block *sb)
radix_tree_delete
(
&
fs_info
->
dev_radix
,
(
u32
)
-
2
);
dev_lookup
->
block_start
=
btrfs_super_device_block_start
(
disk_super
);
dev_lookup
->
num_blocks
=
btrfs_super_device_num_blocks
(
disk_super
);
dev_lookup
->
device_id
=
btrfs_super_device_id
(
disk_super
);
ret
=
radix_tree_insert
(
&
fs_info
->
dev_radix
,
dev_lookup
->
block_start
+
dev_lookup
->
num_blocks
-
1
,
dev_lookup
);
...
...
@@ -659,6 +667,7 @@ int del_fs_roots(struct btrfs_fs_info *fs_info)
}
return
0
;
}
static
int
free_dev_radix
(
struct
btrfs_fs_info
*
fs_info
)
{
struct
dev_lookup
*
lookup
[
8
];
...
...
fs/btrfs/disk-io.h
View file @
b4100d64
...
...
@@ -44,6 +44,7 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info,
u64
bh_blocknr
(
struct
buffer_head
*
bh
);
int
btrfs_insert_dev_radix
(
struct
btrfs_root
*
root
,
struct
block_device
*
bdev
,
u64
device_id
,
u64
block_start
,
u64
num_blocks
);
int
btrfs_map_bh_to_logical
(
struct
btrfs_root
*
root
,
struct
buffer_head
*
bh
,
...
...
fs/btrfs/super.c
View file @
b4100d64
...
...
@@ -1840,7 +1840,9 @@ static int add_disk(struct btrfs_root *root, char *name, int namelen)
u16
item_size
;
u64
num_blocks
;
u64
new_blocks
;
u64
device_id
;
int
ret
;
printk
(
"adding disk %s
\n
"
,
name
);
path
=
btrfs_alloc_path
();
if
(
!
path
)
...
...
@@ -1875,9 +1877,14 @@ printk("insert failed %d\n", ret);
path
->
slots
[
0
],
struct
btrfs_device_item
);
btrfs_set_device_pathlen
(
dev_item
,
namelen
);
memcpy
(
dev_item
+
1
,
name
,
namelen
);
device_id
=
btrfs_super_last_device_id
(
root
->
fs_info
->
disk_super
)
+
1
;
btrfs_set_super_last_device_id
(
root
->
fs_info
->
disk_super
,
device_id
);
btrfs_set_device_id
(
dev_item
,
device_id
);
mark_buffer_dirty
(
path
->
nodes
[
0
]);
ret
=
btrfs_insert_dev_radix
(
root
,
bdev
,
num_blocks
,
new_blocks
);
ret
=
btrfs_insert_dev_radix
(
root
,
bdev
,
device_id
,
num_blocks
,
new_blocks
);
if
(
!
ret
)
{
btrfs_set_super_total_blocks
(
root
->
fs_info
->
disk_super
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment