From: Mikulas Patocka <mpatocka@redhat.com>
To: "Łukasz Patron" <priv.luk@gmail.com>
Cc: Alasdair Kergon <agk@redhat.com>,
Mike Snitzer <snitzer@kernel.org>,
dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] dm: Implement set_read_only
Date: Wed, 28 Aug 2024 15:49:41 +0200 (CEST) [thread overview]
Message-ID: <0d430a00-192a-5aa3-4286-c5f47b9c7cd4@redhat.com> (raw)
In-Reply-To: <0a02f887-aa70-4c7a-be58-3920596c175e@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2406 bytes --]
On Wed, 28 Aug 2024, Łukasz Patron wrote:
> Hi
>
> >I'd like to ask why is this patch needed? Why do you want to set read-only
> >status using this ioctl instead of using the existing table flag?
>
> I basically just wanted to be able to use `blockdev --setrw {}` on
> Android for a block device that had its table mapped as read only. I
> believe that used to work on 5.10 or so, but not anymore.
Yes, I looked at the older kernel and it will just flip the read-only flag
regardress of whether the driver supports it or not.
What specific partition do you need to write to? Is it possible to just
reload the table instead of using blockdev --setrw?
Is it required for rooting the phone or for some other activity?
> >If this is needed, we need to add another flag that is being set by
> >dm_blk_set_read_only, so that dm_blk_set_read_only and dm_resume won't
> >step over each other's changes.
>
> The following diff should address that, however I noticed that
> set_disk_ro() itself, triggers an uevent message that makes upstream
> lvm2/udev/10-dm.rules.in <http://10-dm.rules.in> disable a dm device, so not
> sure if this is
> good to have, after all.
This patch doesn't address that - when someone loads a new table and then
does suspend+resume to swap the table, set_disk_ro will be called and the
value specified by dm_blk_set_read_only will be overwritten.
Another problem is that if the table is read-only and you forcefully flip
it to read-write, then the underlying devices will still be read-only and
you would be writing to them. This is something that shouldn't be done.
Unforunatelly, older lvm does that - so the kernel just prints a warning
instead of rejecting the write. But I just don't want to add more places
where we are writing to read-only devices.
Mikulas
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -412,6 +412,19 @@ static int dm_blk_getgeo(struct block_device *bdev,
> struct hd_geometry *geo)
> static int dm_blk_set_read_only(struct block_device *bdev, bool ro)
> {
> + struct mapped_device *md = bdev->bd_disk->private_data;
> + int srcu_idx;
> + struct dm_table *table;
> +
> + table = dm_get_live_table(md, &srcu_idx);
> + if (table) {
> + if (ro)
> + table->mode &= ~BLK_OPEN_WRITE;
> + else
> + table->mode = ~BLK_OPEN_WRITE;
> + }
> + dm_put_live_table(md, srcu_idx);
> +
> set_disk_ro(bdev->bd_disk, ro);
> return 0;
> }
prev parent reply other threads:[~2024-08-28 13:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-21 21:30 Łukasz Patron
2024-08-27 17:52 ` Mikulas Patocka
2024-08-28 9:21 ` Łukasz Patron
2024-08-28 13:49 ` Mikulas Patocka [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0d430a00-192a-5aa3-4286-c5f47b9c7cd4@redhat.com \
--to=mpatocka@redhat.com \
--cc=agk@redhat.com \
--cc=dm-devel@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=priv.luk@gmail.com \
--cc=snitzer@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®