Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
steam
systemd
Commits
449ddb2d
Commit
449ddb2d
authored
Aug 20, 2010
by
Lennart Poettering
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remount: add tool that applies /etc/fstab mount options to all api mounts
parent
11ce3427
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
199 additions
and
13 deletions
+199
-13
.gitignore
.gitignore
+1
-0
Makefile.am
Makefile.am
+14
-1
fixme
fixme
+2
-4
src/hashmap.c
src/hashmap.c
+9
-0
src/hashmap.h
src/hashmap.h
+1
-0
src/mount-setup.c
src/mount-setup.c
+2
-2
src/remount-api-vfs.c
src/remount-api-vfs.c
+147
-0
src/set.c
src/set.c
+1
-6
units/.gitignore
units/.gitignore
+1
-0
units/systemd-modules-load.service.in
units/systemd-modules-load.service.in
+1
-0
units/systemd-remount-api-vfs.service.in
units/systemd-remount-api-vfs.service.in
+20
-0
No files found.
.gitignore
View file @
449ddb2d
systemd-remount-api-vfs
test-hostname
systemd-modules-load
systemd-auto-console-getty
...
...
Makefile.am
View file @
449ddb2d
...
...
@@ -74,7 +74,8 @@ rootlibexec_PROGRAMS = \
systemd-random-seed
\
systemd-shutdownd
\
systemd-auto-console-getty
\
systemd-modules-load
systemd-modules-load
\
systemd-remount-api-vfs
noinst_PROGRAMS
=
\
test-engine
\
...
...
@@ -175,6 +176,7 @@ nodist_systemunit_DATA = \
units/systemd-shutdownd.service
\
units/systemd-auto-console-getty.service
\
units/systemd-modules-load.service
\
units/systemd-remount-api-vfs.service
\
units/systemd-update-utmp-runlevel.service
\
units/systemd-update-utmp-shutdown.service
\
units/systemd-random-seed-save.service
\
...
...
@@ -199,6 +201,7 @@ EXTRA_DIST = \
units/systemd-shutdownd.service.in
\
units/systemd-auto-console-getty.service.in
\
units/systemd-modules-load.service.in
\
units/systemd-remount-api-vfs.service.in
\
units/systemd-update-utmp-runlevel.service.in
\
units/systemd-update-utmp-shutdown.service.in
\
units/systemd-random-seed-save.service.in
\
...
...
@@ -586,6 +589,16 @@ systemd_modules_load_CFLAGS = \
systemd_modules_load_LDADD
=
\
libsystemd-basic.la
systemd_remount_api_vfs_SOURCES
=
\
src/remount-api-vfs.c
\
src/mount-setup.c
systemd_remount_api_vfs_CFLAGS
=
\
$(AM_CFLAGS)
systemd_remount_api_vfs_LDADD
=
\
libsystemd-basic.la
systemd_cgroups_agent_SOURCES
=
\
src/cgroups-agent.c
\
src/dbus-common.c
...
...
fixme
View file @
449ddb2d
...
...
@@ -42,8 +42,6 @@
* selinux policy loading
* place /etc/inittab with explaining blurb.
* fingerprint.target, wireless.target, gps.target
* set_put(), hashmap_put() return values checken. i.e. == 0 macht kein free()!
...
...
@@ -60,10 +58,10 @@
* bash completion a la gdbus
* api mounts gegen fstab mergen und remounten
External:
* place /etc/inittab with explaining blurb.
* procps, psmisc, sysvinit-tools, hostname → util-linux-ng
* nologin nach /var/run https://bugzilla.redhat.com/show_bug.cgi?id=624489
...
...
src/hashmap.c
View file @
449ddb2d
...
...
@@ -173,6 +173,15 @@ void hashmap_free(Hashmap*h) {
free
(
h
);
}
void
hashmap_free_free
(
Hashmap
*
h
)
{
void
*
p
;
while
((
p
=
hashmap_steal_first
(
h
)))
free
(
p
);
hashmap_free
(
h
);
}
void
hashmap_clear
(
Hashmap
*
h
)
{
if
(
!
h
)
return
;
...
...
src/hashmap.h
View file @
449ddb2d
...
...
@@ -47,6 +47,7 @@ int trivial_compare_func(const void *a, const void *b);
Hashmap
*
hashmap_new
(
hash_func_t
hash_func
,
compare_func_t
compare_func
);
void
hashmap_free
(
Hashmap
*
h
);
void
hashmap_free_free
(
Hashmap
*
h
);
Hashmap
*
hashmap_copy
(
Hashmap
*
h
);
int
hashmap_ensure_allocated
(
Hashmap
**
h
,
hash_func_t
hash_func
,
compare_func_t
compare_func
);
...
...
src/mount-setup.c
View file @
449ddb2d
...
...
@@ -68,11 +68,11 @@ bool mount_point_is_api(const char *path) {
* should be ignored */
for
(
i
=
0
;
i
<
ELEMENTSOF
(
mount_table
);
i
++
)
if
(
path_
startswith
(
path
,
mount_table
[
i
].
where
))
if
(
path_
equal
(
path
,
mount_table
[
i
].
where
))
return
true
;
for
(
i
=
0
;
i
<
ELEMENTSOF
(
ignore_paths
);
i
++
)
if
(
path_
startswith
(
path
,
ignore_paths
[
i
]))
if
(
path_
equal
(
path
,
ignore_paths
[
i
]))
return
true
;
return
path_startswith
(
path
,
"/cgroup/"
);
...
...
src/remount-api-vfs.c
0 → 100644
View file @
449ddb2d
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
Copyright 2010 Lennart Poettering
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <mntent.h>
#include "log.h"
#include "util.h"
#include "set.h"
#include "mount-setup.h"
/* Goes through /etc/fstab and remounts all API file systems, applying
* options that are in /etc/fstab that systemd might not have
* respected */
int
main
(
int
argc
,
char
*
argv
[])
{
int
ret
=
1
;
FILE
*
f
=
NULL
;
struct
mntent
*
me
;
Hashmap
*
pids
=
NULL
;
if
(
argc
>
1
)
{
log_error
(
"This program takes no argument."
);
return
1
;
}
log_set_target
(
LOG_TARGET_SYSLOG_OR_KMSG
);
log_parse_environment
();
log_open
();
if
(
!
(
f
=
setmntent
(
"/etc/fstab"
,
"r"
)))
{
log_error
(
"Failed to open /etc/fstab: %m"
);
goto
finish
;
}
if
(
!
(
pids
=
hashmap_new
(
trivial_hash_func
,
trivial_compare_func
)))
{
log_error
(
"Failed to allocate set"
);
goto
finish
;
}
ret
=
0
;
while
((
me
=
getmntent
(
f
)))
{
pid_t
pid
;
int
k
;
char
*
s
;
if
(
!
mount_point_is_api
(
me
->
mnt_dir
))
continue
;
log_debug
(
"Remounting %s"
,
me
->
mnt_dir
);
if
((
pid
=
fork
())
<
0
)
{
log_error
(
"Failed to fork: %m"
);
ret
=
1
;
continue
;
}
if
(
pid
==
0
)
{
const
char
*
arguments
[
5
];
/* Child */
arguments
[
0
]
=
"/bin/mount"
;
arguments
[
1
]
=
me
->
mnt_dir
;
arguments
[
2
]
=
"-o"
;
arguments
[
3
]
=
"remount"
;
arguments
[
4
]
=
NULL
;
execv
(
"/bin/mount"
,
(
char
**
)
arguments
);
log_error
(
"Failed to execute /bin/mount: %m"
);
_exit
(
1
);
}
/* Parent */
s
=
strdup
(
me
->
mnt_dir
);
if
((
k
=
hashmap_put
(
pids
,
UINT_TO_PTR
(
pid
),
s
))
<
0
)
{
log_error
(
"Failed to add PID to set: %s"
,
strerror
(
-
k
));
ret
=
1
;
continue
;
}
}
while
(
!
hashmap_isempty
(
pids
))
{
siginfo_t
si
;
char
*
s
;
zero
(
si
);
if
(
waitid
(
P_ALL
,
0
,
&
si
,
WEXITED
)
<
0
)
{
if
(
errno
==
EINTR
)
continue
;
log_error
(
"waitid() failed: %m"
);
ret
=
1
;
break
;
}
if
((
s
=
hashmap_remove
(
pids
,
UINT_TO_PTR
(
si
.
si_pid
))))
{
if
(
!
is_clean_exit
(
si
.
si_code
,
si
.
si_status
))
{
if
(
si
.
si_code
==
CLD_EXITED
)
log_error
(
"/bin/mount for %s exited with exit status %i."
,
s
,
si
.
si_status
);
else
log_error
(
"/bin/mount for %s terminated by signal %s."
,
s
,
signal_to_string
(
si
.
si_status
));
ret
=
1
;
}
free
(
s
);
}
}
finish:
if
(
pids
)
hashmap_free_free
(
pids
);
if
(
f
)
endmntent
(
f
);
return
ret
;
}
src/set.c
View file @
449ddb2d
...
...
@@ -38,12 +38,7 @@ void set_free(Set* s) {
}
void
set_free_free
(
Set
*
s
)
{
void
*
p
;
while
((
p
=
set_steal_first
(
s
)))
free
(
p
);
set_free
(
s
);
hashmap_free_free
(
MAKE_HASHMAP
(
s
));
}
int
set_ensure_allocated
(
Set
**
s
,
hash_func_t
hash_func
,
compare_func_t
compare_func
)
{
...
...
units/.gitignore
View file @
449ddb2d
systemd-modules-load.service
systemd-remount-api-vfs.service
systemd-auto-console-getty.service
systemd-shutdownd.service
systemd-random-seed-load.service
...
...
units/systemd-modules-load.service.in
View file @
449ddb2d
...
...
@@ -13,6 +13,7 @@ Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=@rootlibexecdir@/systemd-modules-load
[Install]
...
...
units/systemd-remount-api-vfs.service.in
0 → 100644
View file @
449ddb2d
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
[Unit]
Description=Remount API VFS
DefaultDependencies=no
Conflicts=shutdown.target
Before=shutdown.target local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=@rootlibexecdir@/systemd-remount-vfs
[Install]
WantedBy=sysinit.target
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