5ec8658abc
When we're mounting a private volume, we create stacked emulated volumes on top of it. Due to the ordering there, we would broadcast the emulated volumes being created *before* the "mounted" status update. This in turn could cause us to try and mount these emulated volumes before the underlying private volume is really mounted. This is problematic in particular on devices that support a filesystem keyring, where we need to do some additional setup before the devices can be used. While we could modify StorageManagerService to delay the mount, a safer fix at this stage of the release is to just fix the ordering of these events. To achieve that, add a simple postMount() helper, that is called after a succesful mount. This allows us to setup the volume properly before trying to mount any stacked volumes. Bug: 151079464 Test: atest AdoptableHostTest Change-Id: I2cc4113d4d71d89aa629bb9c0fa9be441355c079
84 lines
2.5 KiB
C++
84 lines
2.5 KiB
C++
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_VOLD_PRIVATE_VOLUME_H
|
|
#define ANDROID_VOLD_PRIVATE_VOLUME_H
|
|
|
|
#include "VolumeBase.h"
|
|
|
|
#include <cutils/multiuser.h>
|
|
|
|
namespace android {
|
|
namespace vold {
|
|
|
|
/*
|
|
* Private storage provided by an encrypted partition.
|
|
*
|
|
* Given a raw block device, it knows how to wrap it in dm-crypt and
|
|
* format as ext4/f2fs. EmulatedVolume can be stacked above it.
|
|
*
|
|
* This volume is designed to behave much like the internal /data
|
|
* partition, both in layout and function. For example, apps and
|
|
* private app data can be safely stored on this volume because the
|
|
* keys are tightly tied to this device.
|
|
*/
|
|
class PrivateVolume : public VolumeBase {
|
|
public:
|
|
PrivateVolume(dev_t device, const KeyBuffer& keyRaw);
|
|
virtual ~PrivateVolume();
|
|
const std::string& getFsType() const { return mFsType; };
|
|
const std::string& getRawDevPath() const { return mRawDevPath; };
|
|
const std::string& getRawDmDevPath() const { return mDmDevPath; };
|
|
const std::string& getFsUuid() const { return mFsUuid; };
|
|
dev_t getRawDevice() const { return mRawDevice; };
|
|
|
|
protected:
|
|
status_t doCreate() override;
|
|
status_t doDestroy() override;
|
|
status_t doMount() override;
|
|
void doPostMount() override;
|
|
status_t doUnmount() override;
|
|
status_t doFormat(const std::string& fsType) override;
|
|
|
|
status_t readMetadata();
|
|
|
|
private:
|
|
/* Kernel device of raw, encrypted partition */
|
|
dev_t mRawDevice;
|
|
/* Path to raw, encrypted block device */
|
|
std::string mRawDevPath;
|
|
/* Path to decrypted block device */
|
|
std::string mDmDevPath;
|
|
/* Path where decrypted device is mounted */
|
|
std::string mPath;
|
|
|
|
/* Encryption key as raw bytes */
|
|
KeyBuffer mKeyRaw;
|
|
|
|
/* Filesystem type */
|
|
std::string mFsType;
|
|
/* Filesystem UUID */
|
|
std::string mFsUuid;
|
|
/* User-visible filesystem label */
|
|
std::string mFsLabel;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(PrivateVolume);
|
|
};
|
|
|
|
} // namespace vold
|
|
} // namespace android
|
|
|
|
#endif
|