def create(self, sr_uuid, vdi_uuid, size):
        if not self.sr.isMaster:
            util.SMlog('vdi_create blocked for non-master')
            raise xs_errors.XenError('LVMMaster')

        try:
            mb = 1024L * 1024L
            size_mb = (long(size) + mb - 1L) / mb # round up
            # Rather than bailing out for small sizes, just round up to 1 MiB. The
            # LVM code will round up to the nearest PE size anyway (probably 4 MiB)
            if size_mb == 0:
                size_mb = 1
            
            if lvutil._checkLV(self.path):
                raise xs_errors.XenError('VDIExists')

            # Verify there's sufficient space for the VDI
            stats = lvutil._getVGstats(self.sr.vgname)
            freespace = stats['physical_size'] - stats['physical_utilisation']
            if freespace < long(size):
                raise xs_errors.XenError('SRNoSpace')              

            cmd = ["lvcreate", "-n", self.lvname, "-L", str(size_mb), \
                   self.sr.vgname]
            text = util.pread2(cmd)

            cmd = ["lvchange", "-an", self.path]
            text = util.pread2(cmd)

            self.size = lvutil._getLVsize(self.path)
            self.utilisation = self.size
        except util.CommandException, inst:
            raise xs_errors.XenError('LVMCreate', \
                  opterr='lv operation failed error is %d' % inst.code)
    def resize(self, sr_uuid, vdi_uuid, size):
        if not self.sr.isMaster:
            util.SMlog('vdi_resize blocked for non-master')
            raise xs_errors.XenError('LVMMaster')

        try:
            self.size = lvutil._getLVsize(self.path)
        except:
            raise xs_errors.XenError('VDIUnavailable', \
                  opterr='no such VDI %s' % self.path)

        size_mb = long(size) / (1024 * 1024)
        try:
            assert(size_mb >= self.size/(1024 * 1024))
            if size == self.size:
                self.size = lvutil._getLVsize(self.path)
                self.utilisation = self.size
                return super(LVMVDI, self).get_params()

            # Verify there's sufficient space for the VDI
            stats = lvutil._getVGstats(self.sr.vgname)
            freespace = stats['physical_size'] - stats['physical_utilisation']
            if freespace < long(size) - self.size:
                raise xs_errors.XenError('SRNoSpace')
            
            cmd = ["lvresize", "-L", str(size_mb), self.path]
            text = util.pread2(cmd)
            
            self.size = lvutil._getLVsize(self.path)
            self.utilisation = self.size
            self._db_update()
            
            return super(LVMVDI, self).get_params()
        
        except util.CommandException, inst:
            raise xs_errors.XenError('LVMResize', \
                  opterr='lvresize failed error is %d' % inst.code)