Lines Matching refs:info
168 static int blkfront_setup_indirect(struct blkfront_info *info);
170 static int get_id_from_freelist(struct blkfront_info *info) in get_id_from_freelist() argument
172 unsigned long free = info->shadow_free; in get_id_from_freelist()
174 info->shadow_free = info->shadow[free].req.u.rw.id; in get_id_from_freelist()
175 info->shadow[free].req.u.rw.id = 0x0fffffee; /* debug */ in get_id_from_freelist()
179 static int add_id_to_freelist(struct blkfront_info *info, in add_id_to_freelist() argument
182 if (info->shadow[id].req.u.rw.id != id) in add_id_to_freelist()
184 if (info->shadow[id].request == NULL) in add_id_to_freelist()
186 info->shadow[id].req.u.rw.id = info->shadow_free; in add_id_to_freelist()
187 info->shadow[id].request = NULL; in add_id_to_freelist()
188 info->shadow_free = id; in add_id_to_freelist()
192 static int fill_grant_buffer(struct blkfront_info *info, int num) in fill_grant_buffer() argument
203 if (info->feature_persistent) { in fill_grant_buffer()
213 list_add(&gnt_list_entry->node, &info->grants); in fill_grant_buffer()
221 &info->grants, node) { in fill_grant_buffer()
223 if (info->feature_persistent) in fill_grant_buffer()
234 struct blkfront_info *info) in get_grant() argument
239 BUG_ON(list_empty(&info->grants)); in get_grant()
240 gnt_list_entry = list_first_entry(&info->grants, struct grant, in get_grant()
245 info->persistent_gnts_c--; in get_grant()
252 if (!info->feature_persistent) { in get_grant()
258 info->xbdev->otherend_id, in get_grant()
329 struct blkfront_info *info = (struct blkfront_info *)arg; in blkif_restart_queue_callback() local
330 schedule_work(&info->work); in blkif_restart_queue_callback()
352 struct blkfront_info *info = bdev->bd_disk->private_data; in blkif_ioctl() local
355 dev_dbg(&info->xbdev->dev, "command: 0x%x, argument: 0x%lx\n", in blkif_ioctl()
360 dev_dbg(&info->xbdev->dev, "FIXME: support multisession CDs later\n"); in blkif_ioctl()
367 struct gendisk *gd = info->gd; in blkif_ioctl()
390 struct blkfront_info *info = req->rq_disk->private_data; in blkif_queue_request() local
408 if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) in blkif_queue_request()
420 if (info->persistent_gnts_c < max_grefs) { in blkif_queue_request()
423 max_grefs - info->persistent_gnts_c, in blkif_queue_request()
426 &info->callback, in blkif_queue_request()
428 info, in blkif_queue_request()
436 ring_req = RING_GET_REQUEST(&info->ring, info->ring.req_prod_pvt); in blkif_queue_request()
437 id = get_id_from_freelist(info); in blkif_queue_request()
438 info->shadow[id].request = req; in blkif_queue_request()
445 if ((req->cmd_flags & REQ_SECURE) && info->feature_secdiscard) in blkif_queue_request()
450 BUG_ON(info->max_indirect_segments == 0 && in blkif_queue_request()
452 BUG_ON(info->max_indirect_segments && in blkif_queue_request()
453 req->nr_phys_segments > info->max_indirect_segments); in blkif_queue_request()
454 nseg = blk_rq_map_sg(req->q, req, info->shadow[id].sg); in blkif_queue_request()
466 ring_req->u.indirect.handle = info->handle; in blkif_queue_request()
470 ring_req->u.rw.handle = info->handle; in blkif_queue_request()
481 switch (info->feature_flush & in blkif_queue_request()
497 for_each_sg(info->shadow[id].sg, sg, nseg, i) { in blkif_queue_request()
509 if (!info->feature_persistent) { in blkif_queue_request()
513 BUG_ON(list_empty(&info->indirect_pages)); in blkif_queue_request()
514 indirect_page = list_first_entry(&info->indirect_pages, in blkif_queue_request()
519 gnt_list_entry = get_grant(&gref_head, pfn, info); in blkif_queue_request()
520 info->shadow[id].indirect_grants[n] = gnt_list_entry; in blkif_queue_request()
525 gnt_list_entry = get_grant(&gref_head, page_to_pfn(sg_page(sg)), info); in blkif_queue_request()
528 info->shadow[id].grants_used[i] = gnt_list_entry; in blkif_queue_request()
530 if (rq_data_dir(req) && info->feature_persistent) { in blkif_queue_request()
574 info->ring.req_prod_pvt++; in blkif_queue_request()
577 info->shadow[id].req = *ring_req; in blkif_queue_request()
586 static inline void flush_requests(struct blkfront_info *info) in flush_requests() argument
590 RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->ring, notify); in flush_requests()
593 notify_remote_via_irq(info->irq); in flush_requests()
597 struct blkfront_info *info) in blkif_request_flush_invalid() argument
601 !(info->feature_flush & REQ_FLUSH)) || in blkif_request_flush_invalid()
603 !(info->feature_flush & REQ_FUA))); in blkif_request_flush_invalid()
612 struct blkfront_info *info = NULL; in do_blkif_request() local
621 info = req->rq_disk->private_data; in do_blkif_request()
623 if (RING_FULL(&info->ring)) in do_blkif_request()
628 if (blkif_request_flush_invalid(req, info)) { in do_blkif_request()
651 flush_requests(info); in do_blkif_request()
659 struct blkfront_info *info = gd->private_data; in xlvbd_init_blk_queue() local
661 rq = blk_init_queue(do_blkif_request, &info->io_lock); in xlvbd_init_blk_queue()
667 if (info->feature_discard) { in xlvbd_init_blk_queue()
670 rq->limits.discard_granularity = info->discard_granularity; in xlvbd_init_blk_queue()
671 rq->limits.discard_alignment = info->discard_alignment; in xlvbd_init_blk_queue()
672 if (info->feature_secdiscard) in xlvbd_init_blk_queue()
711 static void xlvbd_flush(struct blkfront_info *info) in xlvbd_flush() argument
713 blk_queue_flush(info->rq, info->feature_flush); in xlvbd_flush()
715 info->gd->disk_name, flush_info(info->feature_flush), in xlvbd_flush()
716 "persistent grants:", info->feature_persistent ? in xlvbd_flush()
718 info->max_indirect_segments ? "enabled;" : "disabled;"); in xlvbd_flush()
790 struct blkfront_info *info, in xlvbd_alloc_gendisk() argument
802 BUG_ON(info->gd != NULL); in xlvbd_alloc_gendisk()
803 BUG_ON(info->rq != NULL); in xlvbd_alloc_gendisk()
805 if ((info->vdevice>>EXT_SHIFT) > 1) { in xlvbd_alloc_gendisk()
807 …printk(KERN_WARNING "blkfront: vdevice 0x%x is above the extended range; ignoring\n", info->vdevic… in xlvbd_alloc_gendisk()
811 if (!VDEV_IS_EXTENDED(info->vdevice)) { in xlvbd_alloc_gendisk()
812 err = xen_translate_vdev(info->vdevice, &minor, &offset); in xlvbd_alloc_gendisk()
817 minor = BLKIF_MINOR_EXT(info->vdevice); in xlvbd_alloc_gendisk()
823 "from xvde on\n", info->vdevice); in xlvbd_alloc_gendisk()
827 info->vdevice, minor); in xlvbd_alloc_gendisk()
855 gd->private_data = info; in xlvbd_alloc_gendisk()
856 gd->driverfs_dev = &(info->xbdev->dev); in xlvbd_alloc_gendisk()
860 info->max_indirect_segments ? : in xlvbd_alloc_gendisk()
866 info->rq = gd->queue; in xlvbd_alloc_gendisk()
867 info->gd = gd; in xlvbd_alloc_gendisk()
869 xlvbd_flush(info); in xlvbd_alloc_gendisk()
888 static void xlvbd_release_gendisk(struct blkfront_info *info) in xlvbd_release_gendisk() argument
893 if (info->rq == NULL) in xlvbd_release_gendisk()
896 spin_lock_irqsave(&info->io_lock, flags); in xlvbd_release_gendisk()
899 blk_stop_queue(info->rq); in xlvbd_release_gendisk()
902 gnttab_cancel_free_callback(&info->callback); in xlvbd_release_gendisk()
903 spin_unlock_irqrestore(&info->io_lock, flags); in xlvbd_release_gendisk()
906 flush_work(&info->work); in xlvbd_release_gendisk()
908 del_gendisk(info->gd); in xlvbd_release_gendisk()
910 minor = info->gd->first_minor; in xlvbd_release_gendisk()
911 nr_minors = info->gd->minors; in xlvbd_release_gendisk()
914 blk_cleanup_queue(info->rq); in xlvbd_release_gendisk()
915 info->rq = NULL; in xlvbd_release_gendisk()
917 put_disk(info->gd); in xlvbd_release_gendisk()
918 info->gd = NULL; in xlvbd_release_gendisk()
921 static void kick_pending_request_queues(struct blkfront_info *info) in kick_pending_request_queues() argument
923 if (!RING_FULL(&info->ring)) { in kick_pending_request_queues()
925 blk_start_queue(info->rq); in kick_pending_request_queues()
927 do_blkif_request(info->rq); in kick_pending_request_queues()
933 struct blkfront_info *info = container_of(work, struct blkfront_info, work); in blkif_restart_queue() local
935 spin_lock_irq(&info->io_lock); in blkif_restart_queue()
936 if (info->connected == BLKIF_STATE_CONNECTED) in blkif_restart_queue()
937 kick_pending_request_queues(info); in blkif_restart_queue()
938 spin_unlock_irq(&info->io_lock); in blkif_restart_queue()
941 static void blkif_free(struct blkfront_info *info, int suspend) in blkif_free() argument
948 spin_lock_irq(&info->io_lock); in blkif_free()
949 info->connected = suspend ? in blkif_free()
952 if (info->rq) in blkif_free()
953 blk_stop_queue(info->rq); in blkif_free()
956 if (!list_empty(&info->grants)) { in blkif_free()
958 &info->grants, node) { in blkif_free()
963 info->persistent_gnts_c--; in blkif_free()
965 if (info->feature_persistent) in blkif_free()
970 BUG_ON(info->persistent_gnts_c != 0); in blkif_free()
976 if (!list_empty(&info->indirect_pages)) { in blkif_free()
979 BUG_ON(info->feature_persistent); in blkif_free()
980 list_for_each_entry_safe(indirect_page, n, &info->indirect_pages, lru) { in blkif_free()
991 if (!info->shadow[i].request) in blkif_free()
994 segs = info->shadow[i].req.operation == BLKIF_OP_INDIRECT ? in blkif_free()
995 info->shadow[i].req.u.indirect.nr_segments : in blkif_free()
996 info->shadow[i].req.u.rw.nr_segments; in blkif_free()
998 persistent_gnt = info->shadow[i].grants_used[j]; in blkif_free()
1000 if (info->feature_persistent) in blkif_free()
1005 if (info->shadow[i].req.operation != BLKIF_OP_INDIRECT) in blkif_free()
1013 persistent_gnt = info->shadow[i].indirect_grants[j]; in blkif_free()
1020 kfree(info->shadow[i].grants_used); in blkif_free()
1021 info->shadow[i].grants_used = NULL; in blkif_free()
1022 kfree(info->shadow[i].indirect_grants); in blkif_free()
1023 info->shadow[i].indirect_grants = NULL; in blkif_free()
1024 kfree(info->shadow[i].sg); in blkif_free()
1025 info->shadow[i].sg = NULL; in blkif_free()
1029 gnttab_cancel_free_callback(&info->callback); in blkif_free()
1030 spin_unlock_irq(&info->io_lock); in blkif_free()
1033 flush_work(&info->work); in blkif_free()
1036 if (info->ring_ref != GRANT_INVALID_REF) { in blkif_free()
1037 gnttab_end_foreign_access(info->ring_ref, 0, in blkif_free()
1038 (unsigned long)info->ring.sring); in blkif_free()
1039 info->ring_ref = GRANT_INVALID_REF; in blkif_free()
1040 info->ring.sring = NULL; in blkif_free()
1042 if (info->irq) in blkif_free()
1043 unbind_from_irqhandler(info->irq, info); in blkif_free()
1044 info->evtchn = info->irq = 0; in blkif_free()
1048 static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info, in blkif_completion() argument
1060 if (bret->operation == BLKIF_OP_READ && info->feature_persistent) { in blkif_completion()
1088 if (!info->feature_persistent) in blkif_completion()
1091 list_add(&s->grants_used[i]->node, &info->grants); in blkif_completion()
1092 info->persistent_gnts_c++; in blkif_completion()
1102 list_add_tail(&s->grants_used[i]->node, &info->grants); in blkif_completion()
1108 if (!info->feature_persistent) in blkif_completion()
1111 list_add(&s->indirect_grants[i]->node, &info->grants); in blkif_completion()
1112 info->persistent_gnts_c++; in blkif_completion()
1121 if (!info->feature_persistent) { in blkif_completion()
1123 list_add(&indirect_page->lru, &info->indirect_pages); in blkif_completion()
1126 list_add_tail(&s->indirect_grants[i]->node, &info->grants); in blkif_completion()
1138 struct blkfront_info *info = (struct blkfront_info *)dev_id; in blkif_interrupt() local
1141 spin_lock_irqsave(&info->io_lock, flags); in blkif_interrupt()
1143 if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) { in blkif_interrupt()
1144 spin_unlock_irqrestore(&info->io_lock, flags); in blkif_interrupt()
1149 rp = info->ring.sring->rsp_prod; in blkif_interrupt()
1152 for (i = info->ring.rsp_cons; i != rp; i++) { in blkif_interrupt()
1155 bret = RING_GET_RESPONSE(&info->ring, i); in blkif_interrupt()
1164 info->gd->disk_name, op_name(bret->operation), id); in blkif_interrupt()
1169 req = info->shadow[id].request; in blkif_interrupt()
1172 blkif_completion(&info->shadow[id], info, bret); in blkif_interrupt()
1174 if (add_id_to_freelist(info, id)) { in blkif_interrupt()
1176 info->gd->disk_name, op_name(bret->operation), id); in blkif_interrupt()
1184 struct request_queue *rq = info->rq; in blkif_interrupt()
1186 info->gd->disk_name, op_name(bret->operation)); in blkif_interrupt()
1188 info->feature_discard = 0; in blkif_interrupt()
1189 info->feature_secdiscard = 0; in blkif_interrupt()
1199 info->gd->disk_name, op_name(bret->operation)); in blkif_interrupt()
1203 info->shadow[id].req.u.rw.nr_segments == 0)) { in blkif_interrupt()
1205 info->gd->disk_name, op_name(bret->operation)); in blkif_interrupt()
1211 info->feature_flush = 0; in blkif_interrupt()
1212 xlvbd_flush(info); in blkif_interrupt()
1218 dev_dbg(&info->xbdev->dev, "Bad return from blkdev data " in blkif_interrupt()
1228 info->ring.rsp_cons = i; in blkif_interrupt()
1230 if (i != info->ring.req_prod_pvt) { in blkif_interrupt()
1232 RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, more_to_do); in blkif_interrupt()
1236 info->ring.sring->rsp_event = i + 1; in blkif_interrupt()
1238 kick_pending_request_queues(info); in blkif_interrupt()
1240 spin_unlock_irqrestore(&info->io_lock, flags); in blkif_interrupt()
1247 struct blkfront_info *info) in setup_blkring() argument
1253 info->ring_ref = GRANT_INVALID_REF; in setup_blkring()
1261 FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE); in setup_blkring()
1263 err = xenbus_grant_ring(dev, info->ring.sring, 1, &gref); in setup_blkring()
1266 info->ring.sring = NULL; in setup_blkring()
1269 info->ring_ref = gref; in setup_blkring()
1271 err = xenbus_alloc_evtchn(dev, &info->evtchn); in setup_blkring()
1275 err = bind_evtchn_to_irqhandler(info->evtchn, blkif_interrupt, 0, in setup_blkring()
1276 "blkif", info); in setup_blkring()
1282 info->irq = err; in setup_blkring()
1286 blkif_free(info, 0); in setup_blkring()
1293 struct blkfront_info *info) in talk_to_blkback() argument
1300 err = setup_blkring(dev, info); in talk_to_blkback()
1312 "ring-ref", "%u", info->ring_ref); in talk_to_blkback()
1318 "event-channel", "%u", info->evtchn); in talk_to_blkback()
1352 blkif_free(info, 0); in talk_to_blkback()
1367 struct blkfront_info *info; in blkfront_probe() local
1411 info = kzalloc(sizeof(*info), GFP_KERNEL); in blkfront_probe()
1412 if (!info) { in blkfront_probe()
1417 mutex_init(&info->mutex); in blkfront_probe()
1418 spin_lock_init(&info->io_lock); in blkfront_probe()
1419 info->xbdev = dev; in blkfront_probe()
1420 info->vdevice = vdevice; in blkfront_probe()
1421 INIT_LIST_HEAD(&info->grants); in blkfront_probe()
1422 INIT_LIST_HEAD(&info->indirect_pages); in blkfront_probe()
1423 info->persistent_gnts_c = 0; in blkfront_probe()
1424 info->connected = BLKIF_STATE_DISCONNECTED; in blkfront_probe()
1425 INIT_WORK(&info->work, blkif_restart_queue); in blkfront_probe()
1428 info->shadow[i].req.u.rw.id = i+1; in blkfront_probe()
1429 info->shadow[BLK_RING_SIZE-1].req.u.rw.id = 0x0fffffff; in blkfront_probe()
1432 info->handle = simple_strtoul(strrchr(dev->nodename, '/')+1, NULL, 0); in blkfront_probe()
1433 dev_set_drvdata(&dev->dev, info); in blkfront_probe()
1435 err = talk_to_blkback(dev, info); in blkfront_probe()
1437 kfree(info); in blkfront_probe()
1460 static int blkif_recover(struct blkfront_info *info) in blkif_recover() argument
1474 copy = kmemdup(info->shadow, sizeof(info->shadow), in blkif_recover()
1480 memset(&info->shadow, 0, sizeof(info->shadow)); in blkif_recover()
1482 info->shadow[i].req.u.rw.id = i+1; in blkif_recover()
1483 info->shadow_free = info->ring.req_prod_pvt; in blkif_recover()
1484 info->shadow[BLK_RING_SIZE-1].req.u.rw.id = 0x0fffffff; in blkif_recover()
1486 rc = blkfront_setup_indirect(info); in blkif_recover()
1492 segs = info->max_indirect_segments ? : BLKIF_MAX_SEGMENTS_PER_REQUEST; in blkif_recover()
1493 blk_queue_max_segments(info->rq, segs); in blkif_recover()
1527 spin_lock_irq(&info->io_lock); in blkif_recover()
1528 while ((req = blk_fetch_request(info->rq)) != NULL) { in blkif_recover()
1542 spin_unlock_irq(&info->io_lock); in blkif_recover()
1544 xenbus_switch_state(info->xbdev, XenbusStateConnected); in blkif_recover()
1546 spin_lock_irq(&info->io_lock); in blkif_recover()
1549 info->connected = BLKIF_STATE_CONNECTED; in blkif_recover()
1552 kick_pending_request_queues(info); in blkif_recover()
1558 blk_requeue_request(info->rq, req); in blkif_recover()
1560 spin_unlock_irq(&info->io_lock); in blkif_recover()
1606 struct blkfront_info *info = dev_get_drvdata(&dev->dev); in blkfront_resume() local
1611 blkif_free(info, info->connected == BLKIF_STATE_CONNECTED); in blkfront_resume()
1613 err = talk_to_blkback(dev, info); in blkfront_resume()
1625 blkfront_closing(struct blkfront_info *info) in blkfront_closing() argument
1627 struct xenbus_device *xbdev = info->xbdev; in blkfront_closing()
1630 mutex_lock(&info->mutex); in blkfront_closing()
1633 mutex_unlock(&info->mutex); in blkfront_closing()
1637 if (info->gd) in blkfront_closing()
1638 bdev = bdget_disk(info->gd, 0); in blkfront_closing()
1640 mutex_unlock(&info->mutex); in blkfront_closing()
1654 xlvbd_release_gendisk(info); in blkfront_closing()
1662 static void blkfront_setup_discard(struct blkfront_info *info) in blkfront_setup_discard() argument
1669 info->feature_discard = 1; in blkfront_setup_discard()
1670 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_setup_discard()
1675 info->discard_granularity = discard_granularity; in blkfront_setup_discard()
1676 info->discard_alignment = discard_alignment; in blkfront_setup_discard()
1678 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_setup_discard()
1682 info->feature_secdiscard = !!discard_secure; in blkfront_setup_discard()
1685 static int blkfront_setup_indirect(struct blkfront_info *info) in blkfront_setup_indirect() argument
1690 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_setup_indirect()
1694 info->max_indirect_segments = 0; in blkfront_setup_indirect()
1697 info->max_indirect_segments = min(indirect_segments, in blkfront_setup_indirect()
1699 segs = info->max_indirect_segments; in blkfront_setup_indirect()
1702 err = fill_grant_buffer(info, (segs + INDIRECT_GREFS(segs)) * BLK_RING_SIZE); in blkfront_setup_indirect()
1706 if (!info->feature_persistent && info->max_indirect_segments) { in blkfront_setup_indirect()
1714 BUG_ON(!list_empty(&info->indirect_pages)); in blkfront_setup_indirect()
1719 list_add(&indirect_page->lru, &info->indirect_pages); in blkfront_setup_indirect()
1724 info->shadow[i].grants_used = kzalloc( in blkfront_setup_indirect()
1725 sizeof(info->shadow[i].grants_used[0]) * segs, in blkfront_setup_indirect()
1727 info->shadow[i].sg = kzalloc(sizeof(info->shadow[i].sg[0]) * segs, GFP_NOIO); in blkfront_setup_indirect()
1728 if (info->max_indirect_segments) in blkfront_setup_indirect()
1729 info->shadow[i].indirect_grants = kzalloc( in blkfront_setup_indirect()
1730 sizeof(info->shadow[i].indirect_grants[0]) * in blkfront_setup_indirect()
1733 if ((info->shadow[i].grants_used == NULL) || in blkfront_setup_indirect()
1734 (info->shadow[i].sg == NULL) || in blkfront_setup_indirect()
1735 (info->max_indirect_segments && in blkfront_setup_indirect()
1736 (info->shadow[i].indirect_grants == NULL))) in blkfront_setup_indirect()
1738 sg_init_table(info->shadow[i].sg, segs); in blkfront_setup_indirect()
1746 kfree(info->shadow[i].grants_used); in blkfront_setup_indirect()
1747 info->shadow[i].grants_used = NULL; in blkfront_setup_indirect()
1748 kfree(info->shadow[i].sg); in blkfront_setup_indirect()
1749 info->shadow[i].sg = NULL; in blkfront_setup_indirect()
1750 kfree(info->shadow[i].indirect_grants); in blkfront_setup_indirect()
1751 info->shadow[i].indirect_grants = NULL; in blkfront_setup_indirect()
1753 if (!list_empty(&info->indirect_pages)) { in blkfront_setup_indirect()
1755 list_for_each_entry_safe(indirect_page, n, &info->indirect_pages, lru) { in blkfront_setup_indirect()
1767 static void blkfront_connect(struct blkfront_info *info) in blkfront_connect() argument
1776 switch (info->connected) { in blkfront_connect()
1782 err = xenbus_scanf(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1788 set_capacity(info->gd, sectors); in blkfront_connect()
1789 revalidate_disk(info->gd); in blkfront_connect()
1799 blkif_recover(info); in blkfront_connect()
1806 dev_dbg(&info->xbdev->dev, "%s:%s.\n", in blkfront_connect()
1807 __func__, info->xbdev->otherend); in blkfront_connect()
1809 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1815 xenbus_dev_fatal(info->xbdev, err, in blkfront_connect()
1817 info->xbdev->otherend); in blkfront_connect()
1826 err = xenbus_scanf(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1831 info->feature_flush = 0; in blkfront_connect()
1833 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1845 info->feature_flush = REQ_FLUSH | REQ_FUA; in blkfront_connect()
1850 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1855 info->feature_flush = REQ_FLUSH; in blkfront_connect()
1857 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1862 blkfront_setup_discard(info); in blkfront_connect()
1864 err = xenbus_gather(XBT_NIL, info->xbdev->otherend, in blkfront_connect()
1868 info->feature_persistent = 0; in blkfront_connect()
1870 info->feature_persistent = persistent; in blkfront_connect()
1872 err = blkfront_setup_indirect(info); in blkfront_connect()
1874 xenbus_dev_fatal(info->xbdev, err, "setup_indirect at %s", in blkfront_connect()
1875 info->xbdev->otherend); in blkfront_connect()
1879 err = xlvbd_alloc_gendisk(sectors, info, binfo, sector_size, in blkfront_connect()
1882 xenbus_dev_fatal(info->xbdev, err, "xlvbd_add at %s", in blkfront_connect()
1883 info->xbdev->otherend); in blkfront_connect()
1887 xenbus_switch_state(info->xbdev, XenbusStateConnected); in blkfront_connect()
1890 spin_lock_irq(&info->io_lock); in blkfront_connect()
1891 info->connected = BLKIF_STATE_CONNECTED; in blkfront_connect()
1892 kick_pending_request_queues(info); in blkfront_connect()
1893 spin_unlock_irq(&info->io_lock); in blkfront_connect()
1895 add_disk(info->gd); in blkfront_connect()
1897 info->is_ready = 1; in blkfront_connect()
1906 struct blkfront_info *info = dev_get_drvdata(&dev->dev); in blkback_changed() local
1920 blkfront_connect(info); in blkback_changed()
1928 if (info) in blkback_changed()
1929 blkfront_closing(info); in blkback_changed()
1936 struct blkfront_info *info = dev_get_drvdata(&xbdev->dev); in blkfront_remove() local
1942 blkif_free(info, 0); in blkfront_remove()
1944 mutex_lock(&info->mutex); in blkfront_remove()
1946 disk = info->gd; in blkfront_remove()
1950 info->xbdev = NULL; in blkfront_remove()
1951 mutex_unlock(&info->mutex); in blkfront_remove()
1954 kfree(info); in blkfront_remove()
1965 info = disk->private_data; in blkfront_remove()
1971 if (info && !bdev->bd_openers) { in blkfront_remove()
1972 xlvbd_release_gendisk(info); in blkfront_remove()
1974 kfree(info); in blkfront_remove()
1985 struct blkfront_info *info = dev_get_drvdata(&dev->dev); in blkfront_is_ready() local
1987 return info->is_ready && info->xbdev; in blkfront_is_ready()
1993 struct blkfront_info *info; in blkif_open() local
1998 info = disk->private_data; in blkif_open()
1999 if (!info) { in blkif_open()
2005 mutex_lock(&info->mutex); in blkif_open()
2007 if (!info->gd) in blkif_open()
2011 mutex_unlock(&info->mutex); in blkif_open()
2020 struct blkfront_info *info = disk->private_data; in blkif_release() local
2040 mutex_lock(&info->mutex); in blkif_release()
2041 xbdev = info->xbdev; in blkif_release()
2046 xlvbd_release_gendisk(info); in blkif_release()
2047 xenbus_frontend_closed(info->xbdev); in blkif_release()
2050 mutex_unlock(&info->mutex); in blkif_release()
2055 xlvbd_release_gendisk(info); in blkif_release()
2057 kfree(info); in blkif_release()