Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

block: disallow Persistent Reservation on partitions

Refuse Persistent Reservation operations on partitions as reservation
on partitions doesn't make sense.

Besides, introduce blkdev_pr_allowed() helper, where more policies could
be placed here later.

Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230613084008.93795-2-jefflexu@linux.alibaba.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Jingbo Xu and committed by
Jens Axboe
12629621 c576c4bf

+17 -5
+17 -5
block/ioctl.c
··· 254 254 EXPORT_SYMBOL(blkdev_compat_ptr_ioctl); 255 255 #endif 256 256 257 + static bool blkdev_pr_allowed(struct block_device *bdev) 258 + { 259 + /* no sense to make reservations for partitions */ 260 + if (bdev_is_partition(bdev)) 261 + return false; 262 + 263 + if (capable(CAP_SYS_ADMIN)) 264 + return true; 265 + 266 + return false; 267 + } 268 + 257 269 static int blkdev_pr_register(struct block_device *bdev, 258 270 struct pr_registration __user *arg) 259 271 { 260 272 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 261 273 struct pr_registration reg; 262 274 263 - if (!capable(CAP_SYS_ADMIN)) 275 + if (!blkdev_pr_allowed(bdev)) 264 276 return -EPERM; 265 277 if (!ops || !ops->pr_register) 266 278 return -EOPNOTSUPP; ··· 290 278 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 291 279 struct pr_reservation rsv; 292 280 293 - if (!capable(CAP_SYS_ADMIN)) 281 + if (!blkdev_pr_allowed(bdev)) 294 282 return -EPERM; 295 283 if (!ops || !ops->pr_reserve) 296 284 return -EOPNOTSUPP; ··· 308 296 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 309 297 struct pr_reservation rsv; 310 298 311 - if (!capable(CAP_SYS_ADMIN)) 299 + if (!blkdev_pr_allowed(bdev)) 312 300 return -EPERM; 313 301 if (!ops || !ops->pr_release) 314 302 return -EOPNOTSUPP; ··· 326 314 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 327 315 struct pr_preempt p; 328 316 329 - if (!capable(CAP_SYS_ADMIN)) 317 + if (!blkdev_pr_allowed(bdev)) 330 318 return -EPERM; 331 319 if (!ops || !ops->pr_preempt) 332 320 return -EOPNOTSUPP; ··· 344 332 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 345 333 struct pr_clear c; 346 334 347 - if (!capable(CAP_SYS_ADMIN)) 335 + if (!blkdev_pr_allowed(bdev)) 348 336 return -EPERM; 349 337 if (!ops || !ops->pr_clear) 350 338 return -EOPNOTSUPP;