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
Kirill Smelkov
linux
Commits
f7d57218
Commit
f7d57218
authored
Nov 10, 2011
by
Chris Mason
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'mount-fixes' of
git://github.com/idryomov/btrfs-unstable
into integration
parents
2115133f
04d21a24
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
43 additions
and
46 deletions
+43
-46
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+18
-24
fs/btrfs/super.c
fs/btrfs/super.c
+25
-22
No files found.
fs/btrfs/disk-io.c
View file @
f7d57218
...
@@ -1890,31 +1890,32 @@ struct btrfs_root *open_ctree(struct super_block *sb,
...
@@ -1890,31 +1890,32 @@ struct btrfs_root *open_ctree(struct super_block *sb,
u64
features
;
u64
features
;
struct
btrfs_key
location
;
struct
btrfs_key
location
;
struct
buffer_head
*
bh
;
struct
buffer_head
*
bh
;
struct
btrfs_root
*
extent_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
struct
btrfs_super_block
*
disk_super
;
GFP_NOFS
);
struct
btrfs_root
*
csum_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
struct
btrfs_root
*
tree_root
=
btrfs_sb
(
sb
);
struct
btrfs_root
*
tree_root
=
btrfs_sb
(
sb
);
struct
btrfs_fs_info
*
fs_info
=
NULL
;
struct
btrfs_fs_info
*
fs_info
=
tree_root
->
fs_info
;
struct
btrfs_root
*
chunk_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
struct
btrfs_root
*
extent_root
;
GFP_NOFS
)
;
struct
btrfs_root
*
csum_root
;
struct
btrfs_root
*
dev_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
struct
btrfs_root
*
chunk_root
;
GFP_NOFS
)
;
struct
btrfs_root
*
dev_root
;
struct
btrfs_root
*
log_tree_root
;
struct
btrfs_root
*
log_tree_root
;
int
ret
;
int
ret
;
int
err
=
-
EINVAL
;
int
err
=
-
EINVAL
;
int
num_backups_tried
=
0
;
int
num_backups_tried
=
0
;
int
backup_index
=
0
;
int
backup_index
=
0
;
struct
btrfs_super_block
*
disk_super
;
extent_root
=
fs_info
->
extent_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
csum_root
=
fs_info
->
csum_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
chunk_root
=
fs_info
->
chunk_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
dev_root
=
fs_info
->
dev_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
if
(
!
extent_root
||
!
tree_root
||
!
tree_root
->
fs_info
||
if
(
!
extent_root
||
!
csum_root
||
!
chunk_root
||
!
dev_root
)
{
!
chunk_root
||
!
dev_root
||
!
csum_root
)
{
err
=
-
ENOMEM
;
err
=
-
ENOMEM
;
goto
fail
;
goto
fail
;
}
}
fs_info
=
tree_root
->
fs_info
;
ret
=
init_srcu_struct
(
&
fs_info
->
subvol_srcu
);
ret
=
init_srcu_struct
(
&
fs_info
->
subvol_srcu
);
if
(
ret
)
{
if
(
ret
)
{
...
@@ -1954,12 +1955,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
...
@@ -1954,12 +1955,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
mutex_init
(
&
fs_info
->
reloc_mutex
);
mutex_init
(
&
fs_info
->
reloc_mutex
);
init_completion
(
&
fs_info
->
kobj_unregister
);
init_completion
(
&
fs_info
->
kobj_unregister
);
fs_info
->
tree_root
=
tree_root
;
fs_info
->
extent_root
=
extent_root
;
fs_info
->
csum_root
=
csum_root
;
fs_info
->
chunk_root
=
chunk_root
;
fs_info
->
dev_root
=
dev_root
;
fs_info
->
fs_devices
=
fs_devices
;
INIT_LIST_HEAD
(
&
fs_info
->
dirty_cowonly_roots
);
INIT_LIST_HEAD
(
&
fs_info
->
dirty_cowonly_roots
);
INIT_LIST_HEAD
(
&
fs_info
->
space_info
);
INIT_LIST_HEAD
(
&
fs_info
->
space_info
);
btrfs_mapping_init
(
&
fs_info
->
mapping_tree
);
btrfs_mapping_init
(
&
fs_info
->
mapping_tree
);
...
@@ -2465,21 +2460,20 @@ struct btrfs_root *open_ctree(struct super_block *sb,
...
@@ -2465,21 +2460,20 @@ struct btrfs_root *open_ctree(struct super_block *sb,
btrfs_stop_workers
(
&
fs_info
->
caching_workers
);
btrfs_stop_workers
(
&
fs_info
->
caching_workers
);
fail_alloc:
fail_alloc:
fail_iput:
fail_iput:
btrfs_mapping_tree_free
(
&
fs_info
->
mapping_tree
);
invalidate_inode_pages2
(
fs_info
->
btree_inode
->
i_mapping
);
invalidate_inode_pages2
(
fs_info
->
btree_inode
->
i_mapping
);
iput
(
fs_info
->
btree_inode
);
iput
(
fs_info
->
btree_inode
);
btrfs_close_devices
(
fs_info
->
fs_devices
);
btrfs_mapping_tree_free
(
&
fs_info
->
mapping_tree
);
fail_bdi:
fail_bdi:
bdi_destroy
(
&
fs_info
->
bdi
);
bdi_destroy
(
&
fs_info
->
bdi
);
fail_srcu:
fail_srcu:
cleanup_srcu_struct
(
&
fs_info
->
subvol_srcu
);
cleanup_srcu_struct
(
&
fs_info
->
subvol_srcu
);
fail:
fail:
btrfs_close_devices
(
fs_info
->
fs_devices
);
free_fs_info
(
fs_info
);
free_fs_info
(
fs_info
);
return
ERR_PTR
(
err
);
return
ERR_PTR
(
err
);
recovery_tree_root:
recovery_tree_root:
if
(
!
btrfs_test_opt
(
tree_root
,
RECOVERY
))
if
(
!
btrfs_test_opt
(
tree_root
,
RECOVERY
))
goto
fail_tree_roots
;
goto
fail_tree_roots
;
...
...
fs/btrfs/super.c
View file @
f7d57218
...
@@ -448,6 +448,7 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags,
...
@@ -448,6 +448,7 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags,
token
=
match_token
(
p
,
tokens
,
args
);
token
=
match_token
(
p
,
tokens
,
args
);
switch
(
token
)
{
switch
(
token
)
{
case
Opt_subvol
:
case
Opt_subvol
:
kfree
(
*
subvol_name
);
*
subvol_name
=
match_strdup
(
&
args
[
0
]);
*
subvol_name
=
match_strdup
(
&
args
[
0
]);
break
;
break
;
case
Opt_subvolid
:
case
Opt_subvolid
:
...
@@ -890,7 +891,6 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
...
@@ -890,7 +891,6 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
struct
super_block
*
s
;
struct
super_block
*
s
;
struct
dentry
*
root
;
struct
dentry
*
root
;
struct
btrfs_fs_devices
*
fs_devices
=
NULL
;
struct
btrfs_fs_devices
*
fs_devices
=
NULL
;
struct
btrfs_root
*
tree_root
=
NULL
;
struct
btrfs_fs_info
*
fs_info
=
NULL
;
struct
btrfs_fs_info
*
fs_info
=
NULL
;
fmode_t
mode
=
FMODE_READ
;
fmode_t
mode
=
FMODE_READ
;
char
*
subvol_name
=
NULL
;
char
*
subvol_name
=
NULL
;
...
@@ -904,8 +904,10 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
...
@@ -904,8 +904,10 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
error
=
btrfs_parse_early_options
(
data
,
mode
,
fs_type
,
error
=
btrfs_parse_early_options
(
data
,
mode
,
fs_type
,
&
subvol_name
,
&
subvol_objectid
,
&
subvol_name
,
&
subvol_objectid
,
&
subvol_rootid
,
&
fs_devices
);
&
subvol_rootid
,
&
fs_devices
);
if
(
error
)
if
(
error
)
{
kfree
(
subvol_name
);
return
ERR_PTR
(
error
);
return
ERR_PTR
(
error
);
}
if
(
subvol_name
)
{
if
(
subvol_name
)
{
root
=
mount_subvol
(
subvol_name
,
flags
,
device_name
,
data
);
root
=
mount_subvol
(
subvol_name
,
flags
,
device_name
,
data
);
...
@@ -917,15 +919,6 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
...
@@ -917,15 +919,6 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
if
(
error
)
if
(
error
)
return
ERR_PTR
(
error
);
return
ERR_PTR
(
error
);
error
=
btrfs_open_devices
(
fs_devices
,
mode
,
fs_type
);
if
(
error
)
return
ERR_PTR
(
error
);
if
(
!
(
flags
&
MS_RDONLY
)
&&
fs_devices
->
rw_devices
==
0
)
{
error
=
-
EACCES
;
goto
error_close_devices
;
}
/*
/*
* Setup a dummy root and fs_info for test/set super. This is because
* Setup a dummy root and fs_info for test/set super. This is because
* we don't actually fill this stuff out until open_ctree, but we need
* we don't actually fill this stuff out until open_ctree, but we need
...
@@ -933,28 +926,36 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
...
@@ -933,28 +926,36 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
* then open_ctree will properly initialize everything later.
* then open_ctree will properly initialize everything later.
*/
*/
fs_info
=
kzalloc
(
sizeof
(
struct
btrfs_fs_info
),
GFP_NOFS
);
fs_info
=
kzalloc
(
sizeof
(
struct
btrfs_fs_info
),
GFP_NOFS
);
if
(
!
fs_info
)
{
if
(
!
fs_info
)
error
=
-
ENOMEM
;
return
ERR_PTR
(
-
ENOMEM
);
goto
error_close_devices
;
}
fs_info
->
tree_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
tree_root
=
kzalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
if
(
!
fs_info
->
tree_root
)
{
if
(
!
tree_root
)
{
error
=
-
ENOMEM
;
error
=
-
ENOMEM
;
goto
error_
close_devices
;
goto
error_
fs_info
;
}
}
fs_info
->
tree_root
=
tree_root
;
fs_info
->
tree_root
->
fs_info
=
fs_info
;
fs_info
->
fs_devices
=
fs_devices
;
fs_info
->
fs_devices
=
fs_devices
;
tree_root
->
fs_info
=
fs_info
;
fs_info
->
super_copy
=
kzalloc
(
BTRFS_SUPER_INFO_SIZE
,
GFP_NOFS
);
fs_info
->
super_copy
=
kzalloc
(
BTRFS_SUPER_INFO_SIZE
,
GFP_NOFS
);
fs_info
->
super_for_commit
=
kzalloc
(
BTRFS_SUPER_INFO_SIZE
,
GFP_NOFS
);
fs_info
->
super_for_commit
=
kzalloc
(
BTRFS_SUPER_INFO_SIZE
,
GFP_NOFS
);
if
(
!
fs_info
->
super_copy
||
!
fs_info
->
super_for_commit
)
{
if
(
!
fs_info
->
super_copy
||
!
fs_info
->
super_for_commit
)
{
error
=
-
ENOMEM
;
error
=
-
ENOMEM
;
goto
error_fs_info
;
}
error
=
btrfs_open_devices
(
fs_devices
,
mode
,
fs_type
);
if
(
error
)
goto
error_fs_info
;
if
(
!
(
flags
&
MS_RDONLY
)
&&
fs_devices
->
rw_devices
==
0
)
{
error
=
-
EACCES
;
goto
error_close_devices
;
goto
error_close_devices
;
}
}
bdev
=
fs_devices
->
latest_bdev
;
bdev
=
fs_devices
->
latest_bdev
;
s
=
sget
(
fs_type
,
btrfs_test_super
,
btrfs_set_super
,
tree_root
);
s
=
sget
(
fs_type
,
btrfs_test_super
,
btrfs_set_super
,
fs_info
->
tree_root
);
if
(
IS_ERR
(
s
))
{
if
(
IS_ERR
(
s
))
{
error
=
PTR_ERR
(
s
);
error
=
PTR_ERR
(
s
);
goto
error_close_devices
;
goto
error_close_devices
;
...
@@ -963,7 +964,8 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
...
@@ -963,7 +964,8 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
if
(
s
->
s_root
)
{
if
(
s
->
s_root
)
{
if
((
flags
^
s
->
s_flags
)
&
MS_RDONLY
)
{
if
((
flags
^
s
->
s_flags
)
&
MS_RDONLY
)
{
deactivate_locked_super
(
s
);
deactivate_locked_super
(
s
);
return
ERR_PTR
(
-
EBUSY
);
error
=
-
EBUSY
;
goto
error_close_devices
;
}
}
btrfs_close_devices
(
fs_devices
);
btrfs_close_devices
(
fs_devices
);
...
@@ -994,6 +996,7 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
...
@@ -994,6 +996,7 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
error_close_devices:
error_close_devices:
btrfs_close_devices
(
fs_devices
);
btrfs_close_devices
(
fs_devices
);
error_fs_info:
free_fs_info
(
fs_info
);
free_fs_info
(
fs_info
);
return
ERR_PTR
(
error
);
return
ERR_PTR
(
error
);
}
}
...
...
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