[systemd-devel] [PATCH 0/3] SELinuxContext configuration, v2

2014-02-06 Thread Michael Scherer
This series of patch implement a SELinuxContext configuration item,
whose usage is explained in the first mail. This patch series take in 
account the feedback received on 
http://lists.freedesktop.org/archives/systemd-devel/2013-December/015875.html

Michael Scherer (3):
  Add SELinuxContext configuration item
  Ignore the setting SELinuxContext if selinux is not enabled
  Add support for ignoring errors on SELinuxContext by prefixing it with
-, like for others settings.

 man/systemd.exec.xml  | 13 +
 src/core/dbus-execute.c   |  1 +
 src/core/execute.c| 29 +
 src/core/execute.h|  2 ++
 src/core/load-fragment-gperf.gperf.m4 |  3 ++-
 src/shared/exit-status.c  |  3 +++
 src/shared/exit-status.h  |  3 ++-
 7 files changed, 52 insertions(+), 2 deletions(-)

-- 
1.8.5.3

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 2/3] Ignore the setting SELinuxContext if selinux is not enabled

2014-02-06 Thread Michael Scherer
---
 src/core/execute.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/core/execute.c b/src/core/execute.c
index c02c768..474a4af 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -1569,7 +1569,7 @@ int exec_spawn(ExecCommand *command,
 }
 }
 #ifdef HAVE_SELINUX
-if (context->selinux_context) {
+if (context->selinux_context && use_selinux()) {
 err = 
security_check_context(context->selinux_context);
 if (err < 0) {
 r = EXIT_SELINUX_CONTEXT;
-- 
1.8.5.3

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 1/3] Add SELinuxContext configuration item

2014-02-06 Thread Michael Scherer
This permit to let system administrators decide of the domain of a service.
This can be used with templated units to have each service in a différent
domain ( for example, a per customer database, using MLS or anything ),
or can be used to force a non selinux enabled system (jvm, erlang, etc)
to start in a different domain for each service.
---
 man/systemd.exec.xml  | 11 +++
 src/core/dbus-execute.c   |  1 +
 src/core/execute.c| 27 +++
 src/core/execute.h|  2 ++
 src/core/load-fragment-gperf.gperf.m4 |  3 ++-
 src/shared/exit-status.c  |  3 +++
 src/shared/exit-status.h  |  3 ++-
 7 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 7eaf52b..4281c03 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -951,6 +951,17 @@
 
 
 
+SELinuxContext=
+
+Set the SELinux context of the
+executed process. If set, this will override 
the
+automated domain transition. However, the 
policy
+still need to autorize the transition. See
+
setexeccon3
+for details.
+
+
+
 IgnoreSIGPIPE=
 
 Takes a boolean
diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
index d2bbda2..438bf59 100644
--- a/src/core/dbus-execute.c
+++ b/src/core/dbus-execute.c
@@ -419,6 +419,7 @@ const sd_bus_vtable bus_exec_vtable[] = {
 SD_BUS_PROPERTY("PrivateDevices", "b", bus_property_get_bool, 
offsetof(ExecContext, private_devices), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY("SameProcessGroup", "b", bus_property_get_bool, 
offsetof(ExecContext, same_pgrp), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY("UtmpIdentifier", "s", NULL, offsetof(ExecContext, 
utmp_id), SD_BUS_VTABLE_PROPERTY_CONST),
+SD_BUS_PROPERTY("SELinuxContext", "s", NULL, offsetof(ExecContext, 
selinux_context), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY("IgnoreSIGPIPE", "b", bus_property_get_bool, 
offsetof(ExecContext, ignore_sigpipe), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY("NoNewPrivileges", "b", bus_property_get_bool, 
offsetof(ExecContext, no_new_privileges), SD_BUS_VTABLE_PROPERTY_CONST),
 SD_BUS_PROPERTY("SystemCallFilter", "au", property_get_syscall_filter, 
0, SD_BUS_VTABLE_PROPERTY_CONST),
diff --git a/src/core/execute.c b/src/core/execute.c
index 91e4352..c02c768 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -47,6 +47,10 @@
 #include 
 #endif
 
+#ifdef HAVE_SELINUX
+#include 
+#endif
+
 #include "execute.h"
 #include "strv.h"
 #include "macro.h"
@@ -1564,6 +1568,20 @@ int exec_spawn(ExecCommand *command,
 goto fail_child;
 }
 }
+#ifdef HAVE_SELINUX
+if (context->selinux_context) {
+err = 
security_check_context(context->selinux_context);
+if (err < 0) {
+r = EXIT_SELINUX_CONTEXT;
+goto fail_child;
+}
+err = setexeccon(context->selinux_context);
+if (err < 0) {
+r = EXIT_SELINUX_CONTEXT;
+goto fail_child;
+}
+}
+#endif
 }
 
 err = build_environment(context, n_fds, watchdog_usec, home, 
username, shell, &our_env);
@@ -1722,6 +1740,9 @@ void exec_context_done(ExecContext *c) {
 free(c->utmp_id);
 c->utmp_id = NULL;
 
+free(c->selinux_context);
+c->selinux_context = NULL;
+
 free(c->syscall_filter);
 c->syscall_filter = NULL;
 }
@@ -2091,6 +2112,12 @@ void exec_context_dump(ExecContext *c, FILE* f, const 
char *prefix) {
 fprintf(f,
 "%sUtmpIdentifier: %s\n",
 prefix, c->utmp_id);
+
+if (c->selinux_context)
+fprintf(f,
+"%sSELinuxContext: %s\n",
+prefix, c->selinux_context);
+
 }
 
 void exec_status_start(ExecStatus *s, pid_t pid) {
diff --git a/src/core/execute.h b/src/core/execute.h
index 4851152..be811a9 100644
--- a/src/core/execute.h
+++ b/src/core/execute.h
@@ -133,6 +133,8 @@ struct ExecContext {
 
 char *utmp_id;
 
+char *selinux_context;
+
 char **read_write_dirs, **read_only_di

[systemd-devel] [PATCH 3/3] Add support for ignoring errors on SELinuxContext by prefixing it with -, like for others settings.

2014-02-06 Thread Michael Scherer
Also remove call to security_check_context, as this doesn't serve anything, 
since
setexeccon will fail anyway.
---
 man/systemd.exec.xml |  4 +++-
 src/core/execute.c   | 14 --
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/man/systemd.exec.xml b/man/systemd.exec.xml
index 4281c03..ecf48a7 100644
--- a/man/systemd.exec.xml
+++ b/man/systemd.exec.xml
@@ -956,7 +956,9 @@
 Set the SELinux context of the
 executed process. If set, this will override 
the
 automated domain transition. However, the 
policy
-still need to autorize the transition. See
+still need to autorize the transition. This 
directive
+is ignored if SELinux is disabled. If prefixed 
by -,
+all errors will be ignored. See
 
setexeccon3
 for details.
 
diff --git a/src/core/execute.c b/src/core/execute.c
index 474a4af..a4b3405 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -72,6 +72,7 @@
 #include "fileio.h"
 #include "unit.h"
 #include "async.h"
+#include "selinux-util.h"
 
 #define IDLE_TIMEOUT_USEC (5*USEC_PER_SEC)
 #define IDLE_TIMEOUT2_USEC (1*USEC_PER_SEC)
@@ -1570,13 +1571,14 @@ int exec_spawn(ExecCommand *command,
 }
 #ifdef HAVE_SELINUX
 if (context->selinux_context && use_selinux()) {
-err = 
security_check_context(context->selinux_context);
-if (err < 0) {
-r = EXIT_SELINUX_CONTEXT;
-goto fail_child;
+bool ignore = false;
+char* c = context->selinux_context;
+if (c[0] == '-') {
+c++;
+ignore = true;
 }
-err = setexeccon(context->selinux_context);
-if (err < 0) {
+err = setexeccon(c);
+if (err < 0 && !ignore) {
 r = EXIT_SELINUX_CONTEXT;
 goto fail_child;
 }
-- 
1.8.5.3

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] Howto run systemd within a linux container

2014-02-06 Thread Daniel P. Berrange
On Wed, Feb 05, 2014 at 11:44:33PM +0100, Richard Weinberger wrote:
> Hi!
> 
> We're heavily using Linux containers in our production environment.
> As modern Linux distributions move forward to systemd have to make sure that
> systemd works within our containers.
> 
> Sadly we're facing issues with cgroups.
> Our testbed consists of openSUSE 13.1 with Linux 3.13.1 and libvirt 1.2.1.
> 
> In a plain setup systemd stops immediately because it is unable to
> create the cgroup hierarchy.
> Mostly because the container uid 0 is in a user namespace and has no
> rights to do that.

FYI I have succesfully run Fedora 19 with systemd inside a container
with libvirt LXC, however, I did *not* enable user namespaces. Every
time I try user namespaces I find some other bug in either the kernel
or libvirt, so I wouldn't be surprised if yet more breakage has
occurred in user namepsaces :-(


> Next try, fool systemd by mounting a tmpfs to /sys/fs/cgroup/systemd/.
> This seems to work. openSUSE boots, I can start/stop services...
> Shutdown hangs forever, had no time to investigate so far.
> 
> But is this tmpfs hack the correct way to run systemd in a container?
> I really don't think so.

Yeah that really shouldnt' be needed. When libvirt runs a container it
creates a cgroup just for that container to run in, and systemd should
be able to create its hierarchy under that location.

That said, I wonder if libvirt is perhaps forgetting to chown() the
cgroup to the UID/GID you've mapped for the root user. That would
certainly prevent systemd using it and could cause the sort of pain
you see.


Daniel
-- 
|: http://berrange.com  -o-http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org  -o- http://virt-manager.org :|
|: http://autobuild.org   -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org   -o-   http://live.gnome.org/gtk-vnc :|
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] Howto run systemd within a linux container

2014-02-06 Thread Greg KH
On Thu, Feb 06, 2014 at 10:55:01AM +, Daniel P. Berrange wrote:
> On Wed, Feb 05, 2014 at 11:44:33PM +0100, Richard Weinberger wrote:
> > Hi!
> > 
> > We're heavily using Linux containers in our production environment.
> > As modern Linux distributions move forward to systemd have to make sure that
> > systemd works within our containers.
> > 
> > Sadly we're facing issues with cgroups.
> > Our testbed consists of openSUSE 13.1 with Linux 3.13.1 and libvirt 1.2.1.
> > 
> > In a plain setup systemd stops immediately because it is unable to
> > create the cgroup hierarchy.
> > Mostly because the container uid 0 is in a user namespace and has no
> > rights to do that.
> 
> FYI I have succesfully run Fedora 19 with systemd inside a container
> with libvirt LXC, however, I did *not* enable user namespaces. Every
> time I try user namespaces I find some other bug in either the kernel
> or libvirt, so I wouldn't be surprised if yet more breakage has
> occurred in user namepsaces :-(

Those bugs should now be fixed, if you don't enable the option, how are
we supposed to know what is left to be done?  :)

greg k-h
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] Howto run systemd within a linux container

2014-02-06 Thread Daniel P. Berrange
On Thu, Feb 06, 2014 at 04:33:22PM +0100, Greg KH wrote:
> On Thu, Feb 06, 2014 at 10:55:01AM +, Daniel P. Berrange wrote:
> > On Wed, Feb 05, 2014 at 11:44:33PM +0100, Richard Weinberger wrote:
> > > Hi!
> > > 
> > > We're heavily using Linux containers in our production environment.
> > > As modern Linux distributions move forward to systemd have to make sure 
> > > that
> > > systemd works within our containers.
> > > 
> > > Sadly we're facing issues with cgroups.
> > > Our testbed consists of openSUSE 13.1 with Linux 3.13.1 and libvirt 1.2.1.
> > > 
> > > In a plain setup systemd stops immediately because it is unable to
> > > create the cgroup hierarchy.
> > > Mostly because the container uid 0 is in a user namespace and has no
> > > rights to do that.
> > 
> > FYI I have succesfully run Fedora 19 with systemd inside a container
> > with libvirt LXC, however, I did *not* enable user namespaces. Every
> > time I try user namespaces I find some other bug in either the kernel
> > or libvirt, so I wouldn't be surprised if yet more breakage has
> > occurred in user namepsaces :-(
> 
> Those bugs should now be fixed, if you don't enable the option, how are
> we supposed to know what is left to be done?  :)

I have in fact been building my own kernels for Fedora with user namespaces
enabled to debug / test this and have reported all the bugs I found so far.
Just saying that with the track record of bugs since the userns code first
merged, I wouldn't be surprised if there were still more things to iron
out as we try more real world apps like systemd.

Regads,
Daniel
-- 
|: http://berrange.com  -o-http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org  -o- http://virt-manager.org :|
|: http://autobuild.org   -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org   -o-   http://live.gnome.org/gtk-vnc :|
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] tty: Set correct tty name in 'active' sysfs attribute

2014-02-06 Thread Hannes Reinecke
On 02/05/2014 01:53 PM, David Herrmann wrote:
> Hi
> 
> On Wed, Feb 5, 2014 at 11:11 AM, Hannes Reinecke  wrote:
>> The 'active' sysfs attribute should refer to the currently
>> active tty devices the console is running on, not the currently
>> active console.
>> The console structure doesn't refer to any device in sysfs,
>> only the tty the console is running on has.
>> So we need to print out the tty names in 'active', not
>> the console names.
>>
>> Cc: Lennart Poettering 
>> Cc: Kay Sievers 
>> Signed-off-by: Werner Fink 
>> Signed-off-by: Hannes Reinecke 
>> ---
>>  drivers/tty/tty_io.c | 14 --
>>  1 file changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
>> index c74a00a..17db8ca 100644
>> --- a/drivers/tty/tty_io.c
>> +++ b/drivers/tty/tty_io.c
>> @@ -3545,9 +3545,19 @@ static ssize_t show_cons_active(struct device *dev,
>> if (i >= ARRAY_SIZE(cs))
>> break;
>> }
>> -   while (i--)
>> +   while (i--) {
>> +   const struct tty_driver *driver;
>> +   const char *name = cs[i]->name;
>> +   int index = cs[i]->index;
>> +
>> +   driver = cs[i]->device(cs[i], &index);
>> +   if (driver) {
>> +   index += driver->name_base;
>> +   name = driver->name;
>> +   }
>> count += sprintf(buf + count, "%s%d%c",
>> -cs[i]->name, cs[i]->index, i ? ' ':'\n');
>> +name, index, i ? ' ':'\n');
>> +   }
> 
> Nice catch and indeed, systemd already relies on these names to be
> identical to their char-dev name. Fortunately, VTs and most serial
> devices register the console with the same name as the TTY, so we're
> fine.
> Two minor nitpicks:
> 1) Could you use tty_line_name() instead of sprintf()? It's in the
> same file and avoids duplicating the name_base logic.
Ok. Not that it makes the patch nicer, but hey.

> 2) Does it make sense to print the console-name if ->device() returns
> NULL? Seems weird if we print console-names and tty-names in the same
> attribute. It's unlikely that it causes problems, but there might be
> conflicts.
> 
This is basically a fallback; this is the old behaviour, which still
might be called for when coming across a tty which just has a stub
for the ->device callback.
It's not that the '->device' callback is used that frequently, so I
wouldn't be surprised here.

Meanwhile I've sent a new patch, reviews are welcome there.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke   zSeries & Storage
h...@suse.de  +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] udev: Adding zram to inappropriate block device

2014-02-06 Thread Greg KH
On Thu, Feb 06, 2014 at 03:58:59AM +0100, Zbigniew Jędrzejewski-Szmek wrote:
> On Thu, Feb 06, 2014 at 03:27:07AM +0100, Greg KH wrote:
> > On Thu, Feb 06, 2014 at 01:31:37AM +0100, Zbigniew Jędrzejewski-Szmek wrote:
> > > Patch applied.
> > > 
> > > On Mon, Feb 03, 2014 at 10:33:37AM +, "Jóhann B. Guðmundsson" wrote:
> > > > On 02/03/2014 09:36 AM, Holger Schurig wrote:
> > > > >>with unit type ending in .zswap
> > > > >No, not another unit type. Instead better amend .swap unit types to
> > > > >also know about ZRAM.
> > > > >
> > > > >However, isn't this a bit early? Shouldn't move ZRAM first move out of 
> > > > >staging?
> > > > 
> > > > Ofcourse but when it does move out of staging we could have sorted
> > > > this implementation detail out which basically boils down to where
> > > > to set the partition sizes for the zram partitions (
> > > > tmpfiles.d/zram-conf or /etc/zram.d/zram-conf )
> > > > 
> > > > Do we want a script that basically just set this size based on
> > > > available memory per core in the udev rule.
> > > > 
> > > > factor=25
> > > > num_cpus=$(grep -c processor /proc/cpuinfo)
> > > > memtotal=$(grep MemTotal /proc/meminfo | sed 's/[^0-9]\+//g')
> > > > mem_by_cpu=$(($memtotal/$num_cpus*$factor/100*1024))
> > > > echo $mem_by_cpu
> > > 
> > > [Side note: I'm reading Documentation/blockdev/zram.txt...
> > > It says "1. modprobe zram num_devices=4". I can't help thinking that
> > > we went over this with /dev/loop-control and others... Since this
> > > is a new interface, why does it repeat the same pitfall of not
> > > having a control device?]
> > 
> > We can always change this now, quick, before 3.14 is out.
> > 
> > What would a control device help with here?
> Right now you have to decide before loading the module how many
> devices you want. And also when trying to use a device (any device),
> you have to look for one. The same issues as with loop.

Given that the code doesn't have the ability to dynamically add/remove
devices, I think we are stuck with this, right?

greg k-h
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCHv2] tty: Set correct tty name in 'active' sysfs attribute

2014-02-06 Thread Hannes Reinecke
On 02/06/2014 04:29 PM, Greg Kroah-Hartman wrote:
> On Thu, Feb 06, 2014 at 03:27:43PM +0100, Hannes Reinecke wrote:
>> The 'active' sysfs attribute should refer to the currently
>> active tty devices the console is running on, not the currently
>> active console.
> 
> That's not what Documentation/ABI/sysfs-tty says:
>  Shows the list of currently configured   
>   
>  console devices, like 'tty1 ttyS0'.  
>   
>  The last entry in the file is the active 
>   
>  device connected to /dev/console.
>   
>  The file supports poll() to detect virtual   
>   
>  console switches. 
> 
The problem is indeed with 'console devices'. There is no such
thing; you only have tty devices where the console is running on.

>> The console structure doesn't refer to any device in sysfs,
>> only the tty the console is running on has.
> 
> That sentance doesn't make sense.
> 
>> So we need to print out the tty names in 'active', not
>> the console names.
> 
> But that doesn't match the documentation.
> 
> What exactly are you trying to "fix" here?  What is the problem that the
> current file has that is broken?  And as you are changing what this file
> means, what will break if the information in the file changes?
> 
systemd is using the 'active' sysfs attribute to figure out on which
_tty_ device to start a getty on.
As soon as the console name and the tty name are different
you have no means of figuring out which _device_ to open.
AFAICS the console 'device' (ie the current entry in 'active')
doesn't have _any_ equivalent in sysfs; it just so happens that for
most console drivers the tty driver name is identical.
But this is not a requirement, and fails for drivers which have a
different device for the console and the tty.

EG on S/390 the 3270 tty has the devices

/dev/3270/tty1

but the console driver announces the name 'tty3270'.
So as per current rules the 'active' attribute contains

tty32700

which correct as per documentation, but doesn't have _any_
equivalent in sysfs.

Martin has the grubby details here.

But of course, the documentation should be updated to match the new
behavior.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke   zSeries & Storage
h...@suse.de  +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] fstrim "cron" job

2014-02-06 Thread Karel Zak
On Sun, Dec 22, 2013 at 11:06:19AM +0100, Tom Gundersen wrote:
> On Sat, Dec 21, 2013 at 7:11 PM, Chris Murphy  wrote:
> >
> > On Dec 21, 2013, at 6:44 AM, Kay Sievers  wrote:
> >
> >> Trimming should be the job of the filesystem, not for a nasty cron
> >> job. We do not want to support legacy filesystems with upstream
> >> shipped systemd units.
> >>
> >> Also, util-linux must not ship such policy, it's a collection of
> >> tools, not a system policy carry-out.
> >
> > Well it's the job of the file system, the device mapper, the block layer, 
> > the ATA driver, the controller and then the drive. And at the bottom of 
> > this stack, the drive specification, is flawed. We're not going to see the 
> > file systems doing this in ideal fashion, none of them set discard by 
> > default, until everything below is properly enabling asynchronous queued 
> > TRIM.
> >
> > So the question is whether it makes sense to design a work around for what 
> > amount to legacy devices (even though they are still being bought and sold 
> > today), or entirely ignore this (automatic) optimization for the life of 
> > the devices and leave it up to the user to set such things.
> >
> >> We need to support fsck because it's needed for integrity and using
> >> filesystems that need, but running trim is just an optimization. We do
> >> not want the bugs for these filesystems triggered by the systemd
> >> package.
> >
> > It seems systemd now parses fstab and can second guess its contents, e.g. 
> > it will ignore fs_passno for Btrfs, so even if it's a non-zero value, 
> > systemd doesn't cause fsck to go looking for an fsck.btrfs.
> >
> > But it does for xfs, which likewise doesn't need fsck at all.
> 
> We don't actually check for btrfs, but simply skip any checking when
> /sbin/fsck. does not exist.
> 
> > I don't know if these optimizations really belong in systemd or rather in a 
> > smarter fsck to keep a list of file systems that do and don't need fsck 
> > performed on them prior to remount as rw.
> 
> I'd argue that the systemd behavior of ignoring missing helpers should
> just be moved to fsck...

OK, I have improved fsck, so it does not print any error message if
fsck. does not exist and the filesystem type is not in "really
wanted" set of the filesystems (the set was defined many years ago by
Ted and it's mostly about extN;-).

# blkid -s TYPE /dev/sdb
/dev/sdb: TYPE="btrfs"

# fsck /dev/sdb; echo $?
fsck from util-linux 2.24.184-663b-dirty
0

Karel

-- 
 Karel Zak  
 http://karelzak.blogspot.com
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] fstrim "cron" job

2014-02-06 Thread Tom Gundersen
On Thu, Feb 6, 2014 at 4:51 PM, Karel Zak  wrote:
> On Sun, Dec 22, 2013 at 11:06:19AM +0100, Tom Gundersen wrote:
>> On Sat, Dec 21, 2013 at 7:11 PM, Chris Murphy  
>> wrote:
>> >
>> > On Dec 21, 2013, at 6:44 AM, Kay Sievers  wrote:
>> >
>> >> Trimming should be the job of the filesystem, not for a nasty cron
>> >> job. We do not want to support legacy filesystems with upstream
>> >> shipped systemd units.
>> >>
>> >> Also, util-linux must not ship such policy, it's a collection of
>> >> tools, not a system policy carry-out.
>> >
>> > Well it's the job of the file system, the device mapper, the block layer, 
>> > the ATA driver, the controller and then the drive. And at the bottom of 
>> > this stack, the drive specification, is flawed. We're not going to see the 
>> > file systems doing this in ideal fashion, none of them set discard by 
>> > default, until everything below is properly enabling asynchronous queued 
>> > TRIM.
>> >
>> > So the question is whether it makes sense to design a work around for what 
>> > amount to legacy devices (even though they are still being bought and sold 
>> > today), or entirely ignore this (automatic) optimization for the life of 
>> > the devices and leave it up to the user to set such things.
>> >
>> >> We need to support fsck because it's needed for integrity and using
>> >> filesystems that need, but running trim is just an optimization. We do
>> >> not want the bugs for these filesystems triggered by the systemd
>> >> package.
>> >
>> > It seems systemd now parses fstab and can second guess its contents, e.g. 
>> > it will ignore fs_passno for Btrfs, so even if it's a non-zero value, 
>> > systemd doesn't cause fsck to go looking for an fsck.btrfs.
>> >
>> > But it does for xfs, which likewise doesn't need fsck at all.
>>
>> We don't actually check for btrfs, but simply skip any checking when
>> /sbin/fsck. does not exist.
>>
>> > I don't know if these optimizations really belong in systemd or rather in 
>> > a smarter fsck to keep a list of file systems that do and don't need fsck 
>> > performed on them prior to remount as rw.
>>
>> I'd argue that the systemd behavior of ignoring missing helpers should
>> just be moved to fsck...
>
> OK, I have improved fsck, so it does not print any error message if
> fsck. does not exist and the filesystem type is not in "really
> wanted" set of the filesystems (the set was defined many years ago by
> Ted and it's mostly about extN;-).
>
> # blkid -s TYPE /dev/sdb
> /dev/sdb: TYPE="btrfs"
>
> # fsck /dev/sdb; echo $?
> fsck from util-linux 2.24.184-663b-dirty
> 0

Thanks!

Cheers,

Tom
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCHv2] tty: Set correct tty name in 'active' sysfs attribute

2014-02-06 Thread Greg Kroah-Hartman
On Thu, Feb 06, 2014 at 04:44:20PM +0100, Hannes Reinecke wrote:
> On 02/06/2014 04:29 PM, Greg Kroah-Hartman wrote:
> > On Thu, Feb 06, 2014 at 03:27:43PM +0100, Hannes Reinecke wrote:
> >> The 'active' sysfs attribute should refer to the currently
> >> active tty devices the console is running on, not the currently
> >> active console.
> > 
> > That's not what Documentation/ABI/sysfs-tty says:
> >  Shows the list of currently configured 
> > 
> >  console devices, like 'tty1 ttyS0'.
> > 
> >  The last entry in the file is the active   
> > 
> >  device connected to /dev/console.  
> > 
> >  The file supports poll() to detect virtual 
> > 
> >  console switches. 
> > 
> The problem is indeed with 'console devices'. There is no such
> thing; you only have tty devices where the console is running on.
> 
> >> The console structure doesn't refer to any device in sysfs,
> >> only the tty the console is running on has.
> > 
> > That sentance doesn't make sense.
> > 
> >> So we need to print out the tty names in 'active', not
> >> the console names.
> > 
> > But that doesn't match the documentation.
> > 
> > What exactly are you trying to "fix" here?  What is the problem that the
> > current file has that is broken?  And as you are changing what this file
> > means, what will break if the information in the file changes?
> > 
> systemd is using the 'active' sysfs attribute to figure out on which
> _tty_ device to start a getty on.
> As soon as the console name and the tty name are different
> you have no means of figuring out which _device_ to open.
> AFAICS the console 'device' (ie the current entry in 'active')
> doesn't have _any_ equivalent in sysfs; it just so happens that for
> most console drivers the tty driver name is identical.
> But this is not a requirement, and fails for drivers which have a
> different device for the console and the tty.
> 
> EG on S/390 the 3270 tty has the devices
> 
> /dev/3270/tty1
> 
> but the console driver announces the name 'tty3270'.
> So as per current rules the 'active' attribute contains
> 
> tty32700
> 
> which correct as per documentation, but doesn't have _any_
> equivalent in sysfs.
> 
> Martin has the grubby details here.
> 
> But of course, the documentation should be updated to match the new
> behavior.

Ok, care to send an updated version, that fixes the Documentation as
well?  If Kay agrees that this is the correct solution, I'll be glad to
take it.

thanks,

greg k-h
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] udev: Adding zram to inappropriate block device

2014-02-06 Thread Jóhann B. Guðmundsson


On 02/06/2014 03:39 PM, Greg KH wrote:

>Right now you have to decide before loading the module how many
>devices you want. And also when trying to use a device (any device),
>you have to look for one. The same issues as with loop.

Given that the code doesn't have the ability to dynamically add/remove
devices, I think we are stuck with this, right?


This  may come as a completely stupid question but if the code is 
expected to be able to dynamically add/remove devices should not 
upstream ( kernel ) nack inclusion of zram until it does?


JBG
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] udev: Adding zram to inappropriate block device

2014-02-06 Thread Greg KH
On Thu, Feb 06, 2014 at 04:54:59PM +, "Jóhann B. Guðmundsson" wrote:
> 
> On 02/06/2014 03:39 PM, Greg KH wrote:
> >>>Right now you have to decide before loading the module how many
> >>>devices you want. And also when trying to use a device (any device),
> >>>you have to look for one. The same issues as with loop.
> >Given that the code doesn't have the ability to dynamically add/remove
> >devices, I think we are stuck with this, right?
> 
> This  may come as a completely stupid question but if the code is expected
> to be able to dynamically add/remove devices should not upstream ( kernel )
> nack inclusion of zram until it does?

I don't think the code is expected to be able to do that, have you
looked at it and seen where it does?

thanks,

greg k-h
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] udev: Adding zram to inappropriate block device

2014-02-06 Thread Reindl Harald

Am 06.02.2014 18:45, schrieb Greg KH:
> On Thu, Feb 06, 2014 at 04:54:59PM +, "Jóhann B. Guðmundsson" wrote:
>>
>> On 02/06/2014 03:39 PM, Greg KH wrote:
> Right now you have to decide before loading the module how many
> devices you want. And also when trying to use a device (any device),
> you have to look for one. The same issues as with loop.
>>> Given that the code doesn't have the ability to dynamically add/remove
>>> devices, I think we are stuck with this, right?
>>
>> This may come as a completely stupid question but if the code is expected
>> to be able to dynamically add/remove devices should not upstream ( kernel )
>> nack inclusion of zram until it does?
> 
> I don't think the code is expected to be able to do that, have you
> looked at it and seen where it does?

please re-read both posts
in the last one clearly a "not" fails

fixed version:
>> This may come as a completely stupid question but if the code is *not* 
>> expected
>> to be able to dynamically add/remove devices should not upstream ( kernel )
>> nack inclusion of zram until it does?



signature.asc
Description: OpenPGP digital signature
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH] systemd crashes if locale.conf contains invalid utf8 string

2014-02-06 Thread Goffredo Baroncelli
In the parse_env_file_push() and load_env_file_push() functions, there
are two assert() call to check if the key or value parameters are utf8 valid.

If the strings aren't utf8 valid, assert does abort.

These function are used early by systemd to parse some files. For 
example '/etc/locale.conf'. In my case this file contained a not utf8
sequence, which is bad, but systemd crashed during the boot, which
is even worse !

The enclosed patch removes the assert and return -EINVAL if the
sequence is invalid. This is possible because the caller of these
function [1] checks the errors.
So the check of an invalid utf8 sequence is still performed, but
systemd doesn't crash anymore and logs the error.

BR
G.Baroncelli



[1] parse_env_file_internal(), invoked by load_env_file() and
parse_env_file()

-- 
gpg @keyserver.linux.it: Goffredo Baroncelli (kreijackATinwind.it>
Key fingerprint BBF5 1610 0B64 DAC6 5F7D  17B2 0EDA 9B37 8B82 E0B5



diff --git a/src/shared/fileio.c b/src/shared/fileio.c
index ede8819..38af34b 100644
--- a/src/shared/fileio.c
+++ b/src/shared/fileio.c
@@ -534,35 +534,41 @@ fail:
 
 static int parse_env_file_push(const char *filename, unsigned line,
const char *key, char *value, void *userdata) {
-assert(utf8_is_valid(key));
 
-if (value && !utf8_is_valid(value))
+const char *k;
+va_list* ap = (va_list*) userdata;
+va_list aq;
+
+if (!utf8_is_valid(key)) {
+log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.",
+  filename, line, key);
+return -EINVAL;
+}
+
+if (value && !utf8_is_valid(value)) {
 /* FIXME: filter UTF-8 */
-log_error("%s:%u: invalid UTF-8 for key %s: '%s', ignoring.",
+log_error("%s:%u: invalid UTF-8 value for key %s: '%s', 
ignoring.",
   filename, line, key, value);
-else {
-const char *k;
-va_list* ap = (va_list*) userdata;
-va_list aq;
+return -EINVAL;
+}
 
-va_copy(aq, *ap);
+va_copy(aq, *ap);
 
-while ((k = va_arg(aq, const char *))) {
-char **v;
+while ((k = va_arg(aq, const char *))) {
+char **v;
 
-v = va_arg(aq, char **);
+v = va_arg(aq, char **);
 
-if (streq(key, k)) {
-va_end(aq);
-free(*v);
-*v = value;
-return 1;
-}
+if (streq(key, k)) {
+va_end(aq);
+free(*v);
+*v = value;
+return 1;
 }
-
-va_end(aq);
 }
 
+va_end(aq);
+
 free(value);
 return 0;
 }
@@ -586,26 +592,31 @@ int parse_env_file(
 
 static int load_env_file_push(const char *filename, unsigned line,
   const char *key, char *value, void *userdata) {
-assert(utf8_is_valid(key));
+char ***m = userdata;
+char *p;
+int r;
 
-if (value && !utf8_is_valid(value))
+if (!utf8_is_valid(key)) {
+log_error("%s:%u: invalid UTF-8 for key '%s', ignoring.",
+  filename, line, key);
+return -EINVAL;
+}
+
+if (value && !utf8_is_valid(value)) {
 /* FIXME: filter UTF-8 */
-log_error("%s:%u: invalid UTF-8 for key %s: '%s', ignoring.",
+log_error("%s:%u: invalid UTF-8 value for key %s: '%s', 
ignoring.",
   filename, line, key, value);
-else {
-char ***m = userdata;
-char *p;
-int r;
+return -EINVAL;
+}
 
-p = strjoin(key, "=", strempty(value), NULL);
-if (!p)
-return -ENOMEM;
+p = strjoin(key, "=", strempty(value), NULL);
+if (!p)
+return -ENOMEM;
 
-r = strv_push(m, p);
-if (r < 0) {
-free(p);
-return r;
-}
+r = strv_push(m, p);
+if (r < 0) {
+free(p);
+return r;
 }
 
 free(value);


___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH] man: cryptsetup now allows partition device file in system mode

2014-02-06 Thread Jan Janssen
---
 man/crypttab.xml | 9 +
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/man/crypttab.xml b/man/crypttab.xml
index 5f386e5..c563851 100644
--- a/man/crypttab.xml
+++ b/man/crypttab.xml
@@ -305,14 +305,7 @@
 
 Use TrueCrypt in system
 encryption mode. This implies
-tcrypt.
-
-Please note that when using this mode, 
the
-whole device needs to be given in the second
-field instead of the partition. For example: if
-/dev/sda2 is the system
-encrypted TrueCrypt patition, 
/dev/sda
-has to be given.
+   tcrypt.
 
 
 
-- 
1.8.5.3

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH 1/3] Add SELinuxContext configuration item

2014-02-06 Thread David Timothy Strauss
In order to maximize consistency with newly committed options in
systemd-nspawn, would it make sense to allow independent configuration
of the process and file labels instead?
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] systemd crashes if locale.conf contains invalid utf8 string

2014-02-06 Thread David Timothy Strauss
+1 on no crashing with invalid user input
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 2/7] logind: close races on user and session states during login

2014-02-06 Thread Djalal Harouni
Currently the user and session states are not stable, they are affected
by several races during login:

1) session state:
   To get the session state the function session_get_state() is used.

Opening state:
At login the D-Bus CreateSession() method will call session_start() which
calls user_start() and session_start_scope() to queue the scope job and
set the session->scope_job

   =>  session_get_state() == SESSION_OPENING   (correct)

Then execution will continue from session_send_create() which is called
by the D-Bus match_job_removed() signal. math_job_removed() will check if
this is the session scope and if this is the previously queued scope job.
If so it will clear the session->scope_job

   =>  session_get_state() == SESSION_CLOSING   (incorrect)
  (session closing since fifo_fd == -1)

So scope job has finished and scope was created successfully, later the
session_send_create_reply() will wait for the session scope *and* the
user service to be successfully created.

  /* user service is still pending */
  if (s->scope_job || s->user->service_job))
 return 0

   =>  session_get_state() == SESSION_CLOSING   (incorrect)

  else
 session_create_fifo()/* fifo_fd finally created */

   =>  session_get_state() == SESSION_ACTIVE   (correct)

To sum it up, current state during login:
"SESSION_OPENING"=>"SESSION_CLOSING"x2=>"SESSION_ACTIVE"

To fix the session state and remove the two incorrect SESSION_CLOSING,
we do not clear up the "session->scope_job" when we detect that this is
the session scope, we setup a temporary variable "scope_job" that will
get the current value of "session->scope_job" and update it if
necessary.

Add a new "active" variable to check if the session scope and user
service jobs are still being created.

Update session_jobs_replay() and session_send_create_reply() function to
receive the "opening" variable as an argument, so it will still wait for
the scope and service jobs to finish before creating the session fifo.

The "session->scope_job" will be cleared when session_jobs_reply()
finishes. This ensures that the state will just go from:
"SESSION_OPENING" => "SESSION_ACTIVE"

2) user state:
   To get the user state the function user_get_state() is used.

I'll add that the user_get_state() and session_get_state() do not have
the same logic when it comes to sessions, this will just add ambiguity.
user_get_state() calls session_is_active() before checking
session_get_state(), and session_is_active() will return true right from
the start since the logic is set during D-Bus CreateSession(). This will
we be fixed in the followup patches.

Opening state:
At login we have session_start() which calls user_start()

here we already:

   =>  user_get_state() == USER_ACTIVE   (incorrect)
   (not fixed in this patch)

user_start() calls:
user_start_slice() queue the slice and set user->slice_job
user_start_service() queue the service and set user->service_job

   =>  user_get_state() == USER_OPENING   (correct)

Then execution will continue from session_send_create() which is called
by the D-Bus match_job_removed() signal. math_job_removed() will check if
these are the user service and slice and if they are the previously queued
jobs. If so it will clear the: user->service_job and user->slice_job

   =>  user_get_state() == USER_ACTIVE   (incorrect)
 (incorrect since the fifo_fd has not been created,
  here the state should stay USER_OPENING)

Later when the user service is created successfully,
session_send_create_reply() will also wait for the session scope to be
created. If so then session_send_create_reply() will continue and call
session_create_fifo()

   =>  user_get_state() == USER_ACTIVE   (correct)
   (fifo_fd was created)

To fix this, we use the same logic as used to fix session states. In
order to remove the incorrect state when the fifo_fd is not created but
the state shows USER_ACTIVE, we do not clear the "user->service_job" and
"user->slice_job" right away, we store the state in a temporary variable
"service_job" and update it later if we detect that this is the user
service.

The new "active" variable will be used to check if the session scope and
user service are still being created. If so we'll wait for the next
match_job_removed() signal and continue, otherwise we proceed with
session_jobs_reply() and session_send_create_reply() in order to notify
clients.
---
 src/login/logind-dbus.c | 44 ++---
 src/login/logind-session-dbus.c |  8 +---
 src/login/logind-session.h  |  2 +-
 3 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 7b050fb..0560707 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1919,7 +1919,9 @@ const sd_bus_vtable manager_vtable[] = {
 SD_BUS_VTABLE_END
 };
 
-static int session_jobs_reply(Sessio

[systemd-devel] [PATCH 1/7] logind: add function session_jobs_reply() to unify the create reply

2014-02-06 Thread Djalal Harouni
The session_send_create_reply() function which notifies clients about
session creation is used for both session and user units. Unify the
shared code in a new function session_jobs_reply().

The session_save() will be called unconditionally on sessions since it
does not make sense to only call it if '!session->started', this will
also allow to update the session state as soon as possible.
---
 src/login/logind-dbus.c | 46 --
 1 file changed, 24 insertions(+), 22 deletions(-)

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 4745961..7b050fb 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1919,6 +1919,27 @@ const sd_bus_vtable manager_vtable[] = {
 SD_BUS_VTABLE_END
 };
 
+static int session_jobs_reply(Session *s, const char *unit, const char 
*result) {
+int r = 0;
+
+assert(s);
+assert(unit);
+
+if (!s->started)
+return r;
+
+if (streq(result, "done"))
+r = session_send_create_reply(s, NULL);
+else {
+_cleanup_bus_error_free_ sd_bus_error e = SD_BUS_ERROR_NULL;
+
+sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, "Start job for 
unit %s failed with '%s'", unit, result);
+r = session_send_create_reply(s, &e);
+}
+
+return r;
+}
+
 int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, 
sd_bus_error *error) {
 const char *path, *result, *unit;
 Manager *m = userdata;
@@ -1958,18 +1979,9 @@ int match_job_removed(sd_bus *bus, sd_bus_message 
*message, void *userdata, sd_b
 session->scope_job = NULL;
 }
 
-if (session->started) {
-if (streq(result, "done"))
-session_send_create_reply(session, NULL);
-else {
-_cleanup_bus_error_free_ sd_bus_error e = 
SD_BUS_ERROR_NULL;
-
-sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, 
"Start job for unit %s failed with '%s'", unit, result);
-session_send_create_reply(session, &e);
-}
-} else
-session_save(session);
+session_jobs_reply(session, unit, result);
 
+session_save(session);
 session_add_to_gc_queue(session);
 }
 
@@ -1987,17 +1999,7 @@ int match_job_removed(sd_bus *bus, sd_bus_message 
*message, void *userdata, sd_b
 }
 
 LIST_FOREACH(sessions_by_user, session, user->sessions) {
-if (!session->started)
-continue;
-
-if (streq(result, "done"))
-session_send_create_reply(session, NULL);
-else {
-_cleanup_bus_error_free_ sd_bus_error e = 
SD_BUS_ERROR_NULL;
-
-sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, 
"Start job for unit %s failed with '%s'", unit, result);
-session_send_create_reply(session, &e);
-}
+session_jobs_reply(session, unit, result);
 }
 
 user_save(user);
-- 
1.8.3.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH v2 0/7] logind: close races on user and session states

2014-02-06 Thread Djalal Harouni
Summary:
Currently logind will not clear sessions on logout. The bug is confirmed
for getty and ssh logins. This series is preparation for next patches to
address that bug, it does not fix it.

However, this series also fixe real races on user and session states.
This ensures that user_save() and session_save() functions will write the
correct user and session state to the state files.


The logind bug was already discussed here:
http://lists.freedesktop.org/archives/systemd-devel/2014-January/015968.html

Patches were proposed, but they failed to address the bug since there
are other problems related to user and session states:
http://lists.freedesktop.org/archives/systemd-devel/2014-January/016372.html

A first version to fix these race conditions on user and sessions
states was proposed:
http://lists.freedesktop.org/archives/systemd-devel/2014-January/016373.html


This series is a v2, it will close all the discovered races on user and
session states. The commit logs will tell you the story of each case.


Now as noted above, this series fix real races and in the same time it
is needed to fix the logind bug where sessions are not cleaned after
logouts.

Proposed plan to clean logind closed sessions:
1) Make the user and session states stable (this series fix it).

2) Improve session_check_gc() and user_check_gc() to check if:
   the state is closing and the cgroup is empty.

3) Push session and user into the gc during logout, in pam_systemd
   method_release_session() 

Now I've a patch that implements 2) and 3) on top of 1), sometimes it
will work and successfully clean closed sessions, and sometimes it will
not. This is due to a race when we close the session and try to
terminate session processes and in the same time we are trying to see if
the cgroup is empty... which is another problem on its own.


So here are the patches, please consider this series since it will fix
real races and it will make sure that user_save() and session_save()
will write the correct state to the state files.


Patches 1,6,7 are code cleanup.

Patches 2,3,4,5 close races on user and session states.


Djalal Harouni (7):
0001 logind: add function session_jobs_reply() to unify the create reply
  unify shared code in a single function.

0002 logind: close races on user and session states during login
0003 logind: close races on session state at logout
0004 logind: close races on user state at logout
  close race conditions on user and session states.

0005 logind: just call session_get_state() to get the session state
  make user_get_state() consistent with session_get_state()

0006 logind: add user_is_opening() and session_is_opening()
0007 logind: do not call session_jobs_reply() on CLOSING
  make sure to not call session_send_create_reply() when jobs finish
  during closing state.

 src/login/logind-dbus.c | 87  
+++
 src/login/logind-session-dbus.c | 11 ---
 src/login/logind-session.c  | 10 +-
 src/login/logind-session.h  |  4 +++-
 src/login/logind-user.c | 20 +---
 src/login/logind-user.h |  3 +++
 6 files changed, 99 insertions(+), 36 deletions(-)

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 3/7] logind: close races on session state at logout

2014-02-06 Thread Djalal Harouni
To get the state of the session, the session_get_state() is used.
This function will check if the session->scope_job is set then it will
automatically return SESSION_OPENING. This is buggy in the context of
session closing:

At logout or D-Bus TerminateSession() fifo_fd is removed:

   =>  session_get_state() == SESSION_CLOSING   (correct)

Then we have session_stop() which calls session_stop_scope(), this
will queue the scope job to be removed and set the session->scope_job

   =>  session_get_state() == SESSION_OPENING   (incorrect)

After the scope job is removed the state will be again correct

   =>  session_get_state() == SESSION_CLOSING   (correct)

To fix this and make sure that the state will always be SESSION_CLOSING
we add a flag that is used to differentiate between SESSION_OPENING and
SESSION_CLOSING.

The 'scope_opening' flag will be set to true only during real session
opening in session_start_scope(), and it will be set to false just after
the session fifo fd was successfully created, which means that during
session closing it will be false.

And update session_get_state() to check if the 'scope_opening' is true
before returning the SESSION_OPENING, if it is not then SESSION_CLOSING
will be returned which is the correct behaviour.
---
 src/login/logind-session-dbus.c | 3 +++
 src/login/logind-session.c  | 4 +++-
 src/login/logind-session.h  | 1 +
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c
index 54db864..099ade6 100644
--- a/src/login/logind-session-dbus.c
+++ b/src/login/logind-session-dbus.c
@@ -670,6 +670,9 @@ int session_send_create_reply(Session *s, sd_bus_error 
*error, bool opening) {
 if (fifo_fd < 0)
 return fifo_fd;
 
+/* Clean this up as soon as we have the fifo_fd */
+s->scope_opening = false;
+
 /* Update the session state file before we notify the client
  * about the result. */
 session_save(s);
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index bec59c0..848e8a1 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -496,6 +496,8 @@ static int session_start_scope(Session *s) {
 
 free(s->scope_job);
 s->scope_job = job;
+/* session scope is being created */
+s->scope_opening = true;
 }
 }
 
@@ -880,7 +882,7 @@ void session_add_to_gc_queue(Session *s) {
 SessionState session_get_state(Session *s) {
 assert(s);
 
-if (s->scope_job)
+if (s->scope_opening)
 return SESSION_OPENING;
 
 if (s->fifo_fd < 0)
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
index ebe3902..205491a 100644
--- a/src/login/logind-session.h
+++ b/src/login/logind-session.h
@@ -110,6 +110,7 @@ struct Session {
 
 bool in_gc_queue:1;
 bool started:1;
+bool scope_opening:1; /* session scope is being created */
 
 sd_bus_message *create_message;
 
-- 
1.8.3.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 4/7] logind: close races on user state at logout

2014-02-06 Thread Djalal Harouni
To get the state of the user, the user_get_state() is used.
This function will check if the user->slice_job or the user->service_job
are set then it will automatically return USER_OPENING. This is buggy
in the context of user closing:

At logout or D-Bus TerminateUser() calls user_stop()
user_stop() => session_stop() on sessions => session_stop_scope()

  =>  user_get_state() == USER_CLOSING or USER_ACTIVE or USER_ONLINE
(incorrect)

  (depends on session closing execution and if we have finished the
  session scope jobs or not, if all the scopes are being queued then
  their session->scope_job will be set which means all sessions are in
  the OPENING_STATE, so user state will be USER_ONLINE).

  The previous patch improves session_get_state() logic, and if scopes
  are being queued during logout then sessions are in SESSION_CLOSING
  state which makes user_get_state() return USER_CLOSING.

So at user_stop()
user_stop_slice() queues the slice and sets user->slice_job
user_stop_service() queues the service and sets user->service_job

  =>  user_get_state() == USER_OPENING  (incorrect)

After the slice and service jobs are removed the state will be again
correct.

  =>  user_get_state() == USER_CLOSING  (correct)

To fix this and make sure that the state will always be USER_CLOSING
we add a flag that is used to differentiate between USER_OPENING and
USER_CLOSING when 'slice_job' and 'service_job' are set.

The 'slice_opening' flag for 'user->slice_job' and 'service_opening'
for 'user->service_job' are set to true only during real user opening,
later if the service and slice were successfully created their
corresponding 'opening' flag will be set to false, which means that
during user closing they are already false.

Update user_get_state() to check if 'slice_opening' or
'service_opening' are set, if so return USER_OPENING.
---
 src/login/logind-dbus.c | 2 ++
 src/login/logind-user.c | 6 +-
 src/login/logind-user.h | 2 ++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 0560707..24482fd 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -2017,11 +2017,13 @@ int match_job_removed(sd_bus *bus, sd_bus_message 
*message, void *userdata, sd_b
 /* Clean this up after session_jobs_reply() */
 free(user->service_job);
 user->service_job = NULL;
+user->service_opening = false;
 }
 
 if (streq_ptr(path, user->slice_job)) {
 free(user->slice_job);
 user->slice_job = NULL;
+user->slice_opening = false;
 }
 
 user_save(user);
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index bdb6915..8183721 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -352,6 +352,8 @@ static int user_start_slice(User *u) {
 
 free(u->slice_job);
 u->slice_job = job;
+/* User slice is being created */
+u->slice_opening = true;
 }
 }
 
@@ -385,6 +387,8 @@ static int user_start_service(User *u) {
 
 free(u->service_job);
 u->service_job = job;
+/* User service is being created */
+u->service_opening = true;
 }
 }
 
@@ -637,7 +641,7 @@ UserState user_get_state(User *u) {
 
 assert(u);
 
-if (u->slice_job || u->service_job)
+if (u->slice_opening || u->service_opening)
 return USER_OPENING;
 
 LIST_FOREACH(sessions_by_user, i, u->sessions) {
diff --git a/src/login/logind-user.h b/src/login/logind-user.h
index 0062880..ac43361 100644
--- a/src/login/logind-user.h
+++ b/src/login/logind-user.h
@@ -61,6 +61,8 @@ struct User {
 
 bool in_gc_queue:1;
 bool started:1;
+bool service_opening:1; /* User service is being created */
+bool slice_opening:1; /* User slice is being created */
 
 LIST_HEAD(Session, sessions);
 LIST_FIELDS(User, gc_queue);
-- 
1.8.3.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 5/7] logind: just call session_get_state() to get the session state

2014-02-06 Thread Djalal Harouni
In function user_get_state() remove the session_is_active() check, just
count on the session_get_state() function to get the correct session
state.

session_is_active() may return true before starting the session scope and
user service, this means it will return true even before the creation of
the session fifo_fd which will produce incorrect states.

Another point is that session_get_state() will check if the fifo_fd was
created before checking if the session is active, this is the correct
behaviour since the session fifo_fd should be considered the point of
session states synchronization.

So be consistent and follow the session_get_state() logic.
---
 src/login/logind-user.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index 8183721..9ed216d 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -637,6 +637,7 @@ void user_add_to_gc_queue(User *u) {
 
 UserState user_get_state(User *u) {
 Session *i;
+SessionState session_state;
 bool all_closing = true;
 
 assert(u);
@@ -645,9 +646,12 @@ UserState user_get_state(User *u) {
 return USER_OPENING;
 
 LIST_FOREACH(sessions_by_user, i, u->sessions) {
-if (session_is_active(i))
+/* session_get_state() will check for fifo_fd */
+session_state = session_get_state(i);
+
+if (session_state == SESSION_ACTIVE)
 return USER_ACTIVE;
-if (session_get_state(i) != SESSION_CLOSING)
+else if (session_state != SESSION_CLOSING)
 all_closing = false;
 }
 
-- 
1.8.3.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 6/7] logind: add user_is_opening() and session_is_opening()

2014-02-06 Thread Djalal Harouni
Add the user_is_opening() and session_is_opening() functions. These
functions will check their appropriate 'opening' flag to see if we are
in the middel of the opening state.

This patch is preparation for the next patch which will use it to guard
match_job_remove() from calling session_jobs_reply() and
session_send_create_reply() during SESSION_CLOSING.
---
 src/login/logind-session.c | 8 +++-
 src/login/logind-session.h | 1 +
 src/login/logind-user.c| 8 +++-
 src/login/logind-user.h| 1 +
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 848e8a1..215f2b8 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -647,6 +647,12 @@ int session_finalize(Session *s) {
 return r;
 }
 
+bool session_is_opening(Session *s) {
+assert(s);
+
+return s->scope_opening;
+}
+
 bool session_is_active(Session *s) {
 assert(s);
 
@@ -882,7 +888,7 @@ void session_add_to_gc_queue(Session *s) {
 SessionState session_get_state(Session *s) {
 assert(s);
 
-if (s->scope_opening)
+if (session_is_opening(s))
 return SESSION_OPENING;
 
 if (s->fifo_fd < 0)
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
index 205491a..964306d 100644
--- a/src/login/logind-session.h
+++ b/src/login/logind-session.h
@@ -129,6 +129,7 @@ void session_set_user(Session *s, User *u);
 bool session_check_gc(Session *s, bool drop_not_started);
 void session_add_to_gc_queue(Session *s);
 int session_activate(Session *s);
+bool session_is_opening(Session *s);
 bool session_is_active(Session *s);
 int session_get_idle_hint(Session *s, dual_timestamp *t);
 void session_set_idle_hint(Session *s, bool b);
diff --git a/src/login/logind-user.c b/src/login/logind-user.c
index 9ed216d..cf9c948 100644
--- a/src/login/logind-user.c
+++ b/src/login/logind-user.c
@@ -635,6 +635,12 @@ void user_add_to_gc_queue(User *u) {
 u->in_gc_queue = true;
 }
 
+bool user_is_opening(User *u) {
+assert(u);
+
+return u->slice_opening || u->service_opening;
+}
+
 UserState user_get_state(User *u) {
 Session *i;
 SessionState session_state;
@@ -642,7 +648,7 @@ UserState user_get_state(User *u) {
 
 assert(u);
 
-if (u->slice_opening || u->service_opening)
+if (user_is_opening(u))
 return USER_OPENING;
 
 LIST_FOREACH(sessions_by_user, i, u->sessions) {
diff --git a/src/login/logind-user.h b/src/login/logind-user.h
index ac43361..2728168 100644
--- a/src/login/logind-user.h
+++ b/src/login/logind-user.h
@@ -75,6 +75,7 @@ void user_add_to_gc_queue(User *u);
 int user_start(User *u);
 int user_stop(User *u);
 int user_finalize(User *u);
+bool user_is_opening(User *u);
 UserState user_get_state(User *u);
 int user_get_idle_hint(User *u, dual_timestamp *t);
 int user_save(User *u);
-- 
1.8.3.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH 7/7] logind: do not call session_jobs_reply() on CLOSING

2014-02-06 Thread Djalal Harouni
match_job_removed() signal is triggered when queued jobs finish during
session opening or closing.

Calling session_jobs_reply() during opening is valid, but during
session closing does not make sense.

The session_send_create_reply() function which is called by
session_jobs_reply() is able to detect if it was not called during
open time by checking the 'session->create_message'. However, making
session_jobs_reply() check session_is_opening() and user_is_opening()
is more comprehensive.
---
 src/login/logind-dbus.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 24482fd..4b71d9e 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -1930,6 +1930,10 @@ static int session_jobs_reply(Session *s, const char 
*unit, const char *result,
 if (!s->started)
 return r;
 
+/* Don't call me if this is not opening state */
+if (!session_is_opening(s) && !user_is_opening(s->user))
+return r;
+
 if (streq(result, "done"))
 r = session_send_create_reply(s, NULL, opening);
 else {
@@ -2010,6 +2014,7 @@ int match_job_removed(sd_bus *bus, sd_bus_message 
*message, void *userdata, sd_b
  * still being created this will be set to true,
  * otherwise it will be false */
 active = service_job || !!session->scope_job;
+
 session_jobs_reply(session, unit, result, active);
 }
 
-- 
1.8.3.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH] man: cryptsetup now allows partition device file in system mode

2014-02-06 Thread Tom Gundersen
On Thu, Feb 6, 2014 at 8:33 PM, Jan Janssen  wrote:
> ---
>  man/crypttab.xml | 9 +
>  1 file changed, 1 insertion(+), 8 deletions(-)
>
> diff --git a/man/crypttab.xml b/man/crypttab.xml
> index 5f386e5..c563851 100644
> --- a/man/crypttab.xml
> +++ b/man/crypttab.xml
> @@ -305,14 +305,7 @@
>
>  Use TrueCrypt in system
>  encryption mode. This implies
> -tcrypt.
> -
> -Please note that when using this mode, 
> the
> -whole device needs to be given in the second
> -field instead of the partition. For example: 
> if
> -/dev/sda2 is the system
> -encrypted TrueCrypt patition, 
> /dev/sda
> -has to be given.
> +   tcrypt.
>  
>
>  


When/what release did this change? A reference in the commit message
would be useful.

Cheers,

Tom
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel