[systemd-devel] [PATCH] nspawn: allow bind-mounting char and block files
Alban Crequy
muadda at gmail.com
Thu Jan 22 07:32:26 PST 2015
On 22 January 2015 at 13:51, Lennart Poettering <lennart at poettering.net> wrote:
> On Thu, 22.01.15 13:25, Alban Crequy (muadda at gmail.com) wrote:
>
>> From: Alban Crequy <alban at endocode.com>
>
> Hmm, I wonder if we can actually simplify this. IIRC the rules for
> over-mounting are simpler than I thought initially:
>
> a) dirs can only over-mount dirs
>
> b) everything else can over-mount everything else
>
> With that in mind I think we can collapse this code to only have two
> branches: one branch for the S_ISDIR() case, and another one that uses
> touch() for everything else.
>
> Anychance you can simplify the patch like this? The benefit would be
> that we can do without CAP_SYS_MKNOD for all of this. Also, your patch
> woud then shorten the code, while adding a feature, not make it
> longer!
The patch will be a bit longer because the file type checks in
mount_binds() need to be updated. Otherwise, the second attempt of
running nspawn would fail.
I will send the patch v2 shortly.
>> ---
>> src/nspawn/nspawn.c | 7 +++++--
>> 1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
>> index 3fce3ad..db57b24 100644
>> --- a/src/nspawn/nspawn.c
>> +++ b/src/nspawn/nspawn.c
>> @@ -911,8 +911,7 @@ static int mount_binds(const char *dest, char **l, bool ro) {
>> return -errno;
>> }
>>
>> - /* Create the mount point, but be conservative -- refuse to create block
>> - * and char devices. */
>> + /* Create the mount point */
>> if (S_ISDIR(source_st.st_mode)) {
>> r = mkdir_label(where, 0755);
>> if (r < 0 && errno != EEXIST)
>> @@ -929,6 +928,10 @@ static int mount_binds(const char *dest, char **l, bool ro) {
>> r = touch(where);
>> if (r < 0)
>> return log_error_errno(r, "Failed to create mount point %s: %m", where);
>> + } else if (S_ISCHR(source_st.st_mode) || !S_ISBLK(source_st.st_mode)) {
>> + r = mknod(where, source_st.st_mode, source_st.st_rdev) < 0;
>> + if (r < 0 && errno != EEXIST)
>> + return log_error_errno(errno, "Failed to create mount point %s: %m", where);
>> } else {
>> log_error("Refusing to create mountpoint for file: %s", *x);
>> return -ENOTSUP;
>> --
>> 2.1.4
>>
>> _______________________________________________
>> systemd-devel mailing list
>> systemd-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
>
>
> Lennart
>
> --
> Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list