Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
lxc
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
lxc
Commits
fb49a3cb
Unverified
Commit
fb49a3cb
authored
Jul 16, 2017
by
Christian Brauner
Committed by
Stéphane Graber
Aug 14, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
btrfs: non-functional changes
Signed-off-by:
Christian Brauner
<
christian.brauner@ubuntu.com
>
parent
d5191538
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
59 additions
and
40 deletions
+59
-40
lxcbtrfs.c
src/lxc/bdev/lxcbtrfs.c
+59
-40
No files found.
src/lxc/bdev/lxcbtrfs.c
View file @
fb49a3cb
...
...
@@ -222,38 +222,40 @@ int btrfs_umount(struct bdev *bdev)
static
int
btrfs_subvolume_create
(
const
char
*
path
)
{
int
ret
,
fd
=
-
1
;
struct
btrfs_ioctl_vol_args
args
;
char
*
p
,
*
newfull
=
strdup
(
path
);
int
ret
,
saved_errno
;
struct
btrfs_ioctl_vol_args
args
;
char
*
p
,
*
newfull
;
int
fd
=
-
1
;
newfull
=
strdup
(
path
);
if
(
!
newfull
)
{
ERROR
(
"Error: out of memory"
)
;
return
-
1
;
errno
=
ENOMEM
;
return
-
ENOMEM
;
}
p
=
strrchr
(
newfull
,
'/'
);
if
(
!
p
)
{
ERROR
(
"bad path: %s"
,
path
);
free
(
newfull
);
return
-
1
;
errno
=
EINVAL
;
return
-
EINVAL
;
}
*
p
=
'\0'
;
fd
=
open
(
newfull
,
O_RDONLY
);
free
(
newfull
);
if
(
fd
<
0
)
{
ERROR
(
"Error opening %s"
,
newfull
);
free
(
newfull
);
return
-
1
;
return
-
errno
;
}
memset
(
&
args
,
0
,
sizeof
(
args
));
strncpy
(
args
.
name
,
p
+
1
,
BTRFS_SUBVOL_NAME_MAX
);
args
.
name
[
BTRFS_SUBVOL_NAME_MAX
-
1
]
=
0
;
strncpy
(
args
.
name
,
p
+
1
,
BTRFS_SUBVOL_NAME_MAX
);
args
.
name
[
BTRFS_SUBVOL_NAME_MAX
-
1
]
=
0
;
ret
=
ioctl
(
fd
,
BTRFS_IOC_SUBVOL_CREATE
,
&
args
);
INFO
(
"btrfs: snapshot create ioctl returned %d"
,
ret
)
;
saved_errno
=
errno
;
free
(
newfull
);
close
(
fd
);
errno
=
saved_errno
;
return
ret
;
}
...
...
@@ -300,39 +302,37 @@ out:
int
btrfs_snapshot
(
const
char
*
orig
,
const
char
*
new
)
{
struct
btrfs_ioctl_vol_args_v2
args
;
char
*
newdir
,
*
newname
;
char
*
newfull
=
NULL
;
int
saved_errno
=
-
1
;
int
fd
=
-
1
,
fddst
=
-
1
,
ret
=
-
1
;
struct
btrfs_ioctl_vol_args_v2
args
;
char
*
newdir
,
*
newname
,
*
newfull
=
NULL
;
newfull
=
strdup
(
new
);
if
(
!
newfull
)
{
ERROR
(
"Error: out of memory"
);
if
(
!
newfull
)
goto
out
;
}
// make sure the directory doesn't already exist
if
(
rmdir
(
newfull
)
<
0
&&
errno
!=
ENOENT
)
{
SYSERROR
(
"Error removing empty new rootfs"
);
ret
=
rmdir
(
newfull
);
if
(
ret
<
0
&&
errno
!=
ENOENT
)
goto
out
;
}
newname
=
basename
(
newfull
);
newdir
=
dirname
(
newfull
);
fd
=
open
(
orig
,
O_RDONLY
);
if
(
fd
<
0
)
{
SYSERROR
(
"Error opening original rootfs %s"
,
orig
);
if
(
fd
<
0
)
goto
out
;
}
newdir
=
dirname
(
newfull
);
fddst
=
open
(
newdir
,
O_RDONLY
);
if
(
fddst
<
0
)
{
SYSERROR
(
"Error opening new container dir %s"
,
newdir
);
if
(
fddst
<
0
)
goto
out
;
}
memset
(
&
args
,
0
,
sizeof
(
args
));
args
.
fd
=
fd
;
strncpy
(
args
.
name
,
newname
,
BTRFS_SUBVOL_NAME_MAX
);
args
.
name
[
BTRFS_SUBVOL_NAME_MAX
-
1
]
=
0
;
args
.
name
[
BTRFS_SUBVOL_NAME_MAX
-
1
]
=
0
;
ret
=
ioctl
(
fddst
,
BTRFS_IOC_SNAP_CREATE_V2
,
&
args
);
INFO
(
"btrfs: snapshot create ioctl returned %d"
,
ret
)
;
saved_errno
=
errno
;
out:
if
(
fddst
!=
-
1
)
...
...
@@ -340,6 +340,9 @@ out:
if
(
fd
!=
-
1
)
close
(
fd
);
free
(
newfull
);
if
(
saved_errno
>=
0
)
errno
=
saved_errno
;
return
ret
;
}
...
...
@@ -354,13 +357,13 @@ static int btrfs_snapshot_wrapper(void *data)
}
if
(
setgroups
(
0
,
NULL
)
<
0
)
WARN
(
"Failed to clear groups"
);
if
(
setuid
(
0
)
<
0
)
{
ERROR
(
"Failed to setuid to 0"
);
return
-
1
;
}
src
=
lxc_storage_get_path
(
arg
->
src
,
"btrfs"
);
return
btrfs_snapshot
(
src
,
arg
->
dest
);
}
...
...
@@ -369,6 +372,7 @@ int btrfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
const
char
*
lxcpath
,
int
snap
,
uint64_t
newsize
,
struct
lxc_conf
*
conf
)
{
int
ret
;
char
*
src
;
if
(
!
orig
->
dest
||
!
orig
->
src
)
...
...
@@ -385,16 +389,27 @@ int btrfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
(
const
char
*
[]){
"btrfs:"
,
*
lxcpath
!=
'/'
?
lxcpath
:
++
lxcpath
,
cname
,
"rootfs"
,
NULL
},
false
);
if
(
!
new
->
src
)
if
(
!
new
->
src
)
{
ERROR
(
"Failed to create new rootfs path"
);
return
-
1
;
}
TRACE
(
"Created new rootfs path
\"
%s
\"
"
,
new
->
src
);
src
=
lxc_storage_get_path
(
new
->
src
,
"btrfs"
);
new
->
dest
=
strdup
(
src
);
if
(
!
new
->
dest
)
if
(
!
new
->
dest
)
{
ERROR
(
"Failed to duplicate string
\"
%s
\"
"
,
src
);
return
-
1
;
}
if
(
orig
->
mntopts
&&
(
new
->
mntopts
=
strdup
(
orig
->
mntopts
))
==
NULL
)
return
-
1
;
if
(
orig
->
mntopts
)
{
new
->
mntopts
=
strdup
(
orig
->
mntopts
);
if
(
!
new
->
mntopts
)
{
ERROR
(
"Failed to duplicate string
\"
%s
\"
"
,
orig
->
mntopts
);
return
-
1
;
}
}
if
(
snap
)
{
struct
rsync_data_char
sdata
;
...
...
@@ -406,12 +421,16 @@ int btrfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
"btrfs_snapshot_wrapper"
);
}
if
(
rmdir
(
new
->
dest
)
<
0
&&
errno
!=
ENOENT
)
{
SYSERROR
(
"removing %s"
,
new
->
dest
);
ret
=
rmdir
(
new
->
dest
);
if
(
ret
<
0
&&
errno
!=
ENOENT
)
{
SYSERROR
(
"Failed to remove directory
\"
%s
\"
"
,
new
->
dest
);
return
-
1
;
}
return
btrfs_subvolume_create
(
new
->
dest
);
ret
=
btrfs_subvolume_create
(
new
->
dest
);
if
(
ret
<
0
)
SYSERROR
(
"Failed to create btrfs subvolume
\"
%s
\"
"
,
new
->
dest
);
return
ret
;
}
static
int
btrfs_do_destroy_subvol
(
const
char
*
path
)
...
...
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