Merge cf9a978f97 ("dcssblk: remove the end of device check in dcssblk_submit_bio") into android-mainline
Bisection steps on the way to 5.12-rc1
There's something broken with the 582cd91f69 ("Merge tag
'for-5.12/block-2021-02-17' of git://git.kernel.dk/linux-block") merge,
so let's take it in smaller chunks for now.
Change-Id: I9c655a3e714d044eca7a0da5f094605a5d7fdd5e
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -694,9 +694,7 @@ static inline bool should_fail_request(struct block_device *part,
|
|||||||
|
|
||||||
static inline bool bio_check_ro(struct bio *bio, struct block_device *part)
|
static inline bool bio_check_ro(struct bio *bio, struct block_device *part)
|
||||||
{
|
{
|
||||||
const int op = bio_op(bio);
|
if (op_is_write(bio_op(bio)) && bdev_read_only(part)) {
|
||||||
|
|
||||||
if (part->bd_read_only && op_is_write(op)) {
|
|
||||||
char b[BDEVNAME_SIZE];
|
char b[BDEVNAME_SIZE];
|
||||||
|
|
||||||
if (op_is_flush(bio->bi_opf) && !bio_sectors(bio))
|
if (op_is_flush(bio->bi_opf) && !bio_sectors(bio))
|
||||||
|
|||||||
@@ -1638,31 +1638,32 @@ static void set_disk_ro_uevent(struct gendisk *gd, int ro)
|
|||||||
kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp);
|
kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_disk_ro(struct gendisk *disk, int flag)
|
/**
|
||||||
|
* set_disk_ro - set a gendisk read-only
|
||||||
|
* @disk: gendisk to operate on
|
||||||
|
* @ready_only: %true to set the disk read-only, %false set the disk read/write
|
||||||
|
*
|
||||||
|
* This function is used to indicate whether a given disk device should have its
|
||||||
|
* read-only flag set. set_disk_ro() is typically used by device drivers to
|
||||||
|
* indicate whether the underlying physical device is write-protected.
|
||||||
|
*/
|
||||||
|
void set_disk_ro(struct gendisk *disk, bool read_only)
|
||||||
{
|
{
|
||||||
struct disk_part_iter piter;
|
if (read_only) {
|
||||||
struct block_device *part;
|
if (test_and_set_bit(GD_READ_ONLY, &disk->state))
|
||||||
|
return;
|
||||||
if (disk->part0->bd_read_only != flag) {
|
} else {
|
||||||
set_disk_ro_uevent(disk, flag);
|
if (!test_and_clear_bit(GD_READ_ONLY, &disk->state))
|
||||||
disk->part0->bd_read_only = flag;
|
return;
|
||||||
}
|
}
|
||||||
|
set_disk_ro_uevent(disk, read_only);
|
||||||
disk_part_iter_init(&piter, disk, DISK_PITER_INCL_EMPTY);
|
|
||||||
while ((part = disk_part_iter_next(&piter)))
|
|
||||||
part->bd_read_only = flag;
|
|
||||||
disk_part_iter_exit(&piter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(set_disk_ro);
|
EXPORT_SYMBOL(set_disk_ro);
|
||||||
|
|
||||||
int bdev_read_only(struct block_device *bdev)
|
int bdev_read_only(struct block_device *bdev)
|
||||||
{
|
{
|
||||||
if (!bdev)
|
return bdev->bd_read_only || get_disk_ro(bdev->bd_disk);
|
||||||
return 0;
|
|
||||||
return bdev->bd_read_only;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(bdev_read_only);
|
EXPORT_SYMBOL(bdev_read_only);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ static ssize_t part_start_show(struct device *dev,
|
|||||||
static ssize_t part_ro_show(struct device *dev,
|
static ssize_t part_ro_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return sprintf(buf, "%d\n", dev_to_bdev(dev)->bd_read_only);
|
return sprintf(buf, "%d\n", bdev_read_only(dev_to_bdev(dev)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t part_alignment_offset_show(struct device *dev,
|
static ssize_t part_alignment_offset_show(struct device *dev,
|
||||||
@@ -363,7 +363,6 @@ static struct block_device *add_partition(struct gendisk *disk, int partno,
|
|||||||
|
|
||||||
bdev->bd_start_sect = start;
|
bdev->bd_start_sect = start;
|
||||||
bdev_set_nr_sectors(bdev, len);
|
bdev_set_nr_sectors(bdev, len);
|
||||||
bdev->bd_read_only = get_disk_ro(disk);
|
|
||||||
|
|
||||||
if (info) {
|
if (info) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
|||||||
@@ -285,14 +285,10 @@ out:
|
|||||||
static blk_qc_t brd_submit_bio(struct bio *bio)
|
static blk_qc_t brd_submit_bio(struct bio *bio)
|
||||||
{
|
{
|
||||||
struct brd_device *brd = bio->bi_disk->private_data;
|
struct brd_device *brd = bio->bi_disk->private_data;
|
||||||
|
sector_t sector = bio->bi_iter.bi_sector;
|
||||||
struct bio_vec bvec;
|
struct bio_vec bvec;
|
||||||
sector_t sector;
|
|
||||||
struct bvec_iter iter;
|
struct bvec_iter iter;
|
||||||
|
|
||||||
sector = bio->bi_iter.bi_sector;
|
|
||||||
if (bio_end_sector(bio) > get_capacity(bio->bi_disk))
|
|
||||||
goto io_error;
|
|
||||||
|
|
||||||
bio_for_each_segment(bvec, bio, iter) {
|
bio_for_each_segment(bvec, bio, iter) {
|
||||||
unsigned int len = bvec.bv_len;
|
unsigned int len = bvec.bv_len;
|
||||||
int err;
|
int err;
|
||||||
|
|||||||
@@ -692,29 +692,10 @@ static void rbd_release(struct gendisk *disk, fmode_t mode)
|
|||||||
put_device(&rbd_dev->dev);
|
put_device(&rbd_dev->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rbd_set_read_only(struct block_device *bdev, bool ro)
|
|
||||||
{
|
|
||||||
struct rbd_device *rbd_dev = bdev->bd_disk->private_data;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Both images mapped read-only and snapshots can't be marked
|
|
||||||
* read-write.
|
|
||||||
*/
|
|
||||||
if (!ro) {
|
|
||||||
if (rbd_is_ro(rbd_dev))
|
|
||||||
return -EROFS;
|
|
||||||
|
|
||||||
rbd_assert(!rbd_is_snap(rbd_dev));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct block_device_operations rbd_bd_ops = {
|
static const struct block_device_operations rbd_bd_ops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.open = rbd_open,
|
.open = rbd_open,
|
||||||
.release = rbd_release,
|
.release = rbd_release,
|
||||||
.set_read_only = rbd_set_read_only,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -449,7 +449,7 @@ static int __check_incompat_features(struct cache_disk_superblock *disk_super,
|
|||||||
/*
|
/*
|
||||||
* Check for read-only metadata to skip the following RDWR checks.
|
* Check for read-only metadata to skip the following RDWR checks.
|
||||||
*/
|
*/
|
||||||
if (get_disk_ro(cmd->bdev->bd_disk))
|
if (bdev_read_only(cmd->bdev))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
features = le32_to_cpu(disk_super->compat_ro_flags) & ~DM_CACHE_FEATURE_COMPAT_RO_SUPP;
|
features = le32_to_cpu(disk_super->compat_ro_flags) & ~DM_CACHE_FEATURE_COMPAT_RO_SUPP;
|
||||||
|
|||||||
@@ -636,7 +636,7 @@ static int __check_incompat_features(struct thin_disk_superblock *disk_super,
|
|||||||
/*
|
/*
|
||||||
* Check for read-only metadata to skip the following RDWR checks.
|
* Check for read-only metadata to skip the following RDWR checks.
|
||||||
*/
|
*/
|
||||||
if (get_disk_ro(pmd->bdev->bd_disk))
|
if (bdev_read_only(pmd->bdev))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
features = le32_to_cpu(disk_super->compat_ro_flags) & ~THIN_FEATURE_COMPAT_RO_SUPP;
|
features = le32_to_cpu(disk_super->compat_ro_flags) & ~THIN_FEATURE_COMPAT_RO_SUPP;
|
||||||
|
|||||||
@@ -2125,9 +2125,8 @@ static void nvme_update_disk_info(struct gendisk *disk,
|
|||||||
nvme_config_discard(disk, ns);
|
nvme_config_discard(disk, ns);
|
||||||
nvme_config_write_zeroes(disk, ns);
|
nvme_config_write_zeroes(disk, ns);
|
||||||
|
|
||||||
if ((id->nsattr & NVME_NS_ATTR_RO) ||
|
set_disk_ro(disk, (id->nsattr & NVME_NS_ATTR_RO) ||
|
||||||
test_bit(NVME_NS_FORCE_RO, &ns->flags))
|
test_bit(NVME_NS_FORCE_RO, &ns->flags));
|
||||||
set_disk_ro(disk, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool nvme_first_scan(struct gendisk *disk)
|
static inline bool nvme_first_scan(struct gendisk *disk)
|
||||||
|
|||||||
@@ -886,10 +886,6 @@ dcssblk_submit_bio(struct bio *bio)
|
|||||||
(bio->bi_iter.bi_size & 4095) != 0)
|
(bio->bi_iter.bi_size & 4095) != 0)
|
||||||
/* Request is not page-aligned. */
|
/* Request is not page-aligned. */
|
||||||
goto fail;
|
goto fail;
|
||||||
if (bio_end_sector(bio) > get_capacity(bio->bi_disk)) {
|
|
||||||
/* Request beyond end of DCSS segment. */
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
/* verify data transfer direction */
|
/* verify data transfer direction */
|
||||||
if (dev_info->is_shared) {
|
if (dev_info->is_shared) {
|
||||||
switch (dev_info->segment_type) {
|
switch (dev_info->segment_type) {
|
||||||
|
|||||||
@@ -865,7 +865,8 @@ int reconfigure_super(struct fs_context *fc)
|
|||||||
|
|
||||||
if (fc->sb_flags_mask & SB_RDONLY) {
|
if (fc->sb_flags_mask & SB_RDONLY) {
|
||||||
#ifdef CONFIG_BLOCK
|
#ifdef CONFIG_BLOCK
|
||||||
if (!(fc->sb_flags & SB_RDONLY) && bdev_read_only(sb->s_bdev))
|
if (!(fc->sb_flags & SB_RDONLY) && sb->s_bdev &&
|
||||||
|
bdev_read_only(sb->s_bdev))
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ struct gendisk {
|
|||||||
int flags;
|
int flags;
|
||||||
unsigned long state;
|
unsigned long state;
|
||||||
#define GD_NEED_PART_SCAN 0
|
#define GD_NEED_PART_SCAN 0
|
||||||
|
#define GD_READ_ONLY 1
|
||||||
struct kobject *slave_dir;
|
struct kobject *slave_dir;
|
||||||
|
|
||||||
struct timer_rand_state *random;
|
struct timer_rand_state *random;
|
||||||
@@ -249,11 +250,12 @@ static inline void add_disk_no_queue_reg(struct gendisk *disk)
|
|||||||
extern void del_gendisk(struct gendisk *gp);
|
extern void del_gendisk(struct gendisk *gp);
|
||||||
extern struct block_device *bdget_disk(struct gendisk *disk, int partno);
|
extern struct block_device *bdget_disk(struct gendisk *disk, int partno);
|
||||||
|
|
||||||
extern void set_disk_ro(struct gendisk *disk, int flag);
|
void set_disk_ro(struct gendisk *disk, bool read_only);
|
||||||
|
|
||||||
static inline int get_disk_ro(struct gendisk *disk)
|
static inline int get_disk_ro(struct gendisk *disk)
|
||||||
{
|
{
|
||||||
return disk->part0->bd_read_only;
|
return disk->part0->bd_read_only ||
|
||||||
|
test_bit(GD_READ_ONLY, &disk->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void disk_block_events(struct gendisk *disk);
|
extern void disk_block_events(struct gendisk *disk);
|
||||||
|
|||||||
Reference in New Issue
Block a user