Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc5db218 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-20181109' of git://git.kernel.dk/linux-block

Pull block layer fixes from Jens Axboe:

 - Two fixes for an ubd regression, one for missing locking, and one for
   a missing initialization of a field. The latter was an old latent
   bug, but it's now visible and triggers (Me, Anton Ivanov)

 - Set of NVMe fixes via Christoph, but applied manually due to a git
   tree mixup (Christoph, Sagi)

 - Fix for a discard split regression, in three patches (Ming)

 - Update libata git trees (Geert)

 - SPDX identifier for sata_rcar (Kuninori Morimoto)

 - Virtual boundary merge fix (Johannes)

 - Preemptively clear memory we are going to pass to userspace, in case
   the driver does a short read (Keith)

* tag 'for-linus-20181109' of git://git.kernel.dk/linux-block:
  block: make sure writesame bio is aligned with logical block size
  block: cleanup __blkdev_issue_discard()
  block: make sure discard bio is aligned with logical block size
  Revert "nvmet-rdma: use a private workqueue for delete"
  nvme: make sure ns head inherits underlying device limits
  nvmet: don't try to add ns to p2p map unless it actually uses it
  sata_rcar: convert to SPDX identifiers
  ubd: fix missing initialization of io_req
  block: Clear kernel memory before copying to user
  MAINTAINERS: Fix remaining pointers to obsolete libata.git
  ubd: fix missing lock around request issue
  block: respect virtual boundary mask in bvecs
parents d757a3b0 34ffec60
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -8367,7 +8367,7 @@ F: drivers/media/dvb-frontends/lgdt3305.*
LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
M:	Viresh Kumar <vireshk@kernel.org>
L:	linux-ide@vger.kernel.org
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
S:	Maintained
F:	include/linux/pata_arasan_cf_data.h
F:	drivers/ata/pata_arasan_cf.c
@@ -8384,7 +8384,7 @@ F: drivers/ata/ata_generic.c
LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
M:	Linus Walleij <linus.walleij@linaro.org>
L:	linux-ide@vger.kernel.org
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
S:	Maintained
F:	drivers/ata/pata_ftide010.c
F:	drivers/ata/sata_gemini.c
@@ -8403,7 +8403,7 @@ F: include/linux/ahci_platform.h
LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
M:	Mikael Pettersson <mikpelinux@gmail.com>
L:	linux-ide@vger.kernel.org
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
S:	Maintained
F:	drivers/ata/sata_promise.*

+8 −4
Original line number Diff line number Diff line
@@ -1305,6 +1305,7 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
		io_req->fds[0] = dev->cow.fd;
	else
		io_req->fds[0] = dev->fd;
	io_req->error = 0;

	if (req_op(req) == REQ_OP_FLUSH) {
		io_req->op = UBD_FLUSH;
@@ -1313,9 +1314,7 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
		io_req->cow_offset = -1;
		io_req->offset = off;
		io_req->length = bvec->bv_len;
		io_req->error = 0;
		io_req->sector_mask = 0;

		io_req->op = rq_data_dir(req) == READ ? UBD_READ : UBD_WRITE;
		io_req->offsets[0] = 0;
		io_req->offsets[1] = dev->cow.data_offset;
@@ -1341,11 +1340,14 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
				 const struct blk_mq_queue_data *bd)
{
	struct ubd *ubd_dev = hctx->queue->queuedata;
	struct request *req = bd->rq;
	int ret = 0;

	blk_mq_start_request(req);

	spin_lock_irq(&ubd_dev->lock);

	if (req_op(req) == REQ_OP_FLUSH) {
		ret = ubd_queue_one_vec(hctx, req, 0, NULL);
	} else {
@@ -1361,9 +1363,11 @@ static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
		}
	}
out:
	if (ret < 0) {
	spin_unlock_irq(&ubd_dev->lock);

	if (ret < 0)
		blk_mq_requeue_request(req, true);
	}

	return BLK_STS_OK;
}

+1 −0
Original line number Diff line number Diff line
@@ -1260,6 +1260,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
		if (ret)
			goto cleanup;
	} else {
		zero_fill_bio(bio);
		iov_iter_advance(iter, bio->bi_iter.bi_size);
	}

+7 −19
Original line number Diff line number Diff line
@@ -51,16 +51,12 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
	if ((sector | nr_sects) & bs_mask)
		return -EINVAL;

	while (nr_sects) {
		unsigned int req_sects = nr_sects;
		sector_t end_sect;

		if (!req_sects)
			goto fail;
		if (req_sects > UINT_MAX >> 9)
			req_sects = UINT_MAX >> 9;
	if (!nr_sects)
		return -EINVAL;

		end_sect = sector + req_sects;
	while (nr_sects) {
		unsigned int req_sects = min_t(unsigned int, nr_sects,
				bio_allowed_max_sectors(q));

		bio = blk_next_bio(bio, 0, gfp_mask);
		bio->bi_iter.bi_sector = sector;
@@ -68,8 +64,8 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		bio_set_op_attrs(bio, op, 0);

		bio->bi_iter.bi_size = req_sects << 9;
		sector += req_sects;
		nr_sects -= req_sects;
		sector = end_sect;

		/*
		 * We can loop for a long time in here, if someone does
@@ -82,14 +78,6 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,

	*biop = bio;
	return 0;

fail:
	if (bio) {
		submit_bio_wait(bio);
		bio_put(bio);
	}
	*biop = NULL;
	return -EOPNOTSUPP;
}
EXPORT_SYMBOL(__blkdev_issue_discard);

@@ -161,7 +149,7 @@ static int __blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
		return -EOPNOTSUPP;

	/* Ensure that max_write_same_sectors doesn't overflow bi_size */
	max_write_same_sectors = UINT_MAX >> 9;
	max_write_same_sectors = bio_allowed_max_sectors(q);

	while (nr_sects) {
		bio = blk_next_bio(bio, 1, gfp_mask);
+3 −2
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ static inline bool bio_will_gap(struct request_queue *q,
		bio_get_first_bvec(prev_rq->bio, &pb);
	else
		bio_get_first_bvec(prev, &pb);
	if (pb.bv_offset)
	if (pb.bv_offset & queue_virt_boundary(q))
		return true;

	/*
@@ -90,7 +90,8 @@ static struct bio *blk_bio_discard_split(struct request_queue *q,
	/* Zero-sector (unknown) and one-sector granularities are the same.  */
	granularity = max(q->limits.discard_granularity >> 9, 1U);

	max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9);
	max_discard_sectors = min(q->limits.max_discard_sectors,
			bio_allowed_max_sectors(q));
	max_discard_sectors -= max_discard_sectors % granularity;

	if (unlikely(!max_discard_sectors)) {
Loading