Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-02-02 Thread Lennart Poettering
On Thu, 29.01.15 18:44, Didier Roche (didro...@ubuntu.com) wrote:

> Le 28/01/2015 15:53, Zbigniew Jędrzejewski-Szmek a écrit :
> >On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:
> >> From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
> >>From: Didier Roche 
> >>Date: Mon, 26 Jan 2015 16:40:52 +0100
> >>Subject: [PATCH 06/12] Support cancellation of fsck in progress
> >>
> >>Grab in fsckd plymouth watch key for C or c, and propagate this cancel 
> >>request
> >>to systemd-fsck which will terminate fsck.
> >Could we bind to ^c or if this is not possible, "three c's in three
> >seconds" instead? I'm worried that before you could press anything to little
> >effect in plymouth, and now a single key will have significant consequences.
> 
> 
> I tried to have a look at libplymouth, and if I'm correct, it's not possible
> to listen and get events for compose keys, so no way to get something like
> Control+C. As Dimitri told, it's been quite some years we are doing that in
> ubuntu, and that's the reason why we show a message to ensure the user is
> aware about that key (and that's why this patch is doing). Is it good for
> you this way?

Hmm, I thought plymouth was listening on the tty (and not the input
subsystem), which means it should deliver ctrl-C as ascii character
code 3, because UNIX...

Lennart

-- 
Lennart Poettering, Red Hat
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-30 Thread Zbigniew Jędrzejewski-Szmek
On Thu, Jan 29, 2015 at 06:44:23PM +0100, Didier Roche wrote:
> Le 28/01/2015 15:53, Zbigniew Jędrzejewski-Szmek a écrit :
> >On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:
> >> From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
> >>From: Didier Roche 
> >>Date: Mon, 26 Jan 2015 16:40:52 +0100
> >>Subject: [PATCH 06/12] Support cancellation of fsck in progress
> >>
> >>Grab in fsckd plymouth watch key for C or c, and propagate this cancel 
> >>request
> >>to systemd-fsck which will terminate fsck.
> >Could we bind to ^c or if this is not possible, "three c's in three
> >seconds" instead? I'm worried that before you could press anything to little
> >effect in plymouth, and now a single key will have significant consequences.
> 
> 
> I tried to have a look at libplymouth, and if I'm correct, it's not
> possible to listen and get events for compose keys, so no way to get
> something like Control+C. As Dimitri told, it's been quite some
> years we are doing that in ubuntu, and that's the reason why we show
> a message to ensure the user is aware about that key (and that's why
> this patch is doing). Is it good for you this way?
I think so. We can always improve the interface later on if it's
confusing for users.

(If plymouth forwards the key to us, we could detect "triple c within
two seconds" ourselves. But if you think that a single key is fine,
than that's fine for me.)

Zbyszek



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


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-29 Thread Didier Roche

Le 28/01/2015 21:25, Lennart Poettering a écrit :

On Wed, 28.01.15 14:22, Didier Roche (didro...@ubuntu.com) wrote:


  src/fsck/fsck.c   | 29 +
  src/fsckd/fsckd.c | 43 +++
  src/fsckd/fsckd.h |  5 +
  3 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
index f5dd546..0b42e3b 100644
--- a/src/fsck/fsck.c
+++ b/src/fsck/fsck.c
@@ -47,6 +47,8 @@
  static bool arg_skip = false;
  static bool arg_force = false;
  static const char *arg_repair = "-a";
+static pid_t fsck_pid;
+static bool cancel_requested = false;

Please do not introduce new global variables unnecessarily. We try to
keep variables locally, and keep the global state at a minimum. An
exception is mostly the command line args, which by their nature are
global anyway...


Sure, I put fsck_pid as a function parameter. For cancel_requested, I 
noticed that process_progress() was already return an int that was not 
read, so assigned it to a variable and check for fsck KILL status and 
not process_progress returning 0.


I didn't add checks (as there were none as of today) on 
process_progress() status, but can do.


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


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-29 Thread Didier Roche

Le 28/01/2015 15:53, Zbigniew Jędrzejewski-Szmek a écrit :

On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:

 From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
From: Didier Roche 
Date: Mon, 26 Jan 2015 16:40:52 +0100
Subject: [PATCH 06/12] Support cancellation of fsck in progress

Grab in fsckd plymouth watch key for C or c, and propagate this cancel request
to systemd-fsck which will terminate fsck.

Could we bind to ^c or if this is not possible, "three c's in three
seconds" instead? I'm worried that before you could press anything to little
effect in plymouth, and now a single key will have significant consequences.



I tried to have a look at libplymouth, and if I'm correct, it's not 
possible to listen and get events for compose keys, so no way to get 
something like Control+C. As Dimitri told, it's been quite some years we 
are doing that in ubuntu, and that's the reason why we show a message to 
ensure the user is aware about that key (and that's why this patch is 
doing). Is it good for you this way?


Cheers,
Didier

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


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Lennart Poettering
On Wed, 28.01.15 14:22, Didier Roche (didro...@ubuntu.com) wrote:

>  src/fsck/fsck.c   | 29 +
>  src/fsckd/fsckd.c | 43 +++
>  src/fsckd/fsckd.h |  5 +
>  3 files changed, 69 insertions(+), 8 deletions(-)
> 
> diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
> index f5dd546..0b42e3b 100644
> --- a/src/fsck/fsck.c
> +++ b/src/fsck/fsck.c
> @@ -47,6 +47,8 @@
>  static bool arg_skip = false;
>  static bool arg_force = false;
>  static const char *arg_repair = "-a";
> +static pid_t fsck_pid;
> +static bool cancel_requested = false;

Please do not introduce new global variables unnecessarily. We try to
keep variables locally, and keep the global state at a minimum. An
exception is mostly the command line args, which by their nature are
global anyway...

Lennart

-- 
Lennart Poettering, Red Hat
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Dimitri John Ledkov
On 28 January 2015 at 15:31, Zbigniew Jędrzejewski-Szmek
 wrote:
> On Wed, Jan 28, 2015 at 03:21:27PM +, Dimitri John Ledkov wrote:
>> On 28 January 2015 at 14:53, Zbigniew Jędrzejewski-Szmek
>>  wrote:
>> >
>> > On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:
>> > >
>> >
>> > > From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
>> > > From: Didier Roche 
>> > > Date: Mon, 26 Jan 2015 16:40:52 +0100
>> > > Subject: [PATCH 06/12] Support cancellation of fsck in progress
>> > >
>> > > Grab in fsckd plymouth watch key for C or c, and propagate this cancel 
>> > > request
>> > > to systemd-fsck which will terminate fsck.
>> > Could we bind to ^c or if this is not possible, "three c's in three
>> > seconds" instead? I'm worried that before you could press anything to 
>> > little
>> > effect in plymouth, and now a single key will have significant 
>> > consequences.
>> >
>>
>>
>> Hm? an interactive message with key-binding is usually shown and then
>> plymouth reacts to such a key prompt.
>> This is how it has always worked on plymouth prompts since forever...
>> thus this would not be a surprise to most plymouth users (~ 5+ years
>> by now?!)
>> Doing it otherwise, will, on the contrary, impede user experience.
> If you say so. I have never interacted with plymouth except to press ESC.
> I'll have to give this a try.

Actually it's not ESC button, but rather any escape sequence will drop
into messages mode. That is shift, ctrl, alt, Fn, all of them.
Thus I don't think ^c binding is actually available to plymouth clients.
But my plymouth knowledge is rusty.

-- 
Regards,

Dimitri.

Intel Corporation (UK) Ltd. - Co. Reg. #1134945 - Pipers Way, Swindon SN3 1RJ.
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Zbigniew Jędrzejewski-Szmek
On Wed, Jan 28, 2015 at 03:21:27PM +, Dimitri John Ledkov wrote:
> On 28 January 2015 at 14:53, Zbigniew Jędrzejewski-Szmek
>  wrote:
> >
> > On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:
> > >
> >
> > > From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
> > > From: Didier Roche 
> > > Date: Mon, 26 Jan 2015 16:40:52 +0100
> > > Subject: [PATCH 06/12] Support cancellation of fsck in progress
> > >
> > > Grab in fsckd plymouth watch key for C or c, and propagate this cancel 
> > > request
> > > to systemd-fsck which will terminate fsck.
> > Could we bind to ^c or if this is not possible, "three c's in three
> > seconds" instead? I'm worried that before you could press anything to little
> > effect in plymouth, and now a single key will have significant consequences.
> >
> 
> 
> Hm? an interactive message with key-binding is usually shown and then
> plymouth reacts to such a key prompt.
> This is how it has always worked on plymouth prompts since forever...
> thus this would not be a surprise to most plymouth users (~ 5+ years
> by now?!)
> Doing it otherwise, will, on the contrary, impede user experience.
If you say so. I have never interacted with plymouth except to press ESC.
I'll have to give this a try.

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


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Martin Pitt
Dimitri John Ledkov [2015-01-28 15:21 +]:
> Hm? an interactive message with key-binding is usually shown and then
> plymouth reacts to such a key prompt.
> This is how it has always worked on plymouth prompts since forever...
> thus this would not be a surprise to most plymouth users (~ 5+ years
> by now?!)
> Doing it otherwise, will, on the contrary, impede user experience.

I don't see anything wrong with always making Control-C work for the
Unix wizards, and then the more "human friendly" annouced key bindings
which can be translated, and thus also work on keyboards where you
don't have a "c" in the first place.

Martin
-- 
Martin Pitt| http://www.piware.de
Ubuntu Developer (www.ubuntu.com)  | Debian Developer  (www.debian.org)
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Dimitri John Ledkov
On 28 January 2015 at 14:53, Zbigniew Jędrzejewski-Szmek
 wrote:
>
> On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:
> >
>
> > From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
> > From: Didier Roche 
> > Date: Mon, 26 Jan 2015 16:40:52 +0100
> > Subject: [PATCH 06/12] Support cancellation of fsck in progress
> >
> > Grab in fsckd plymouth watch key for C or c, and propagate this cancel 
> > request
> > to systemd-fsck which will terminate fsck.
> Could we bind to ^c or if this is not possible, "three c's in three
> seconds" instead? I'm worried that before you could press anything to little
> effect in plymouth, and now a single key will have significant consequences.
>


Hm? an interactive message with key-binding is usually shown and then
plymouth reacts to such a key prompt.
This is how it has always worked on plymouth prompts since forever...
thus this would not be a surprise to most plymouth users (~ 5+ years
by now?!)
Doing it otherwise, will, on the contrary, impede user experience.

>
> > Send a message to signal to user what key we are grabbing for fsck cancel.
> >
> > Message is: fsckd-cancel-msg:
> > Where string is a translated string ready to be displayed by the plymouth 
> > theme
> > indicating that c or C can be used to cancel current checks. It can be
> > overriden (matching only fsckd-cancel-msg prefix) for themes supporting 
> > i18n.
> > ---
> >  src/fsck/fsck.c   | 29 +
> >  src/fsckd/fsckd.c | 43 +++
> >  src/fsckd/fsckd.h |  5 +
> >  3 files changed, 69 insertions(+), 8 deletions(-)
> >
> > diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
> > index f5dd546..0b42e3b 100644
> > --- a/src/fsck/fsck.c
> > +++ b/src/fsck/fsck.c
> > @@ -47,6 +47,8 @@
> >  static bool arg_skip = false;
> >  static bool arg_force = false;
> >  static const char *arg_repair = "-a";
> > +static pid_t fsck_pid;
> > +static bool cancel_requested = false;
> >
> >  static void start_target(const char *target) {
> >  _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
> > @@ -165,6 +167,7 @@ static int process_progress(int fd) {
> >  ssize_t n;
> >  usec_t t;
> >  FsckProgress progress;
> > +FsckdMessage fsckd_message;
> >
> >  if (fscanf(f, "%i %lu %lu %ms", &pass, &cur, &max, 
> > &device) != 4)
> >  break;
> > @@ -185,6 +188,16 @@ static int process_progress(int fd) {
> >  n = send(fsckd_fd, &progress, sizeof(FsckProgress), 0);
> >  if (n < 0 || (size_t) n < sizeof(FsckProgress))
> >  log_warning_errno(n, "Cannot communicate fsck 
> > progress to fsckd: %m");
> > +
> > +/* get fsckd requests */
> > +n = recv(fsckd_fd, &fsckd_message, sizeof(FsckdMessage), 
> > 0);
> > +if (n > 0) {
> > +if (fsckd_message.cancel) {
> > +log_warning("Request to cancel fsck from 
> > fsckd");
> > +cancel_requested = true;
> > +kill(fsck_pid, SIGTERM);
> > +}
> > +}
> >  }
> >
> >  return 0;
> > @@ -193,7 +206,6 @@ static int process_progress(int fd) {
> >  int main(int argc, char *argv[]) {
> >  const char *cmdline[9];
> >  int i = 0, r = EXIT_FAILURE, q;
> > -pid_t pid;
> >  siginfo_t status;
> >  _cleanup_udev_unref_ struct udev *udev = NULL;
> >  _cleanup_udev_device_unref_ struct udev_device *udev_device = NULL;
> > @@ -321,11 +333,11 @@ int main(int argc, char *argv[]) {
> >  cmdline[i++] = device;
> >  cmdline[i++] = NULL;
> >
> > -pid = fork();
> > -if (pid < 0) {
> > +fsck_pid = fork();
> > +if (fsck_pid < 0) {
> >  log_error_errno(errno, "fork(): %m");
> >  goto finish;
> > -} else if (pid == 0) {
> > +} else if (fsck_pid == 0) {
> >  /* Child */
> >  if (progress_pipe[0] >= 0)
> >  safe_close(progress_pipe[0]);
> > @@ -340,7 +352,7 @@ int main(int argc, char *argv[]) {
> >  progress_pipe[0] = -1;
> >  }
> >
> > -q = wait_for_terminate(pid, &status);
> > +q = wait_for_terminate(fsck_pid, &status);
> >  if (q < 0) {
> >  log_error_errno(q, "waitid(): %m");
> >  goto finish;
> > @@ -348,11 +360,11 @@ int main(int argc, char *argv[]) {
> >
> >  if (status.si_code != CLD_EXITED || (status.si_status & ~1)) {
> >
> > -if (status.si_code == CLD_KILLED || status.si_code == 
> > CLD_DUMPED)
> > +if ((!cancel_requested && status.si_code == CLD_KILLED) || 
> > status.si_code == CLD_DUMPED)
> >  

Re: [systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Zbigniew Jędrzejewski-Szmek
On Wed, Jan 28, 2015 at 02:22:54PM +0100, Didier Roche wrote:
> 

> From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
> From: Didier Roche 
> Date: Mon, 26 Jan 2015 16:40:52 +0100
> Subject: [PATCH 06/12] Support cancellation of fsck in progress
> 
> Grab in fsckd plymouth watch key for C or c, and propagate this cancel request
> to systemd-fsck which will terminate fsck.
Could we bind to ^c or if this is not possible, "three c's in three
seconds" instead? I'm worried that before you could press anything to little
effect in plymouth, and now a single key will have significant consequences.

> Send a message to signal to user what key we are grabbing for fsck cancel.
> 
> Message is: fsckd-cancel-msg:
> Where string is a translated string ready to be displayed by the plymouth 
> theme
> indicating that c or C can be used to cancel current checks. It can be
> overriden (matching only fsckd-cancel-msg prefix) for themes supporting i18n.
> ---
>  src/fsck/fsck.c   | 29 +
>  src/fsckd/fsckd.c | 43 +++
>  src/fsckd/fsckd.h |  5 +
>  3 files changed, 69 insertions(+), 8 deletions(-)
> 
> diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
> index f5dd546..0b42e3b 100644
> --- a/src/fsck/fsck.c
> +++ b/src/fsck/fsck.c
> @@ -47,6 +47,8 @@
>  static bool arg_skip = false;
>  static bool arg_force = false;
>  static const char *arg_repair = "-a";
> +static pid_t fsck_pid;
> +static bool cancel_requested = false;
>  
>  static void start_target(const char *target) {
>  _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
> @@ -165,6 +167,7 @@ static int process_progress(int fd) {
>  ssize_t n;
>  usec_t t;
>  FsckProgress progress;
> +FsckdMessage fsckd_message;
>  
>  if (fscanf(f, "%i %lu %lu %ms", &pass, &cur, &max, &device) 
> != 4)
>  break;
> @@ -185,6 +188,16 @@ static int process_progress(int fd) {
>  n = send(fsckd_fd, &progress, sizeof(FsckProgress), 0);
>  if (n < 0 || (size_t) n < sizeof(FsckProgress))
>  log_warning_errno(n, "Cannot communicate fsck 
> progress to fsckd: %m");
> +
> +/* get fsckd requests */
> +n = recv(fsckd_fd, &fsckd_message, sizeof(FsckdMessage), 0);
> +if (n > 0) {
> +if (fsckd_message.cancel) {
> +log_warning("Request to cancel fsck from 
> fsckd");
> +cancel_requested = true;
> +kill(fsck_pid, SIGTERM);
> +}
> +}
>  }
>  
>  return 0;
> @@ -193,7 +206,6 @@ static int process_progress(int fd) {
>  int main(int argc, char *argv[]) {
>  const char *cmdline[9];
>  int i = 0, r = EXIT_FAILURE, q;
> -pid_t pid;
>  siginfo_t status;
>  _cleanup_udev_unref_ struct udev *udev = NULL;
>  _cleanup_udev_device_unref_ struct udev_device *udev_device = NULL;
> @@ -321,11 +333,11 @@ int main(int argc, char *argv[]) {
>  cmdline[i++] = device;
>  cmdline[i++] = NULL;
>  
> -pid = fork();
> -if (pid < 0) {
> +fsck_pid = fork();
> +if (fsck_pid < 0) {
>  log_error_errno(errno, "fork(): %m");
>  goto finish;
> -} else if (pid == 0) {
> +} else if (fsck_pid == 0) {
>  /* Child */
>  if (progress_pipe[0] >= 0)
>  safe_close(progress_pipe[0]);
> @@ -340,7 +352,7 @@ int main(int argc, char *argv[]) {
>  progress_pipe[0] = -1;
>  }
>  
> -q = wait_for_terminate(pid, &status);
> +q = wait_for_terminate(fsck_pid, &status);
>  if (q < 0) {
>  log_error_errno(q, "waitid(): %m");
>  goto finish;
> @@ -348,11 +360,11 @@ int main(int argc, char *argv[]) {
>  
>  if (status.si_code != CLD_EXITED || (status.si_status & ~1)) {
>  
> -if (status.si_code == CLD_KILLED || status.si_code == 
> CLD_DUMPED)
> +if ((!cancel_requested && status.si_code == CLD_KILLED) || 
> status.si_code == CLD_DUMPED)
>  log_error("fsck terminated by signal %s.", 
> signal_to_string(status.si_status));
>  else if (status.si_code == CLD_EXITED)
>  log_error("fsck failed with error code %i.", 
> status.si_status);
> -else
> +else if (!cancel_requested)
>  log_error("fsck failed due to unknown reason.");
>  
>  if (status.si_code == CLD_EXITED && (status.si_status & 2) 
> && root_directory)
> @@ -363,7 +375,8 @@ int main(int argc, char *argv[]) {
>  start_target(SPECIAL_EMERGENCY_TARGET);

[systemd-devel] [PATCH 06/12] Support cancellation of fsck in progress

2015-01-28 Thread Didier Roche


>From 104cf82ba28941e907f277a713f834ceb3d909f0 Mon Sep 17 00:00:00 2001
From: Didier Roche 
Date: Mon, 26 Jan 2015 16:40:52 +0100
Subject: [PATCH 06/12] Support cancellation of fsck in progress

Grab in fsckd plymouth watch key for C or c, and propagate this cancel request
to systemd-fsck which will terminate fsck.

Send a message to signal to user what key we are grabbing for fsck cancel.

Message is: fsckd-cancel-msg:
Where string is a translated string ready to be displayed by the plymouth theme
indicating that c or C can be used to cancel current checks. It can be
overriden (matching only fsckd-cancel-msg prefix) for themes supporting i18n.
---
 src/fsck/fsck.c   | 29 +
 src/fsckd/fsckd.c | 43 +++
 src/fsckd/fsckd.h |  5 +
 3 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/src/fsck/fsck.c b/src/fsck/fsck.c
index f5dd546..0b42e3b 100644
--- a/src/fsck/fsck.c
+++ b/src/fsck/fsck.c
@@ -47,6 +47,8 @@
 static bool arg_skip = false;
 static bool arg_force = false;
 static const char *arg_repair = "-a";
+static pid_t fsck_pid;
+static bool cancel_requested = false;
 
 static void start_target(const char *target) {
 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -165,6 +167,7 @@ static int process_progress(int fd) {
 ssize_t n;
 usec_t t;
 FsckProgress progress;
+FsckdMessage fsckd_message;
 
 if (fscanf(f, "%i %lu %lu %ms", &pass, &cur, &max, &device) != 4)
 break;
@@ -185,6 +188,16 @@ static int process_progress(int fd) {
 n = send(fsckd_fd, &progress, sizeof(FsckProgress), 0);
 if (n < 0 || (size_t) n < sizeof(FsckProgress))
 log_warning_errno(n, "Cannot communicate fsck progress to fsckd: %m");
+
+/* get fsckd requests */
+n = recv(fsckd_fd, &fsckd_message, sizeof(FsckdMessage), 0);
+if (n > 0) {
+if (fsckd_message.cancel) {
+log_warning("Request to cancel fsck from fsckd");
+cancel_requested = true;
+kill(fsck_pid, SIGTERM);
+}
+}
 }
 
 return 0;
@@ -193,7 +206,6 @@ static int process_progress(int fd) {
 int main(int argc, char *argv[]) {
 const char *cmdline[9];
 int i = 0, r = EXIT_FAILURE, q;
-pid_t pid;
 siginfo_t status;
 _cleanup_udev_unref_ struct udev *udev = NULL;
 _cleanup_udev_device_unref_ struct udev_device *udev_device = NULL;
@@ -321,11 +333,11 @@ int main(int argc, char *argv[]) {
 cmdline[i++] = device;
 cmdline[i++] = NULL;
 
-pid = fork();
-if (pid < 0) {
+fsck_pid = fork();
+if (fsck_pid < 0) {
 log_error_errno(errno, "fork(): %m");
 goto finish;
-} else if (pid == 0) {
+} else if (fsck_pid == 0) {
 /* Child */
 if (progress_pipe[0] >= 0)
 safe_close(progress_pipe[0]);
@@ -340,7 +352,7 @@ int main(int argc, char *argv[]) {
 progress_pipe[0] = -1;
 }
 
-q = wait_for_terminate(pid, &status);
+q = wait_for_terminate(fsck_pid, &status);
 if (q < 0) {
 log_error_errno(q, "waitid(): %m");
 goto finish;
@@ -348,11 +360,11 @@ int main(int argc, char *argv[]) {
 
 if (status.si_code != CLD_EXITED || (status.si_status & ~1)) {
 
-if (status.si_code == CLD_KILLED || status.si_code == CLD_DUMPED)
+if ((!cancel_requested && status.si_code == CLD_KILLED) || status.si_code == CLD_DUMPED)
 log_error("fsck terminated by signal %s.", signal_to_string(status.si_status));
 else if (status.si_code == CLD_EXITED)
 log_error("fsck failed with error code %i.", status.si_status);
-else
+else if (!cancel_requested)
 log_error("fsck failed due to unknown reason.");
 
 if (status.si_code == CLD_EXITED && (status.si_status & 2) && root_directory)
@@ -363,7 +375,8 @@ int main(int argc, char *argv[]) {
 start_target(SPECIAL_EMERGENCY_TARGET);
 else {
 r = EXIT_SUCCESS;
-log_warning("Ignoring error.");
+if (!cancel_requested)
+log_warning("Ignoring error.");
 }
 
 } else
diff --git a/src/fsckd/fsckd.c b/src/fsckd/fsckd.c
index b516193..5760916 100644
--- a/src/fsckd/fsckd.c
+++ b/src/fsckd/fsckd.c
@@ -57,10 +57,15 @@ typedef struct Clients {
 unsigned long max;
 int pass;
 double percent;
+