From f22ee02c6d6bd16f2179e71366ec641a7d234e96 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Fri, 11 Dec 2015 17:39:29 +0100 Subject: [PATCH] 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 --- daemon/graphdriver/devmapper/deviceset.go | 43 ++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index ef83d7da77..66d39ed14b 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -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 }