Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
788f20eb
Commit
788f20eb
authored
Apr 28, 2008
by
Chris Mason
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Btrfs: Add new ioctl to add devices
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
8e7bf94f
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
108 additions
and
0 deletions
+108
-0
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+2
-0
fs/btrfs/inode.c
fs/btrfs/inode.c
+23
-0
fs/btrfs/ioctl.h
fs/btrfs/ioctl.h
+6
-0
fs/btrfs/super.c
fs/btrfs/super.c
+1
-0
fs/btrfs/volumes.c
fs/btrfs/volumes.c
+75
-0
fs/btrfs/volumes.h
fs/btrfs/volumes.h
+1
-0
No files found.
fs/btrfs/ctree.h
View file @
788f20eb
...
...
@@ -551,6 +551,8 @@ struct btrfs_fs_info {
u64
data_alloc_profile
;
u64
metadata_alloc_profile
;
u64
system_alloc_profile
;
void
*
bdev_holder
;
};
/*
...
...
fs/btrfs/inode.c
View file @
788f20eb
...
...
@@ -3070,6 +3070,27 @@ static int btrfs_ioctl_defrag(struct file *file)
return
0
;
}
long
btrfs_ioctl_add_dev
(
struct
btrfs_root
*
root
,
void
__user
*
arg
)
{
struct
btrfs_ioctl_vol_args
*
vol_args
;
int
ret
;
vol_args
=
kmalloc
(
sizeof
(
*
vol_args
),
GFP_NOFS
);
if
(
!
vol_args
)
return
-
ENOMEM
;
if
(
copy_from_user
(
vol_args
,
arg
,
sizeof
(
*
vol_args
)))
{
ret
=
-
EFAULT
;
goto
out
;
}
ret
=
btrfs_init_new_device
(
root
,
vol_args
->
name
);
out:
kfree
(
vol_args
);
return
ret
;
}
long
btrfs_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
...
...
@@ -3082,6 +3103,8 @@ long btrfs_ioctl(struct file *file, unsigned int
return
btrfs_ioctl_defrag
(
file
);
case
BTRFS_IOC_RESIZE
:
return
btrfs_ioctl_resize
(
root
,
(
void
__user
*
)
arg
);
case
BTRFS_IOC_ADD_DEV
:
return
btrfs_ioctl_add_dev
(
root
,
(
void
__user
*
)
arg
);
}
return
-
ENOTTY
;
...
...
fs/btrfs/ioctl.h
View file @
788f20eb
...
...
@@ -36,4 +36,10 @@ struct btrfs_ioctl_vol_args {
struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, \
struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_ADD_DEV _IOW(BTRFS_IOCTL_MAGIC, 10, \
struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_RM_DEV _IOW(BTRFS_IOCTL_MAGIC, 11, \
struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, \
struct btrfs_ioctl_vol_args)
#endif
fs/btrfs/super.c
View file @
788f20eb
...
...
@@ -388,6 +388,7 @@ int btrfs_get_sb_bdev(struct file_system_type *fs_type,
goto
error
;
}
btrfs_sb
(
s
)
->
fs_info
->
bdev_holder
=
fs_type
;
s
->
s_flags
|=
MS_ACTIVE
;
}
...
...
fs/btrfs/volumes.c
View file @
788f20eb
...
...
@@ -19,6 +19,7 @@
#include <linux/bio.h>
#include <linux/buffer_head.h>
#include <linux/blkdev.h>
#include <linux/random.h>
#include <asm/div64.h>
#include "ctree.h"
#include "extent_map.h"
...
...
@@ -592,6 +593,80 @@ out:
return
ret
;
}
int
btrfs_init_new_device
(
struct
btrfs_root
*
root
,
char
*
device_path
)
{
struct
btrfs_trans_handle
*
trans
;
struct
btrfs_device
*
device
;
struct
block_device
*
bdev
;
struct
list_head
*
cur
;
struct
list_head
*
devices
;
u64
total_bytes
;
int
ret
=
0
;
bdev
=
open_bdev_excl
(
device_path
,
0
,
root
->
fs_info
->
bdev_holder
);
if
(
!
bdev
)
{
return
-
EIO
;
}
mutex_lock
(
&
root
->
fs_info
->
fs_mutex
);
trans
=
btrfs_start_transaction
(
root
,
1
);
devices
=
&
root
->
fs_info
->
fs_devices
->
devices
;
list_for_each
(
cur
,
devices
)
{
device
=
list_entry
(
cur
,
struct
btrfs_device
,
dev_list
);
if
(
device
->
bdev
==
bdev
)
{
ret
=
-
EEXIST
;
goto
out
;
}
}
device
=
kzalloc
(
sizeof
(
*
device
),
GFP_NOFS
);
if
(
!
device
)
{
/* we can safely leave the fs_devices entry around */
ret
=
-
ENOMEM
;
goto
out_close_bdev
;
}
device
->
barriers
=
1
;
generate_random_uuid
(
device
->
uuid
);
spin_lock_init
(
&
device
->
io_lock
);
device
->
name
=
kstrdup
(
device_path
,
GFP_NOFS
);
if
(
!
device
->
name
)
{
kfree
(
device
);
goto
out_close_bdev
;
}
device
->
io_width
=
root
->
sectorsize
;
device
->
io_align
=
root
->
sectorsize
;
device
->
sector_size
=
root
->
sectorsize
;
device
->
total_bytes
=
i_size_read
(
bdev
->
bd_inode
);
device
->
dev_root
=
root
->
fs_info
->
dev_root
;
device
->
bdev
=
bdev
;
ret
=
btrfs_add_device
(
trans
,
root
,
device
);
if
(
ret
)
goto
out_close_bdev
;
total_bytes
=
btrfs_super_total_bytes
(
&
root
->
fs_info
->
super_copy
);
btrfs_set_super_total_bytes
(
&
root
->
fs_info
->
super_copy
,
total_bytes
+
device
->
total_bytes
);
total_bytes
=
btrfs_super_num_devices
(
&
root
->
fs_info
->
super_copy
);
btrfs_set_super_num_devices
(
&
root
->
fs_info
->
super_copy
,
total_bytes
+
1
);
list_add
(
&
device
->
dev_list
,
&
root
->
fs_info
->
fs_devices
->
devices
);
list_add
(
&
device
->
dev_alloc_list
,
&
root
->
fs_info
->
fs_devices
->
alloc_list
);
root
->
fs_info
->
fs_devices
->
num_devices
++
;
out:
btrfs_end_transaction
(
trans
,
root
);
mutex_unlock
(
&
root
->
fs_info
->
fs_mutex
);
return
ret
;
out_close_bdev:
close_bdev_excl
(
bdev
);
goto
out
;
}
int
btrfs_update_device
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_device
*
device
)
{
...
...
fs/btrfs/volumes.h
View file @
788f20eb
...
...
@@ -133,4 +133,5 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans,
struct
btrfs_device
*
btrfs_find_device
(
struct
btrfs_root
*
root
,
u64
devid
,
u8
*
uuid
);
int
btrfs_shrink_device
(
struct
btrfs_device
*
device
,
u64
new_size
);
int
btrfs_init_new_device
(
struct
btrfs_root
*
root
,
char
*
path
);
#endif
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