EXPORT_SYMBOL(blkdev_compat_ptr_ioctl);
 #endif
 
+static bool blkdev_pr_allowed(struct block_device *bdev)
+{
+       /* no sense to make reservations for partitions */
+       if (bdev_is_partition(bdev))
+               return false;
+
+       if (capable(CAP_SYS_ADMIN))
+               return true;
+
+       return false;
+}
+
 static int blkdev_pr_register(struct block_device *bdev,
                struct pr_registration __user *arg)
 {
        const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
        struct pr_registration reg;
 
-       if (!capable(CAP_SYS_ADMIN))
+       if (!blkdev_pr_allowed(bdev))
                return -EPERM;
        if (!ops || !ops->pr_register)
                return -EOPNOTSUPP;
        const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
        struct pr_reservation rsv;
 
-       if (!capable(CAP_SYS_ADMIN))
+       if (!blkdev_pr_allowed(bdev))
                return -EPERM;
        if (!ops || !ops->pr_reserve)
                return -EOPNOTSUPP;
        const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
        struct pr_reservation rsv;
 
-       if (!capable(CAP_SYS_ADMIN))
+       if (!blkdev_pr_allowed(bdev))
                return -EPERM;
        if (!ops || !ops->pr_release)
                return -EOPNOTSUPP;
        const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
        struct pr_preempt p;
 
-       if (!capable(CAP_SYS_ADMIN))
+       if (!blkdev_pr_allowed(bdev))
                return -EPERM;
        if (!ops || !ops->pr_preempt)
                return -EOPNOTSUPP;
        const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops;
        struct pr_clear c;
 
-       if (!capable(CAP_SYS_ADMIN))
+       if (!blkdev_pr_allowed(bdev))
                return -EPERM;
        if (!ops || !ops->pr_clear)
                return -EOPNOTSUPP;