Lines Matching refs:blkif

23 	struct xen_blkif	*blkif;  member
35 static void xen_blkif_free(struct xen_blkif *blkif);
49 struct xen_blkif *blkif; in xen_blkif_deferred_free() local
51 blkif = container_of(work, struct xen_blkif, free_work); in xen_blkif_deferred_free()
52 xen_blkif_free(blkif); in xen_blkif_deferred_free()
55 static int blkback_name(struct xen_blkif *blkif, char *buf) in blkback_name() argument
58 struct xenbus_device *dev = blkif->be->dev; in blkback_name()
70 snprintf(buf, TASK_COMM_LEN, "%d.%s", blkif->domid, devname); in blkback_name()
76 static void xen_update_blkif_status(struct xen_blkif *blkif) in xen_update_blkif_status() argument
84 if (!blkif->rings || !blkif->rings[0].irq || !blkif->vbd.bdev) in xen_update_blkif_status()
88 if (blkif->be->dev->state == XenbusStateConnected) in xen_update_blkif_status()
92 connect(blkif->be); in xen_update_blkif_status()
93 if (blkif->be->dev->state != XenbusStateConnected) in xen_update_blkif_status()
96 err = blkback_name(blkif, name); in xen_update_blkif_status()
98 xenbus_dev_error(blkif->be->dev, err, "get blkback dev name"); in xen_update_blkif_status()
102 err = sync_blockdev(blkif->vbd.bdev); in xen_update_blkif_status()
104 xenbus_dev_error(blkif->be->dev, err, "block flush"); in xen_update_blkif_status()
107 invalidate_inode_pages2(blkif->vbd.bdev->bd_inode->i_mapping); in xen_update_blkif_status()
109 for (i = 0; i < blkif->nr_rings; i++) { in xen_update_blkif_status()
110 ring = &blkif->rings[i]; in xen_update_blkif_status()
115 xenbus_dev_fatal(blkif->be->dev, err, in xen_update_blkif_status()
124 ring = &blkif->rings[i]; in xen_update_blkif_status()
130 static int xen_blkif_alloc_rings(struct xen_blkif *blkif) in xen_blkif_alloc_rings() argument
134 blkif->rings = kcalloc(blkif->nr_rings, sizeof(struct xen_blkif_ring), in xen_blkif_alloc_rings()
136 if (!blkif->rings) in xen_blkif_alloc_rings()
139 for (r = 0; r < blkif->nr_rings; r++) { in xen_blkif_alloc_rings()
140 struct xen_blkif_ring *ring = &blkif->rings[r]; in xen_blkif_alloc_rings()
152 ring->blkif = blkif; in xen_blkif_alloc_rings()
167 struct xen_blkif *blkif; in xen_blkif_alloc() local
171 blkif = kmem_cache_zalloc(xen_blkif_cachep, GFP_KERNEL); in xen_blkif_alloc()
172 if (!blkif) in xen_blkif_alloc()
175 blkif->domid = domid; in xen_blkif_alloc()
176 atomic_set(&blkif->refcnt, 1); in xen_blkif_alloc()
177 init_completion(&blkif->drain_complete); in xen_blkif_alloc()
187 INIT_WORK(&blkif->free_work, xen_blkif_deferred_free); in xen_blkif_alloc()
189 return blkif; in xen_blkif_alloc()
196 struct xen_blkif *blkif = ring->blkif; in xen_blkif_map() local
205 err = xenbus_map_ring_valloc(blkif->be->dev, gref, nr_grefs, in xen_blkif_map()
214 switch (blkif->blk_protocol) { in xen_blkif_map()
253 err = bind_interdomain_evtchn_to_irqhandler_lateeoi(blkif->be->dev, in xen_blkif_map()
262 xenbus_unmap_ring_vfree(blkif->be->dev, ring->blk_ring); in xen_blkif_map()
267 static int xen_blkif_disconnect(struct xen_blkif *blkif) in xen_blkif_disconnect() argument
273 for (r = 0; r < blkif->nr_rings; r++) { in xen_blkif_disconnect()
274 struct xen_blkif_ring *ring = &blkif->rings[r]; in xen_blkif_disconnect()
301 xenbus_unmap_ring_vfree(blkif->be->dev, ring->blk_ring); in xen_blkif_disconnect()
327 WARN_ON(i != (XEN_BLKIF_REQS_PER_PAGE * blkif->nr_ring_pages)); in xen_blkif_disconnect()
333 blkif->nr_ring_pages = 0; in xen_blkif_disconnect()
338 kfree(blkif->rings); in xen_blkif_disconnect()
339 blkif->rings = NULL; in xen_blkif_disconnect()
340 blkif->nr_rings = 0; in xen_blkif_disconnect()
345 static void xen_blkif_free(struct xen_blkif *blkif) in xen_blkif_free() argument
347 WARN_ON(xen_blkif_disconnect(blkif)); in xen_blkif_free()
348 xen_vbd_free(&blkif->vbd); in xen_blkif_free()
349 kfree(blkif->be->mode); in xen_blkif_free()
350 kfree(blkif->be); in xen_blkif_free()
353 kmem_cache_free(xen_blkif_cachep, blkif); in xen_blkif_free()
385 struct xen_blkif *blkif = be->blkif; \
389 if (!blkif->rings) \
392 for (i = 0; i < blkif->nr_rings; i++) { \
393 struct xen_blkif_ring *ring = &blkif->rings[i]; \
480 static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, in xen_vbd_create() argument
487 vbd = &blkif->vbd; in xen_vbd_create()
523 handle, blkif->domid); in xen_vbd_create()
544 if (be->blkif) { in xen_blkbk_remove()
545 xen_blkif_disconnect(be->blkif); in xen_blkbk_remove()
548 xen_blkif_put(be->blkif); in xen_blkbk_remove()
569 struct xen_blkif *blkif = be->blkif; in xen_blkbk_discard() local
572 struct block_device *bdev = be->blkif->vbd.bdev; in xen_blkbk_discard()
596 blkif->vbd.discard_secure); in xen_blkbk_discard()
645 be->blkif = xen_blkif_alloc(dev->otherend_id); in xen_blkbk_probe()
646 if (IS_ERR(be->blkif)) { in xen_blkbk_probe()
647 err = PTR_ERR(be->blkif); in xen_blkbk_probe()
648 be->blkif = NULL; in xen_blkbk_probe()
668 be->blkif->be = be; in xen_blkbk_probe()
760 err = xen_vbd_create(be->blkif, handle, major, minor, in backend_changed()
768 xen_vbd_free(&be->blkif->vbd); in backend_changed()
780 xen_update_blkif_status(be->blkif); in backend_changed()
817 err = xen_blkif_disconnect(be->blkif); in frontend_changed()
829 xen_blkif_disconnect(be->blkif); in frontend_changed()
832 xen_update_blkif_status(be->blkif); in frontend_changed()
840 xen_blkif_disconnect(be->blkif); in frontend_changed()
874 be->blkif->buffer_squeeze_end = jiffies + in reclaim_memory()
901 xen_blkbk_flush_diskcache(xbt, be, be->blkif->vbd.flush_support); in connect()
905 xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support); in connect()
908 be->blkif->vbd.feature_gnt_persistent_parm); in connect()
916 (unsigned long long)vbd_sz(&be->blkif->vbd)); in connect()
925 be->blkif->vbd.type | in connect()
926 (be->blkif->vbd.readonly ? VDISK_READONLY : 0)); in connect()
934 bdev_logical_block_size(be->blkif->vbd.bdev)); in connect()
941 bdev_physical_block_size(be->blkif->vbd.bdev)); in connect()
970 struct xen_blkif *blkif = ring->blkif; in read_per_ring_refs() local
971 struct xenbus_device *dev = blkif->be->dev; in read_per_ring_refs()
982 nr_grefs = blkif->nr_ring_pages; in read_per_ring_refs()
992 if (blkif->multi_ref) in read_per_ring_refs()
1059 struct xen_blkif *blkif = be->blkif; in connect_ring() local
1070 blkif->blk_protocol = BLKIF_PROTOCOL_DEFAULT; in connect_ring()
1076 blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE; in connect_ring()
1078 blkif->blk_protocol = BLKIF_PROTOCOL_X86_32; in connect_ring()
1080 blkif->blk_protocol = BLKIF_PROTOCOL_X86_64; in connect_ring()
1086 blkif->vbd.feature_gnt_persistent_parm = feature_persistent; in connect_ring()
1087 blkif->vbd.feature_gnt_persistent = in connect_ring()
1088 blkif->vbd.feature_gnt_persistent_parm && in connect_ring()
1091 blkif->vbd.overflow_max_grants = 0; in connect_ring()
1107 blkif->nr_rings = requested_num_queues; in connect_ring()
1108 if (xen_blkif_alloc_rings(blkif)) in connect_ring()
1112 blkif->nr_rings, blkif->blk_protocol, protocol, in connect_ring()
1113 blkif->vbd.feature_gnt_persistent ? "persistent grants" : ""); in connect_ring()
1118 blkif->nr_ring_pages = 1; in connect_ring()
1119 blkif->multi_ref = false; in connect_ring()
1121 blkif->nr_ring_pages = 1 << ring_page_order; in connect_ring()
1122 blkif->multi_ref = true; in connect_ring()
1132 if (blkif->nr_rings == 1) in connect_ring()
1133 return read_per_ring_refs(&blkif->rings[0], dev->otherend); in connect_ring()
1142 for (i = 0; i < blkif->nr_rings; i++) { in connect_ring()
1145 err = read_per_ring_refs(&blkif->rings[i], xspath); in connect_ring()