Messages in this thread Patch in this message | | | Subject | Re: PROBLEM: BLKPG_DEL_PARTITION with GENHD_FL_NO_PART used to return ENXIO, now returns EINVAL | From | Yu Kuai <> | Date | Tue, 16 Jan 2024 21:23:35 +0800 |
| |
Hi, Christoph
在 2024/01/16 18:47, Christoph Hellwig 写道: > Hi Allison, > > please try this minimal fix. I need to double check if we historically > returned ENXIO or EINVAL for adding / resizing partitions, which would > make things more complicated. Or maybe you already have data for that > at hand? > > diff --git a/block/ioctl.c b/block/ioctl.c > index 9c73a763ef8838..f2028e39767821 100644 > --- a/block/ioctl.c > +++ b/block/ioctl.c > @@ -21,7 +21,7 @@ static int blkpg_do_ioctl(struct block_device *bdev, > sector_t start, length; > > if (disk->flags & GENHD_FL_NO_PART) > - return -EINVAL; > + return -ENXIO;
I think this might not be a proper fix, the reason if that before this condition is added, -ENXIO is returned from bdev_del_partition(). And there are also some other error number like -EACCES,-EFAULT following, so this change will still make changes for user in other cases.
How about following patch?
diff --git a/block/ioctl.c b/block/ioctl.c index 4160f4e6bd5b..ec012cf910dc 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -20,8 +20,6 @@ static int blkpg_do_ioctl(struct block_device *bdev, struct blkpg_partition p; long long start, length;
- if (disk->flags & GENHD_FL_NO_PART) - return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (copy_from_user(&p, upart, sizeof(struct blkpg_partition))) @@ -38,6 +36,9 @@ static int blkpg_do_ioctl(struct block_device *bdev, start = p.start >> SECTOR_SHIFT; length = p.length >> SECTOR_SHIFT;
+ if (disk->flags & GENHD_FL_NO_PART) + return -EINVAL; + switch (op) { case BLKPG_ADD_PARTITION: /* check if partition is aligned to blocksize */ Thanks, Kuai
> if (!capable(CAP_SYS_ADMIN)) > return -EACCES; > if (copy_from_user(&p, upart, sizeof(struct blkpg_partition))) > > . >
| |