diff mbox series

[v2] hibernate: Allow uswsusp to write to swap

Message ID 20200304170646.GA31552@dumbo (mailing list archive)
State Not Applicable, archived
Headers show
Series [v2] hibernate: Allow uswsusp to write to swap | expand

Commit Message

Domenico Andreoli March 4, 2020, 5:06 p.m. UTC
From: Domenico Andreoli <domenico.andreoli@linux.com>

It turns out that there is one use case for programs being able to
write to swap devices, and that is the userspace hibernation code.

Quick fix: disable the S_SWAPFILE check if hibernation is configured.

Fixes: dc617f29dbe5 ("vfs: don't allow writes to swap files")
Reported-by: Domenico Andreoli <domenico.andreoli@linux.com>
Reported-by: Marian Klein <mkleinsoft@gmail.com>
Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>

v2:
 - use hibernation_available() instead of IS_ENABLED(CONFIG_HIBERNATE)
 - make Fixes: point to the right commit

---
 fs/block_dev.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Rafael J. Wysocki March 22, 2020, 7:14 a.m. UTC | #1
On Wednesday, March 4, 2020 6:06:46 PM CET Domenico Andreoli wrote:
> From: Domenico Andreoli <domenico.andreoli@linux.com>
> 
> It turns out that there is one use case for programs being able to
> write to swap devices, and that is the userspace hibernation code.
> 
> Quick fix: disable the S_SWAPFILE check if hibernation is configured.
> 
> Fixes: dc617f29dbe5 ("vfs: don't allow writes to swap files")
> Reported-by: Domenico Andreoli <domenico.andreoli@linux.com>
> Reported-by: Marian Klein <mkleinsoft@gmail.com>
> Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>
> 
> v2:
>  - use hibernation_available() instead of IS_ENABLED(CONFIG_HIBERNATE)
>  - make Fixes: point to the right commit

This looks OK to me.

Has it been taken care of already, or am I expected to apply it?

> ---
>  fs/block_dev.c |    4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> Index: b/fs/block_dev.c
> ===================================================================
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -34,6 +34,7 @@
>  #include <linux/task_io_accounting_ops.h>
>  #include <linux/falloc.h>
>  #include <linux/uaccess.h>
> +#include <linux/suspend.h>
>  #include "internal.h"
>  
>  struct bdev_inode {
> @@ -2001,7 +2002,8 @@ ssize_t blkdev_write_iter(struct kiocb *
>  	if (bdev_read_only(I_BDEV(bd_inode)))
>  		return -EPERM;
>  
> -	if (IS_SWAPFILE(bd_inode))
> +	/* uswsusp needs write permission to the swap */
> +	if (IS_SWAPFILE(bd_inode) && !hibernation_available())
>  		return -ETXTBSY;
>  
>  	if (!iov_iter_count(from))
>
Domenico Andreoli March 22, 2020, 11:23 a.m. UTC | #2
On Sun, Mar 22, 2020 at 08:14:21AM +0100, Rafael J. Wysocki wrote:
> On Wednesday, March 4, 2020 6:06:46 PM CET Domenico Andreoli wrote:
> > From: Domenico Andreoli <domenico.andreoli@linux.com>
> > 
> > It turns out that there is one use case for programs being able to
> > write to swap devices, and that is the userspace hibernation code.
> > 
> > Quick fix: disable the S_SWAPFILE check if hibernation is configured.
> > 
> > Fixes: dc617f29dbe5 ("vfs: don't allow writes to swap files")
> > Reported-by: Domenico Andreoli <domenico.andreoli@linux.com>
> > Reported-by: Marian Klein <mkleinsoft@gmail.com>
> > Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>
> > 
> > v2:
> >  - use hibernation_available() instead of IS_ENABLED(CONFIG_HIBERNATE)
> >  - make Fixes: point to the right commit
> 
> This looks OK to me.
> 
> Has it been taken care of already, or am I expected to apply it?

I don't know who is supposed to take it, I did not receive any notification.

> 
> > ---
> >  fs/block_dev.c |    4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> > 
> > Index: b/fs/block_dev.c
> > ===================================================================
> > --- a/fs/block_dev.c
> > +++ b/fs/block_dev.c
> > @@ -34,6 +34,7 @@
> >  #include <linux/task_io_accounting_ops.h>
> >  #include <linux/falloc.h>
> >  #include <linux/uaccess.h>
> > +#include <linux/suspend.h>
> >  #include "internal.h"
> >  
> >  struct bdev_inode {
> > @@ -2001,7 +2002,8 @@ ssize_t blkdev_write_iter(struct kiocb *
> >  	if (bdev_read_only(I_BDEV(bd_inode)))
> >  		return -EPERM;
> >  
> > -	if (IS_SWAPFILE(bd_inode))
> > +	/* uswsusp needs write permission to the swap */
> > +	if (IS_SWAPFILE(bd_inode) && !hibernation_available())
> >  		return -ETXTBSY;
> >  
> >  	if (!iov_iter_count(from))
> > 
> 
> 
> 
>
Darrick J. Wong March 23, 2020, 3:21 p.m. UTC | #3
On Sun, Mar 22, 2020 at 12:23:14PM +0100, Domenico Andreoli wrote:
> On Sun, Mar 22, 2020 at 08:14:21AM +0100, Rafael J. Wysocki wrote:
> > On Wednesday, March 4, 2020 6:06:46 PM CET Domenico Andreoli wrote:
> > > From: Domenico Andreoli <domenico.andreoli@linux.com>
> > > 
> > > It turns out that there is one use case for programs being able to
> > > write to swap devices, and that is the userspace hibernation code.
> > > 
> > > Quick fix: disable the S_SWAPFILE check if hibernation is configured.
> > > 
> > > Fixes: dc617f29dbe5 ("vfs: don't allow writes to swap files")
> > > Reported-by: Domenico Andreoli <domenico.andreoli@linux.com>
> > > Reported-by: Marian Klein <mkleinsoft@gmail.com>
> > > Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>
> > > 
> > > v2:
> > >  - use hibernation_available() instead of IS_ENABLED(CONFIG_HIBERNATE)
> > >  - make Fixes: point to the right commit
> > 
> > This looks OK to me.
> > 
> > Has it been taken care of already, or am I expected to apply it?
> 
> I don't know who is supposed to take it, I did not receive any notification.

Hmmm.  I thought it had been picked up by akpm (see "[alternative-merged]
vfs-partially-revert-dont-allow-writes-to-swap-files.patch removed from
-mm tree" from 5 March), but it's not in mmotm now, so I'll put this in my
vfs tree for 5.7.

Also, since apparently my previous RVB apparently never made it to the
internet,

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> > 
> > > ---
> > >  fs/block_dev.c |    4 +++-
> > >  1 file changed, 3 insertions(+), 1 deletion(-)
> > > 
> > > Index: b/fs/block_dev.c
> > > ===================================================================
> > > --- a/fs/block_dev.c
> > > +++ b/fs/block_dev.c
> > > @@ -34,6 +34,7 @@
> > >  #include <linux/task_io_accounting_ops.h>
> > >  #include <linux/falloc.h>
> > >  #include <linux/uaccess.h>
> > > +#include <linux/suspend.h>
> > >  #include "internal.h"
> > >  
> > >  struct bdev_inode {
> > > @@ -2001,7 +2002,8 @@ ssize_t blkdev_write_iter(struct kiocb *
> > >  	if (bdev_read_only(I_BDEV(bd_inode)))
> > >  		return -EPERM;
> > >  
> > > -	if (IS_SWAPFILE(bd_inode))
> > > +	/* uswsusp needs write permission to the swap */
> > > +	if (IS_SWAPFILE(bd_inode) && !hibernation_available())
> > >  		return -ETXTBSY;
> > >  
> > >  	if (!iov_iter_count(from))
> > > 
> > 
> > 
> > 
> > 
> 
> -- 
> rsa4096: 3B10 0CA1 8674 ACBA B4FE  FCD2 CE5B CF17 9960 DE13
> ed25519: FFB4 0CC3 7F2E 091D F7DA  356E CC79 2832 ED38 CB05
Andrew Morton March 24, 2020, 2:19 a.m. UTC | #4
On Mon, 23 Mar 2020 08:21:05 -0700 "Darrick J. Wong" <darrick.wong@oracle.com> wrote:

> > > Has it been taken care of already, or am I expected to apply it?
> > 
> > I don't know who is supposed to take it, I did not receive any notification.
> 
> Hmmm.  I thought it had been picked up by akpm (see "[alternative-merged]
> vfs-partially-revert-dont-allow-writes-to-swap-files.patch removed from
> -mm tree" from 5 March), but it's not in mmotm now,

oop.  Things which are advertised as "hibernate: ..." tend not to
survive my morning email triage :(

> so I'll put this in my
> vfs tree for 5.7.

Thanks.  But I assume that "it turns out that userspace hibernation
requires the ability to write the hibernation image to a swap device"
means we've regressed userspace hibernation.

So I'd say either "5.6 with a cc:stable" or "5.7-rc1 with a cc:stable"
if we're being more cautious.
diff mbox series

Patch

Index: b/fs/block_dev.c
===================================================================
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -34,6 +34,7 @@ 
 #include <linux/task_io_accounting_ops.h>
 #include <linux/falloc.h>
 #include <linux/uaccess.h>
+#include <linux/suspend.h>
 #include "internal.h"
 
 struct bdev_inode {
@@ -2001,7 +2002,8 @@  ssize_t blkdev_write_iter(struct kiocb *
 	if (bdev_read_only(I_BDEV(bd_inode)))
 		return -EPERM;
 
-	if (IS_SWAPFILE(bd_inode))
+	/* uswsusp needs write permission to the swap */
+	if (IS_SWAPFILE(bd_inode) && !hibernation_available())
 		return -ETXTBSY;
 
 	if (!iov_iter_count(from))