Merge branch 'stable/for-jens-3.4-bugfixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen into for-3.4/drivers
Konrad writes: I've two small fixes for the xen-blkback - and I think one more will show up eventually (a partial revert), but not sure when. So in the spirit of keeping the patches flowing, please git pull the following branch.pull/124/head
commit
6674fb79ca
|
|
@ -398,21 +398,18 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
|
|||
int err = 0;
|
||||
int status = BLKIF_RSP_OKAY;
|
||||
struct block_device *bdev = blkif->vbd.bdev;
|
||||
unsigned long secure;
|
||||
|
||||
blkif->st_ds_req++;
|
||||
|
||||
xen_blkif_get(blkif);
|
||||
if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
|
||||
blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
|
||||
unsigned long secure = (blkif->vbd.discard_secure &&
|
||||
(req->u.discard.flag & BLKIF_DISCARD_SECURE)) ?
|
||||
BLKDEV_DISCARD_SECURE : 0;
|
||||
err = blkdev_issue_discard(bdev,
|
||||
req->u.discard.sector_number,
|
||||
req->u.discard.nr_sectors,
|
||||
GFP_KERNEL, secure);
|
||||
} else
|
||||
err = -EOPNOTSUPP;
|
||||
secure = (blkif->vbd.discard_secure &&
|
||||
(req->u.discard.flag & BLKIF_DISCARD_SECURE)) ?
|
||||
BLKDEV_DISCARD_SECURE : 0;
|
||||
|
||||
err = blkdev_issue_discard(bdev, req->u.discard.sector_number,
|
||||
req->u.discard.nr_sectors,
|
||||
GFP_KERNEL, secure);
|
||||
|
||||
if (err == -EOPNOTSUPP) {
|
||||
pr_debug(DRV_PFX "discard op failed, not supported\n");
|
||||
|
|
|
|||
|
|
@ -146,11 +146,6 @@ enum blkif_protocol {
|
|||
BLKIF_PROTOCOL_X86_64 = 3,
|
||||
};
|
||||
|
||||
enum blkif_backend_type {
|
||||
BLKIF_BACKEND_PHY = 1,
|
||||
BLKIF_BACKEND_FILE = 2,
|
||||
};
|
||||
|
||||
struct xen_vbd {
|
||||
/* What the domain refers to this vbd as. */
|
||||
blkif_vdev_t handle;
|
||||
|
|
@ -177,7 +172,6 @@ struct xen_blkif {
|
|||
unsigned int irq;
|
||||
/* Comms information. */
|
||||
enum blkif_protocol blk_protocol;
|
||||
enum blkif_backend_type blk_backend_type;
|
||||
union blkif_back_rings blk_rings;
|
||||
void *blk_ring;
|
||||
/* The VBD attached to this interface. */
|
||||
|
|
|
|||
|
|
@ -381,72 +381,49 @@ int xen_blkbk_flush_diskcache(struct xenbus_transaction xbt,
|
|||
err = xenbus_printf(xbt, dev->nodename, "feature-flush-cache",
|
||||
"%d", state);
|
||||
if (err)
|
||||
xenbus_dev_fatal(dev, err, "writing feature-flush-cache");
|
||||
dev_warn(&dev->dev, "writing feature-flush-cache (%d)", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info *be)
|
||||
static void xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info *be)
|
||||
{
|
||||
struct xenbus_device *dev = be->dev;
|
||||
struct xen_blkif *blkif = be->blkif;
|
||||
char *type;
|
||||
int err;
|
||||
int state = 0;
|
||||
struct block_device *bdev = be->blkif->vbd.bdev;
|
||||
struct request_queue *q = bdev_get_queue(bdev);
|
||||
|
||||
type = xenbus_read(XBT_NIL, dev->nodename, "type", NULL);
|
||||
if (!IS_ERR(type)) {
|
||||
if (strncmp(type, "file", 4) == 0) {
|
||||
state = 1;
|
||||
blkif->blk_backend_type = BLKIF_BACKEND_FILE;
|
||||
if (blk_queue_discard(q)) {
|
||||
err = xenbus_printf(xbt, dev->nodename,
|
||||
"discard-granularity", "%u",
|
||||
q->limits.discard_granularity);
|
||||
if (err) {
|
||||
dev_warn(&dev->dev, "writing discard-granularity (%d)", err);
|
||||
return;
|
||||
}
|
||||
if (strncmp(type, "phy", 3) == 0) {
|
||||
struct block_device *bdev = be->blkif->vbd.bdev;
|
||||
struct request_queue *q = bdev_get_queue(bdev);
|
||||
if (blk_queue_discard(q)) {
|
||||
err = xenbus_printf(xbt, dev->nodename,
|
||||
"discard-granularity", "%u",
|
||||
q->limits.discard_granularity);
|
||||
if (err) {
|
||||
xenbus_dev_fatal(dev, err,
|
||||
"writing discard-granularity");
|
||||
goto kfree;
|
||||
}
|
||||
err = xenbus_printf(xbt, dev->nodename,
|
||||
"discard-alignment", "%u",
|
||||
q->limits.discard_alignment);
|
||||
if (err) {
|
||||
xenbus_dev_fatal(dev, err,
|
||||
"writing discard-alignment");
|
||||
goto kfree;
|
||||
}
|
||||
state = 1;
|
||||
blkif->blk_backend_type = BLKIF_BACKEND_PHY;
|
||||
}
|
||||
/* Optional. */
|
||||
err = xenbus_printf(xbt, dev->nodename,
|
||||
"discard-secure", "%d",
|
||||
blkif->vbd.discard_secure);
|
||||
if (err) {
|
||||
xenbus_dev_fatal(dev, err,
|
||||
"writting discard-secure");
|
||||
goto kfree;
|
||||
}
|
||||
err = xenbus_printf(xbt, dev->nodename,
|
||||
"discard-alignment", "%u",
|
||||
q->limits.discard_alignment);
|
||||
if (err) {
|
||||
dev_warn(&dev->dev, "writing discard-alignment (%d)", err);
|
||||
return;
|
||||
}
|
||||
state = 1;
|
||||
/* Optional. */
|
||||
err = xenbus_printf(xbt, dev->nodename,
|
||||
"discard-secure", "%d",
|
||||
blkif->vbd.discard_secure);
|
||||
if (err) {
|
||||
dev_warn(dev-dev, "writing discard-secure (%d)", err);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
err = PTR_ERR(type);
|
||||
xenbus_dev_fatal(dev, err, "reading type");
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = xenbus_printf(xbt, dev->nodename, "feature-discard",
|
||||
"%d", state);
|
||||
if (err)
|
||||
xenbus_dev_fatal(dev, err, "writing feature-discard");
|
||||
kfree:
|
||||
kfree(type);
|
||||
out:
|
||||
return err;
|
||||
dev_warn(&dev->dev, "writing feature-discard (%d)", err);
|
||||
}
|
||||
int xen_blkbk_barrier(struct xenbus_transaction xbt,
|
||||
struct backend_info *be, int state)
|
||||
|
|
@ -457,7 +434,7 @@ int xen_blkbk_barrier(struct xenbus_transaction xbt,
|
|||
err = xenbus_printf(xbt, dev->nodename, "feature-barrier",
|
||||
"%d", state);
|
||||
if (err)
|
||||
xenbus_dev_fatal(dev, err, "writing feature-barrier");
|
||||
dev_warn(&dev->dev, "writing feature-barrier (%d)", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
@ -689,14 +666,12 @@ again:
|
|||
return;
|
||||
}
|
||||
|
||||
err = xen_blkbk_flush_diskcache(xbt, be, be->blkif->vbd.flush_support);
|
||||
if (err)
|
||||
goto abort;
|
||||
|
||||
err = xen_blkbk_discard(xbt, be);
|
||||
|
||||
/* If we can't advertise it is OK. */
|
||||
err = xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support);
|
||||
xen_blkbk_flush_diskcache(xbt, be, be->blkif->vbd.flush_support);
|
||||
|
||||
xen_blkbk_discard(xbt, be);
|
||||
|
||||
xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support);
|
||||
|
||||
err = xenbus_printf(xbt, dev->nodename, "sectors", "%llu",
|
||||
(unsigned long long)vbd_sz(&be->blkif->vbd));
|
||||
|
|
|
|||
Loading…
Reference in New Issue