Re: Regression: hibernation is broken since e6bc9de714972cac34daa1dc1567ee48a47a9342

Domenico Andreoli
2020-02-23T19:03:21Z

On Fri, Feb 21, 2020 at 04:23:19PM -0800, Darrick J. Wong wrote:
>
> Ok, third try. Does the following work? This is a little more
> selective in that it only disables the write protection on the swap
> device/file that uswusp is going to write to.

Yes it works but also verified that once the S_SWAPFILE bit is cleared
it's never restored, therefore the protecton is gone after the first
hibernation.

>
> --D
>
> diff --git a/kernel/power/user.c b/kernel/power/user.c
> index 77438954cc2b..a3ae9cbbfcf0 100644
> --- a/kernel/power/user.c
> +++ b/kernel/power/user.c
> @@ -372,10 +372,17 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
> */
> swdev = new_decode_dev(swap_area.dev);
> if (swdev) {
> + struct block_device *bd;
> +
> offset = swap_area.offset;
> - data->swap = swap_type_of(swdev, offset, NULL);
> + data->swap = swap_type_of(swdev, offset, &bd);
> if (data->swap < 0)
> error = -ENODEV;
> +
> + inode_lock(bd->bd_inode);
> + bd->bd_inode->i_flags &= ~S_SWAPFILE;
> + inode_unlock(bd->bd_inode);
> + bdput(bd);
> } else {
> data->swap = -1;
> error = -EINVAL;

--
rsa4096: 3B10 0CA1 8674 ACBA B4FE FCD2 CE5B CF17 9960 DE13
ed25519: FFB4 0CC3 7F2E 091D F7DA 356E CC79 2832 ED38 CB05