devmapper: store base device fs type

After the very first init of the graph `docker info` correctly shows the
base fs type under `Backing Filesystem`. This information isn't stored
anywhere. After a restart (w/o erasing `/var/lib/docker`) `docker info`
shows an empty string under `Backing Filesystem`.
This patch records the base fs type after the first run in the metadata
or, to fix old devices that don't have this info in the metadata, just
probe the fs type of the base device at graph startup.

Signed-off-by: Antonio Murdaca <runcom@redhat.com>
This commit is contained in:
Antonio Murdaca 2015-12-11 17:39:29 +01:00
parent 6c0c199103
commit f22ee02c6d

View file

@ -114,8 +114,9 @@ type DeviceSet struct {
overrideUdevSyncCheck bool
deferredRemove bool // use deferred removal
deferredDelete bool // use deferred deletion
BaseDeviceUUID string //save UUID of base device
nrDeletedDevices uint //number of deleted devices
BaseDeviceUUID string // save UUID of base device
BaseDeviceFilesystem string // save filesystem of base device
nrDeletedDevices uint // number of deleted devices
deletionWorkerTicker *time.Ticker
uidMaps []idtools.IDMap
gidMaps []idtools.IDMap
@ -587,6 +588,9 @@ func (devices *DeviceSet) createFilesystem(info *devInfo) (err error) {
if devices.filesystem == "" {
devices.filesystem = determineDefaultFS()
}
if err := devices.saveBaseDeviceFilesystem(devices.filesystem); err != nil {
return err
}
logrus.Infof("devmapper: Creating filesystem %s on device %s", devices.filesystem, info.Name())
defer func() {
@ -894,7 +898,7 @@ func (devices *DeviceSet) getBaseDeviceSize() uint64 {
}
func (devices *DeviceSet) getBaseDeviceFS() string {
return devices.filesystem
return devices.BaseDeviceFilesystem
}
func (devices *DeviceSet) verifyBaseDeviceUUIDFS(baseInfo *devInfo) error {
@ -904,7 +908,6 @@ func (devices *DeviceSet) verifyBaseDeviceUUIDFS(baseInfo *devInfo) error {
if err := devices.activateDeviceIfNeeded(baseInfo, false); err != nil {
return err
}
defer devices.deactivateDevice(baseInfo)
uuid, err := getDeviceUUID(baseInfo.DevName())
@ -916,23 +919,31 @@ func (devices *DeviceSet) verifyBaseDeviceUUIDFS(baseInfo *devInfo) error {
return fmt.Errorf("devmapper: Current Base Device UUID:%s does not match with stored UUID:%s. Possibly using a different thin pool than last invocation", uuid, devices.BaseDeviceUUID)
}
// If user specified a filesystem using dm.fs option and current
// file system of base image is not same, warn user that dm.fs
// will be ignored.
if devices.filesystem != "" {
fs, err := ProbeFsType(baseInfo.DevName())
if devices.BaseDeviceFilesystem == "" {
fsType, err := ProbeFsType(baseInfo.DevName())
if err != nil {
return err
}
if fs != devices.filesystem {
logrus.Warnf("devmapper: Base device already exists and has filesystem %s on it. User specified filesystem %s will be ignored.", fs, devices.filesystem)
devices.filesystem = fs
if err := devices.saveBaseDeviceFilesystem(fsType); err != nil {
return err
}
}
// If user specified a filesystem using dm.fs option and current
// file system of base image is not same, warn user that dm.fs
// will be ignored.
if devices.BaseDeviceFilesystem != devices.filesystem {
logrus.Warnf("devmapper: Base device already exists and has filesystem %s on it. User specified filesystem %s will be ignored.", devices.BaseDeviceFilesystem, devices.filesystem)
devices.filesystem = devices.BaseDeviceFilesystem
}
return nil
}
func (devices *DeviceSet) saveBaseDeviceFilesystem(fs string) error {
devices.BaseDeviceFilesystem = fs
return devices.saveDeviceSetMetaData()
}
func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *devInfo) error {
devices.Lock()
defer devices.Unlock()
@ -940,7 +951,6 @@ func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *devInfo) error {
if err := devices.activateDeviceIfNeeded(baseInfo, false); err != nil {
return err
}
defer devices.deactivateDevice(baseInfo)
uuid, err := getDeviceUUID(baseInfo.DevName())
@ -949,8 +959,7 @@ func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *devInfo) error {
}
devices.BaseDeviceUUID = uuid
devices.saveDeviceSetMetaData()
return nil
return devices.saveDeviceSetMetaData()
}
func (devices *DeviceSet) createBaseImage() error {
@ -1058,10 +1067,12 @@ func (devices *DeviceSet) setupBaseImage() error {
if err := devices.setupVerifyBaseImageUUIDFS(oldInfo); err != nil {
return err
}
if devices.baseFsSize != defaultBaseFsSize && devices.baseFsSize != devices.getBaseDeviceSize() {
logrus.Warnf("devmapper: Base device is already initialized to size %s, new value of base device size %s will not take effect",
units.HumanSize(float64(devices.getBaseDeviceSize())), units.HumanSize(float64(devices.baseFsSize)))
}
return nil
}