rsp = { 'success': True }
xend.main.send_management_response(rsp, xend.blkif.pendaddr)
elif subtype == CMSG_BLKIF_BE_CONNECT:
- (dom,hnd,evtchn,frame,st) = struct.unpack("IIILI", msg.get_payload())
+ pl = msg.get_payload()
+ (dom, hnd, frame, evtchn, st) = (pl['domid'], pl['blkif_handle'],
+ pl['shmem_frame'], pl['evtchn'],
+ pl['status'])
blkif = interface.list[xend.main.port_from_dom(dom).local_port]
- msg = xend.utils.message(CMSG_BLKIF_FE, \
- CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
- msg.append_payload(struct.pack("III",0,2,blkif.evtchn['port2']))
+ msg = xend.utils.message(CMSG_BLKIF_FE,
+ CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0,
+ { 'handle' : 0, 'status' : 2,
+ 'evtchn' : blkif.evtchn['port2'] })
blkif.ctrlif_tx_req(xend.main.port_list[blkif.key], msg)
elif subtype == CMSG_BLKIF_BE_VBD_CREATE:
- (dom,hnd,vdev,ro,st) = struct.unpack("IIHII", msg.get_payload())
+ pl = msg.get_payload()
+ (dom, hnd, vdev, ro, st) = (pl['domid'], pl['blkif_handle'],
+ pl['vdevice'], pl['readonly'],
+ pl['status'])
blkif = interface.list[xend.main.port_from_dom(dom).local_port]
(pdev, start_sect, nr_sect, readonly) = blkif.devices[vdev]
- msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0)
- msg.append_payload(struct.pack("IIHHHQQI",dom,0,vdev,0, \
- pdev,start_sect,nr_sect,0))
+ msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0,
+ { 'domid' : dom, 'blkif_handle' : 0,
+ 'vdevice' : vdev,
+ 'extent.sector_start' : start_sect,
+ 'extent.sector_length' : nr_sect,
+ 'extent.device' : pdev })
backend_tx_req(msg)
elif subtype == CMSG_BLKIF_BE_VBD_GROW:
- rsp = { 'success': True }
- xend.main.send_management_response(rsp, xend.blkif.pendaddr)
+ if not xend.blkif.recovery:
+ rsp = { 'success': True }
+ xend.main.send_management_response(rsp, xend.blkif.pendaddr)
+ else:
+ interface.rebuilt_so_far += 1
+ if interface.rebuilt_so_far == interface.nr_to_rebuild:
+ print "Rebuilt VBDs, notifying guests:"
+ for blkif_key in interface.list.keys():
+ blkif = interface.list[blkif_key]
+ print " Notifying %d" % blkif.dom
+ msg = xend.utils.message(CMSG_BLKIF_FE, \
+ CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
+ msg.append_payload(struct.pack("III", 0,1,0))
+ blkif.ctrlif_tx_req(xend.main.port_from_dom(blkif.dom),msg)
+ xend.blkif.recovery = False
+ print "Done notifying guests"
+
def backend_do_work(port):
global pendmsg
self.devices = {}
self.pendmsg = None
interface.list[key] = self
- msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0)
- msg.append_payload(struct.pack("III",self.dom,0,0))
+ self.create()
+
+ def create(self):
- { 'domid' : dom, 'blkif_handle' : 0 })
+ msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0,
++ { 'domid' : self.dom, 'blkif_handle' : 0 })
xend.blkif.pendaddr = xend.main.mgmt_req_addr
backend_tx_req(msg)
port.write_response(msg)
subtype = (msg.get_header())['subtype']
if subtype == CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED:
- print "BLKIF: Domain %d says hello" % port.remote_dom
- msg = xend.utils.message(CMSG_BLKIF_FE, \
- CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
- msg.append_payload(struct.pack("III",0,1,0))
+ msg = xend.utils.message(CMSG_BLKIF_FE,
+ CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED,
+ 0,
+ { 'handle' : 0, 'status' : 1 })
self.ctrlif_tx_req(port, msg)
elif subtype == CMSG_BLKIF_FE_INTERFACE_CONNECT:
- print "BLKIF: Domain %d wants to connect" % port.remote_dom
- (hnd,frame) = struct.unpack("IL", msg.get_payload())
+ pl = msg.get_payload()
+ (hnd, frame) = (pl['handle'], pl['shmem_frame'])
xc = Xc.new()
- self.evtchn = xc.evtchn_bind_interdomain(dom1=0,dom2=self.dom)
+ self.evtchn = xc.evtchn_bind_interdomain( \
+ dom1=xend.blkif.be_port.remote_dom, \
+ dom2=self.dom)
- msg = xend.utils.message(CMSG_BLKIF_BE, \
- CMSG_BLKIF_BE_CONNECT, 0)
- msg.append_payload(struct.pack("IIILI",self.dom,0, \
- self.evtchn['port1'],frame,0))
+ msg = xend.utils.message(CMSG_BLKIF_BE,
+ CMSG_BLKIF_BE_CONNECT, 0,
+ { 'domid' : self.dom, 'blkif_handle' : 0,
+ 'shmem_frame' : frame,
+ 'evtchn' : self.evtchn['port1'] })
backend_tx_req(msg)