diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/Kconfig | 6 | ||||
-rw-r--r-- | block/blk-map.c | 19 | ||||
-rw-r--r-- | block/bsg.c | 6 | ||||
-rw-r--r-- | block/genhd.c | 2 |
4 files changed, 20 insertions, 13 deletions
diff --git a/block/Kconfig b/block/Kconfig index ac0956f77785..0cbb3b88b59a 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -36,6 +36,12 @@ config LBD This option also enables support for single files larger than 2TB. + The ext4 filesystem requires that this feature be enabled in + order to support filesystems that have the huge_file feature + enabled. Otherwise, it will refuse to mount any filesystems + that use the huge_file feature, which is enabled by default + by mke2fs.ext4. The GFS2 filesystem also requires this feature. + If unsure, say N. config BLK_DEV_IO_TRACE diff --git a/block/blk-map.c b/block/blk-map.c index 2990447f45e9..f103729b462f 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -42,7 +42,7 @@ static int __blk_rq_unmap_user(struct bio *bio) static int __blk_rq_map_user(struct request_queue *q, struct request *rq, struct rq_map_data *map_data, void __user *ubuf, - unsigned int len, int null_mapped, gfp_t gfp_mask) + unsigned int len, gfp_t gfp_mask) { unsigned long uaddr; struct bio *bio, *orig_bio; @@ -63,7 +63,7 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq, if (IS_ERR(bio)) return PTR_ERR(bio); - if (null_mapped) + if (map_data && map_data->null_mapped) bio->bi_flags |= (1 << BIO_NULL_MAPPED); orig_bio = bio; @@ -114,17 +114,15 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq, { unsigned long bytes_read = 0; struct bio *bio = NULL; - int ret, null_mapped = 0; + int ret; if (len > (q->max_hw_sectors << 9)) return -EINVAL; if (!len) return -EINVAL; - if (!ubuf) { - if (!map_data || rq_data_dir(rq) != READ) - return -EINVAL; - null_mapped = 1; - } + + if (!ubuf && (!map_data || !map_data->null_mapped)) + return -EINVAL; while (bytes_read != len) { unsigned long map_len, end, start; @@ -143,13 +141,16 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq, map_len -= PAGE_SIZE; ret = __blk_rq_map_user(q, rq, map_data, ubuf, map_len, - null_mapped, gfp_mask); + gfp_mask); if (ret < 0) goto unmap_rq; if (!bio) bio = rq->bio; bytes_read += ret; ubuf += ret; + + if (map_data) + map_data->offset += ret; } if (!bio_flagged(bio, BIO_USER_MAPPED)) diff --git a/block/bsg.c b/block/bsg.c index e73e50daf3d0..d414bb5607e8 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -42,7 +42,7 @@ struct bsg_device { int done_cmds; wait_queue_head_t wq_done; wait_queue_head_t wq_free; - char name[BUS_ID_SIZE]; + char name[20]; int max_queue; unsigned long flags; }; @@ -781,7 +781,7 @@ static struct bsg_device *bsg_add_device(struct inode *inode, mutex_lock(&bsg_mutex); hlist_add_head(&bd->dev_list, bsg_dev_idx_hash(iminor(inode))); - strncpy(bd->name, rq->bsg_dev.class_dev->bus_id, sizeof(bd->name) - 1); + strncpy(bd->name, dev_name(rq->bsg_dev.class_dev), sizeof(bd->name) - 1); dprintk("bound to <%s>, max queue %d\n", format_dev_t(buf, inode->i_rdev), bd->max_queue); @@ -992,7 +992,7 @@ int bsg_register_queue(struct request_queue *q, struct device *parent, if (name) devname = name; else - devname = parent->bus_id; + devname = dev_name(parent); /* * we need a proper transport to send commands, not a stacked device diff --git a/block/genhd.c b/block/genhd.c index d84a7df1e2a0..397960cf26af 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1084,7 +1084,7 @@ dev_t blk_lookup_devt(const char *name, int partno) struct gendisk *disk = dev_to_disk(dev); struct hd_struct *part; - if (strcmp(dev->bus_id, name)) + if (strcmp(dev_name(dev), name)) continue; part = disk_get_part(disk, partno); |