Revision 94dcbdb0

b/lib/backend.py
1540 1540
      clist.append(crdev)
1541 1541

  
1542 1542
  try:
1543
    device = bdev.Create(disk.dev_type, disk.physical_id, clist, disk.size)
1543
    device = bdev.Create(disk, clist)
1544 1544
  except errors.BlockDeviceError, err:
1545 1545
    _Fail("Can't create block device: %s", err)
1546 1546

  
......
1722 1722
      children.append(cdev)
1723 1723

  
1724 1724
  if as_primary or disk.AssembleOnSecondary():
1725
    r_dev = bdev.Assemble(disk.dev_type, disk.physical_id, children, disk.size)
1725
    r_dev = bdev.Assemble(disk, children)
1726 1726
    result = r_dev
1727 1727
    if as_primary or disk.OpenOnSecondary():
1728 1728
      r_dev.Open()
......
1915 1915
    for chdisk in disk.children:
1916 1916
      children.append(_RecursiveFindBD(chdisk))
1917 1917

  
1918
  return bdev.FindDevice(disk.dev_type, disk.physical_id, children, disk.size)
1918
  return bdev.FindDevice(disk, children)
1919 1919

  
1920 1920

  
1921 1921
def _OpenRealBD(disk):
b/lib/bdev.py
130 130
  after assembly we'll have our correct major/minor.
131 131

  
132 132
  """
133
  def __init__(self, unique_id, children, size):
133
  def __init__(self, unique_id, children, size, params):
134 134
    self._children = children
135 135
    self.dev_path = None
136 136
    self.unique_id = unique_id
......
138 138
    self.minor = None
139 139
    self.attached = False
140 140
    self.size = size
141
    self.params = params
141 142

  
142 143
  def Assemble(self):
143 144
    """Assemble the device from its components.
......
166 167
    raise NotImplementedError
167 168

  
168 169
  @classmethod
169
  def Create(cls, unique_id, children, size):
170
  def Create(cls, unique_id, children, size, params):
170 171
    """Create the device.
171 172

  
172 173
    If the device cannot be created, it will return None
......
373 374
  _INVALID_NAMES = frozenset([".", "..", "snapshot", "pvmove"])
374 375
  _INVALID_SUBSTRINGS = frozenset(["_mlog", "_mimage"])
375 376

  
376
  def __init__(self, unique_id, children, size):
377
  def __init__(self, unique_id, children, size, params):
377 378
    """Attaches to a LV device.
378 379

  
379 380
    The unique_id is a tuple (vg_name, lv_name)
380 381

  
381 382
    """
382
    super(LogicalVolume, self).__init__(unique_id, children, size)
383
    super(LogicalVolume, self).__init__(unique_id, children, size, params)
383 384
    if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2:
384 385
      raise ValueError("Invalid configuration data %s" % str(unique_id))
385 386
    self._vg_name, self._lv_name = unique_id
......
391 392
    self.Attach()
392 393

  
393 394
  @classmethod
394
  def Create(cls, unique_id, children, size):
395
  def Create(cls, unique_id, children, size, params):
395 396
    """Create a new logical volume.
396 397

  
397 398
    """
......
433 434
    if result.failed:
434 435
      _ThrowError("LV create failed (%s): %s",
435 436
                  result.fail_reason, result.output)
436
    return LogicalVolume(unique_id, children, size)
437
    return LogicalVolume(unique_id, children, size, params)
437 438

  
438 439
  @staticmethod
439 440
  def _GetVolumeInfo(lvm_cmd, fields):
......
718 719
    snap_name = self._lv_name + ".snap"
719 720

  
720 721
    # remove existing snapshot if found
721
    snap = LogicalVolume((self._vg_name, snap_name), None, size)
722
    snap = LogicalVolume((self._vg_name, snap_name), None, size, self.params)
722 723
    _IgnoreError(snap.Remove)
723 724

  
724 725
    vg_info = self.GetVGInfo([self._vg_name])
......
1098 1099
  # timeout constants
1099 1100
  _NET_RECONFIG_TIMEOUT = 60
1100 1101

  
1101
  def __init__(self, unique_id, children, size):
1102
  def __init__(self, unique_id, children, size, params):
1102 1103
    if children and children.count(None) > 0:
1103 1104
      children = []
1104 1105
    if len(children) not in (0, 2):
......
1112 1113
      if not _CanReadDevice(children[1].dev_path):
1113 1114
        logging.info("drbd%s: Ignoring unreadable meta device", self._aminor)
1114 1115
        children = []
1115
    super(DRBD8, self).__init__(unique_id, children, size)
1116
    super(DRBD8, self).__init__(unique_id, children, size, params)
1116 1117
    self.major = self._DRBD_MAJOR
1117 1118
    version = self._GetVersion(self._GetProcData())
1118 1119
    if version["k_major"] != 8:
......
1905 1906
    self.Shutdown()
1906 1907

  
1907 1908
  @classmethod
1908
  def Create(cls, unique_id, children, size):
1909
  def Create(cls, unique_id, children, size, params):
1909 1910
    """Create a new DRBD8 device.
1910 1911

  
1911 1912
    Since DRBD devices are not created per se, just assembled, this
......
1931 1932
                  aminor, meta)
1932 1933
    cls._CheckMetaSize(meta.dev_path)
1933 1934
    cls._InitMeta(aminor, meta.dev_path)
1934
    return cls(unique_id, children, size)
1935
    return cls(unique_id, children, size, params)
1935 1936

  
1936 1937
  def Grow(self, amount, dryrun):
1937 1938
    """Resize the DRBD device and its backing storage.
......
1959 1960
  The unique_id for the file device is a (file_driver, file_path) tuple.
1960 1961

  
1961 1962
  """
1962
  def __init__(self, unique_id, children, size):
1963
  def __init__(self, unique_id, children, size, params):
1963 1964
    """Initalizes a file device backend.
1964 1965

  
1965 1966
    """
1966 1967
    if children:
1967 1968
      raise errors.BlockDeviceError("Invalid setup for file device")
1968
    super(FileStorage, self).__init__(unique_id, children, size)
1969
    super(FileStorage, self).__init__(unique_id, children, size, params)
1969 1970
    if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2:
1970 1971
      raise ValueError("Invalid configuration data %s" % str(unique_id))
1971 1972
    self.driver = unique_id[0]
......
2073 2074
      _ThrowError("Can't stat %s: %s", self.dev_path, err)
2074 2075

  
2075 2076
  @classmethod
2076
  def Create(cls, unique_id, children, size):
2077
  def Create(cls, unique_id, children, size, params):
2077 2078
    """Create a new file.
2078 2079

  
2079 2080
    @param size: the size of file in MiB
......
2095 2096
        _ThrowError("File already existing: %s", dev_path)
2096 2097
      _ThrowError("Error in file creation: %", str(err))
2097 2098

  
2098
    return FileStorage(unique_id, children, size)
2099
    return FileStorage(unique_id, children, size, params)
2099 2100

  
2100 2101

  
2101 2102
class PersistentBlockDevice(BlockDev):
......
2108 2109
  For the time being, pathnames are required to lie under /dev.
2109 2110

  
2110 2111
  """
2111
  def __init__(self, unique_id, children, size):
2112
  def __init__(self, unique_id, children, size, params):
2112 2113
    """Attaches to a static block device.
2113 2114

  
2114 2115
    The unique_id is a path under /dev.
2115 2116

  
2116 2117
    """
2117
    super(PersistentBlockDevice, self).__init__(unique_id, children, size)
2118
    super(PersistentBlockDevice, self).__init__(unique_id, children, size,
2119
                                                params)
2118 2120
    if not isinstance(unique_id, (tuple, list)) or len(unique_id) != 2:
2119 2121
      raise ValueError("Invalid configuration data %s" % str(unique_id))
2120 2122
    self.dev_path = unique_id[1]
......
2133 2135
    self.Attach()
2134 2136

  
2135 2137
  @classmethod
2136
  def Create(cls, unique_id, children, size):
2138
  def Create(cls, unique_id, children, size, params):
2137 2139
    """Create a new device
2138 2140

  
2139 2141
    This is a noop, we only return a PersistentBlockDevice instance
2140 2142

  
2141 2143
    """
2142
    return PersistentBlockDevice(unique_id, children, 0)
2144
    return PersistentBlockDevice(unique_id, children, 0, params)
2143 2145

  
2144 2146
  def Remove(self):
2145 2147
    """Remove a device
......
2218 2220
  DEV_MAP[constants.LD_FILE] = FileStorage
2219 2221

  
2220 2222

  
2221
def FindDevice(dev_type, unique_id, children, size):
2223
def _VerifyDiskType(dev_type):
2224
  if dev_type not in DEV_MAP:
2225
    raise errors.ProgrammerError("Invalid block device type '%s'" % dev_type)
2226

  
2227

  
2228
def FindDevice(disk, children):
2222 2229
  """Search for an existing, assembled device.
2223 2230

  
2224 2231
  This will succeed only if the device exists and is assembled, but it
2225 2232
  does not do any actions in order to activate the device.
2226 2233

  
2234
  @type disk: L{objects.Disk}
2235
  @param disk: the disk object to find
2236
  @type children: list of L{bdev.BlockDev}
2237
  @param children: the list of block devices that are children of the device
2238
                  represented by the disk parameter
2239

  
2227 2240
  """
2228
  if dev_type not in DEV_MAP:
2229
    raise errors.ProgrammerError("Invalid block device type '%s'" % dev_type)
2230
  device = DEV_MAP[dev_type](unique_id, children, size)
2241
  _VerifyDiskType(disk.dev_type)
2242
  dev_params = objects.FillDict(constants.DISK_LD_DEFAULTS[disk.dev_type],
2243
                                disk.params)
2244
  device = DEV_MAP[disk.dev_type](disk.physical_id, children, disk.size,
2245
                                  dev_params)
2231 2246
  if not device.attached:
2232 2247
    return None
2233 2248
  return device
2234 2249

  
2235 2250

  
2236
def Assemble(dev_type, unique_id, children, size):
2251
def Assemble(disk, children):
2237 2252
  """Try to attach or assemble an existing device.
2238 2253

  
2239 2254
  This will attach to assemble the device, as needed, to bring it
2240 2255
  fully up. It must be safe to run on already-assembled devices.
2241 2256

  
2257
  @type disk: L{objects.Disk}
2258
  @param disk: the disk object to assemble
2259
  @type children: list of L{bdev.BlockDev}
2260
  @param children: the list of block devices that are children of the device
2261
                  represented by the disk parameter
2262

  
2242 2263
  """
2243
  if dev_type not in DEV_MAP:
2244
    raise errors.ProgrammerError("Invalid block device type '%s'" % dev_type)
2245
  device = DEV_MAP[dev_type](unique_id, children, size)
2264
  _VerifyDiskType(disk.dev_type)
2265
  dev_params = objects.FillDict(constants.DISK_LD_DEFAULTS[disk.dev_type],
2266
                                disk.params)
2267
  device = DEV_MAP[disk.dev_type](disk.physical_id, children, disk.size,
2268
                                  dev_params)
2246 2269
  device.Assemble()
2247 2270
  return device
2248 2271

  
2249 2272

  
2250
def Create(dev_type, unique_id, children, size):
2273
def Create(disk, children):
2251 2274
  """Create a device.
2252 2275

  
2276
  @type disk: L{objects.Disk}
2277
  @param disk: the disk object to create
2278
  @type children: list of L{bdev.BlockDev}
2279
  @param children: the list of block devices that are children of the device
2280
                  represented by the disk parameter
2281

  
2253 2282
  """
2254
  if dev_type not in DEV_MAP:
2255
    raise errors.ProgrammerError("Invalid block device type '%s'" % dev_type)
2256
  device = DEV_MAP[dev_type].Create(unique_id, children, size)
2283
  _VerifyDiskType(disk.dev_type)
2284
  dev_params = objects.FillDict(constants.DISK_LD_DEFAULTS[disk.dev_type],
2285
                                disk.params)
2286
  device = DEV_MAP[disk.dev_type].Create(disk.physical_id, children, disk.size,
2287
                                         dev_params)
2257 2288
  return device

Also available in: Unified diff