xref: /aosp_15_r20/system/vold/model/VolumeBase.cpp (revision f40fafd4c6c2594924d919feffc1a1fd6e3b30f3)
1*f40fafd4SAndroid Build Coastguard Worker /*
2*f40fafd4SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*f40fafd4SAndroid Build Coastguard Worker  *
4*f40fafd4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*f40fafd4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*f40fafd4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*f40fafd4SAndroid Build Coastguard Worker  *
8*f40fafd4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*f40fafd4SAndroid Build Coastguard Worker  *
10*f40fafd4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*f40fafd4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*f40fafd4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f40fafd4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*f40fafd4SAndroid Build Coastguard Worker  * limitations under the License.
15*f40fafd4SAndroid Build Coastguard Worker  */
16*f40fafd4SAndroid Build Coastguard Worker 
17*f40fafd4SAndroid Build Coastguard Worker #include "VolumeBase.h"
18*f40fafd4SAndroid Build Coastguard Worker #include "Utils.h"
19*f40fafd4SAndroid Build Coastguard Worker #include "VolumeManager.h"
20*f40fafd4SAndroid Build Coastguard Worker 
21*f40fafd4SAndroid Build Coastguard Worker #include <android-base/logging.h>
22*f40fafd4SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
23*f40fafd4SAndroid Build Coastguard Worker 
24*f40fafd4SAndroid Build Coastguard Worker #include <fcntl.h>
25*f40fafd4SAndroid Build Coastguard Worker #include <stdlib.h>
26*f40fafd4SAndroid Build Coastguard Worker #include <sys/mount.h>
27*f40fafd4SAndroid Build Coastguard Worker #include <sys/stat.h>
28*f40fafd4SAndroid Build Coastguard Worker #include <sys/types.h>
29*f40fafd4SAndroid Build Coastguard Worker 
30*f40fafd4SAndroid Build Coastguard Worker using android::base::StringPrintf;
31*f40fafd4SAndroid Build Coastguard Worker 
32*f40fafd4SAndroid Build Coastguard Worker namespace android {
33*f40fafd4SAndroid Build Coastguard Worker namespace vold {
34*f40fafd4SAndroid Build Coastguard Worker 
VolumeBase(Type type)35*f40fafd4SAndroid Build Coastguard Worker VolumeBase::VolumeBase(Type type)
36*f40fafd4SAndroid Build Coastguard Worker     : mType(type),
37*f40fafd4SAndroid Build Coastguard Worker       mMountFlags(0),
38*f40fafd4SAndroid Build Coastguard Worker       mMountUserId(USER_UNKNOWN),
39*f40fafd4SAndroid Build Coastguard Worker       mCreated(false),
40*f40fafd4SAndroid Build Coastguard Worker       mState(State::kUnmounted),
41*f40fafd4SAndroid Build Coastguard Worker       mSilent(false) {}
42*f40fafd4SAndroid Build Coastguard Worker 
~VolumeBase()43*f40fafd4SAndroid Build Coastguard Worker VolumeBase::~VolumeBase() {
44*f40fafd4SAndroid Build Coastguard Worker     CHECK(!mCreated);
45*f40fafd4SAndroid Build Coastguard Worker }
46*f40fafd4SAndroid Build Coastguard Worker 
setState(State state)47*f40fafd4SAndroid Build Coastguard Worker void VolumeBase::setState(State state) {
48*f40fafd4SAndroid Build Coastguard Worker     mState = state;
49*f40fafd4SAndroid Build Coastguard Worker 
50*f40fafd4SAndroid Build Coastguard Worker     auto listener = getListener();
51*f40fafd4SAndroid Build Coastguard Worker     if (listener) {
52*f40fafd4SAndroid Build Coastguard Worker         listener->onVolumeStateChanged(getId(), static_cast<int32_t>(mState),
53*f40fafd4SAndroid Build Coastguard Worker                                        static_cast<int32_t>(mMountUserId));
54*f40fafd4SAndroid Build Coastguard Worker     }
55*f40fafd4SAndroid Build Coastguard Worker }
56*f40fafd4SAndroid Build Coastguard Worker 
setDiskId(const std::string & diskId)57*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setDiskId(const std::string& diskId) {
58*f40fafd4SAndroid Build Coastguard Worker     if (mCreated) {
59*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " diskId change requires destroyed";
60*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
61*f40fafd4SAndroid Build Coastguard Worker     }
62*f40fafd4SAndroid Build Coastguard Worker 
63*f40fafd4SAndroid Build Coastguard Worker     mDiskId = diskId;
64*f40fafd4SAndroid Build Coastguard Worker     return OK;
65*f40fafd4SAndroid Build Coastguard Worker }
66*f40fafd4SAndroid Build Coastguard Worker 
setPartGuid(const std::string & partGuid)67*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setPartGuid(const std::string& partGuid) {
68*f40fafd4SAndroid Build Coastguard Worker     if (mCreated) {
69*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " partGuid change requires destroyed";
70*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
71*f40fafd4SAndroid Build Coastguard Worker     }
72*f40fafd4SAndroid Build Coastguard Worker 
73*f40fafd4SAndroid Build Coastguard Worker     mPartGuid = partGuid;
74*f40fafd4SAndroid Build Coastguard Worker     return OK;
75*f40fafd4SAndroid Build Coastguard Worker }
76*f40fafd4SAndroid Build Coastguard Worker 
setMountFlags(int mountFlags)77*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setMountFlags(int mountFlags) {
78*f40fafd4SAndroid Build Coastguard Worker     if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
79*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " flags change requires state unmounted or unmountable";
80*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
81*f40fafd4SAndroid Build Coastguard Worker     }
82*f40fafd4SAndroid Build Coastguard Worker 
83*f40fafd4SAndroid Build Coastguard Worker     mMountFlags = mountFlags;
84*f40fafd4SAndroid Build Coastguard Worker     return OK;
85*f40fafd4SAndroid Build Coastguard Worker }
86*f40fafd4SAndroid Build Coastguard Worker 
setMountUserId(userid_t mountUserId)87*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setMountUserId(userid_t mountUserId) {
88*f40fafd4SAndroid Build Coastguard Worker     if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
89*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " user change requires state unmounted or unmountable";
90*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
91*f40fafd4SAndroid Build Coastguard Worker     }
92*f40fafd4SAndroid Build Coastguard Worker 
93*f40fafd4SAndroid Build Coastguard Worker     mMountUserId = mountUserId;
94*f40fafd4SAndroid Build Coastguard Worker     return OK;
95*f40fafd4SAndroid Build Coastguard Worker }
96*f40fafd4SAndroid Build Coastguard Worker 
setSilent(bool silent)97*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setSilent(bool silent) {
98*f40fafd4SAndroid Build Coastguard Worker     if (mCreated) {
99*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " silence change requires destroyed";
100*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
101*f40fafd4SAndroid Build Coastguard Worker     }
102*f40fafd4SAndroid Build Coastguard Worker 
103*f40fafd4SAndroid Build Coastguard Worker     mSilent = silent;
104*f40fafd4SAndroid Build Coastguard Worker     return OK;
105*f40fafd4SAndroid Build Coastguard Worker }
106*f40fafd4SAndroid Build Coastguard Worker 
setId(const std::string & id)107*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setId(const std::string& id) {
108*f40fafd4SAndroid Build Coastguard Worker     if (mCreated) {
109*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " id change requires not created";
110*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
111*f40fafd4SAndroid Build Coastguard Worker     }
112*f40fafd4SAndroid Build Coastguard Worker 
113*f40fafd4SAndroid Build Coastguard Worker     mId = id;
114*f40fafd4SAndroid Build Coastguard Worker     return OK;
115*f40fafd4SAndroid Build Coastguard Worker }
116*f40fafd4SAndroid Build Coastguard Worker 
setPath(const std::string & path)117*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setPath(const std::string& path) {
118*f40fafd4SAndroid Build Coastguard Worker     if (mState != State::kChecking) {
119*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " path change requires state checking";
120*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
121*f40fafd4SAndroid Build Coastguard Worker     }
122*f40fafd4SAndroid Build Coastguard Worker 
123*f40fafd4SAndroid Build Coastguard Worker     mPath = path;
124*f40fafd4SAndroid Build Coastguard Worker 
125*f40fafd4SAndroid Build Coastguard Worker     auto listener = getListener();
126*f40fafd4SAndroid Build Coastguard Worker     if (listener) listener->onVolumePathChanged(getId(), mPath);
127*f40fafd4SAndroid Build Coastguard Worker 
128*f40fafd4SAndroid Build Coastguard Worker     return OK;
129*f40fafd4SAndroid Build Coastguard Worker }
130*f40fafd4SAndroid Build Coastguard Worker 
setInternalPath(const std::string & internalPath)131*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setInternalPath(const std::string& internalPath) {
132*f40fafd4SAndroid Build Coastguard Worker     if (mState != State::kChecking) {
133*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " internal path change requires state checking";
134*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
135*f40fafd4SAndroid Build Coastguard Worker     }
136*f40fafd4SAndroid Build Coastguard Worker 
137*f40fafd4SAndroid Build Coastguard Worker     mInternalPath = internalPath;
138*f40fafd4SAndroid Build Coastguard Worker 
139*f40fafd4SAndroid Build Coastguard Worker     auto listener = getListener();
140*f40fafd4SAndroid Build Coastguard Worker     if (listener) {
141*f40fafd4SAndroid Build Coastguard Worker         listener->onVolumeInternalPathChanged(getId(), mInternalPath);
142*f40fafd4SAndroid Build Coastguard Worker     }
143*f40fafd4SAndroid Build Coastguard Worker 
144*f40fafd4SAndroid Build Coastguard Worker     return OK;
145*f40fafd4SAndroid Build Coastguard Worker }
146*f40fafd4SAndroid Build Coastguard Worker 
setMountCallback(const android::sp<android::os::IVoldMountCallback> & callback)147*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::setMountCallback(
148*f40fafd4SAndroid Build Coastguard Worker         const android::sp<android::os::IVoldMountCallback>& callback) {
149*f40fafd4SAndroid Build Coastguard Worker     mMountCallback = callback;
150*f40fafd4SAndroid Build Coastguard Worker     return OK;
151*f40fafd4SAndroid Build Coastguard Worker }
152*f40fafd4SAndroid Build Coastguard Worker 
getMountCallback() const153*f40fafd4SAndroid Build Coastguard Worker sp<android::os::IVoldMountCallback> VolumeBase::getMountCallback() const {
154*f40fafd4SAndroid Build Coastguard Worker     return mMountCallback;
155*f40fafd4SAndroid Build Coastguard Worker }
156*f40fafd4SAndroid Build Coastguard Worker 
getListener() const157*f40fafd4SAndroid Build Coastguard Worker android::sp<android::os::IVoldListener> VolumeBase::getListener() const {
158*f40fafd4SAndroid Build Coastguard Worker     if (mSilent) {
159*f40fafd4SAndroid Build Coastguard Worker         return nullptr;
160*f40fafd4SAndroid Build Coastguard Worker     } else {
161*f40fafd4SAndroid Build Coastguard Worker         return VolumeManager::Instance()->getListener();
162*f40fafd4SAndroid Build Coastguard Worker     }
163*f40fafd4SAndroid Build Coastguard Worker }
164*f40fafd4SAndroid Build Coastguard Worker 
addVolume(const std::shared_ptr<VolumeBase> & volume)165*f40fafd4SAndroid Build Coastguard Worker void VolumeBase::addVolume(const std::shared_ptr<VolumeBase>& volume) {
166*f40fafd4SAndroid Build Coastguard Worker     mVolumes.push_back(volume);
167*f40fafd4SAndroid Build Coastguard Worker }
168*f40fafd4SAndroid Build Coastguard Worker 
removeVolume(const std::shared_ptr<VolumeBase> & volume)169*f40fafd4SAndroid Build Coastguard Worker void VolumeBase::removeVolume(const std::shared_ptr<VolumeBase>& volume) {
170*f40fafd4SAndroid Build Coastguard Worker     mVolumes.remove(volume);
171*f40fafd4SAndroid Build Coastguard Worker }
172*f40fafd4SAndroid Build Coastguard Worker 
findVolume(const std::string & id)173*f40fafd4SAndroid Build Coastguard Worker std::shared_ptr<VolumeBase> VolumeBase::findVolume(const std::string& id) {
174*f40fafd4SAndroid Build Coastguard Worker     for (auto vol : mVolumes) {
175*f40fafd4SAndroid Build Coastguard Worker         if (vol->getId() == id) {
176*f40fafd4SAndroid Build Coastguard Worker             return vol;
177*f40fafd4SAndroid Build Coastguard Worker         }
178*f40fafd4SAndroid Build Coastguard Worker     }
179*f40fafd4SAndroid Build Coastguard Worker     return nullptr;
180*f40fafd4SAndroid Build Coastguard Worker }
181*f40fafd4SAndroid Build Coastguard Worker 
create()182*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::create() {
183*f40fafd4SAndroid Build Coastguard Worker     CHECK(!mCreated);
184*f40fafd4SAndroid Build Coastguard Worker 
185*f40fafd4SAndroid Build Coastguard Worker     mCreated = true;
186*f40fafd4SAndroid Build Coastguard Worker     status_t res = doCreate();
187*f40fafd4SAndroid Build Coastguard Worker 
188*f40fafd4SAndroid Build Coastguard Worker     auto listener = getListener();
189*f40fafd4SAndroid Build Coastguard Worker     if (listener) {
190*f40fafd4SAndroid Build Coastguard Worker         listener->onVolumeCreated(getId(), static_cast<int32_t>(mType), mDiskId, mPartGuid,
191*f40fafd4SAndroid Build Coastguard Worker                                   mMountUserId);
192*f40fafd4SAndroid Build Coastguard Worker     }
193*f40fafd4SAndroid Build Coastguard Worker 
194*f40fafd4SAndroid Build Coastguard Worker     setState(State::kUnmounted);
195*f40fafd4SAndroid Build Coastguard Worker     return res;
196*f40fafd4SAndroid Build Coastguard Worker }
197*f40fafd4SAndroid Build Coastguard Worker 
doCreate()198*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::doCreate() {
199*f40fafd4SAndroid Build Coastguard Worker     return OK;
200*f40fafd4SAndroid Build Coastguard Worker }
201*f40fafd4SAndroid Build Coastguard Worker 
destroy()202*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::destroy() {
203*f40fafd4SAndroid Build Coastguard Worker     CHECK(mCreated);
204*f40fafd4SAndroid Build Coastguard Worker 
205*f40fafd4SAndroid Build Coastguard Worker     if (mState == State::kMounted) {
206*f40fafd4SAndroid Build Coastguard Worker         unmount();
207*f40fafd4SAndroid Build Coastguard Worker         setState(State::kBadRemoval);
208*f40fafd4SAndroid Build Coastguard Worker     } else {
209*f40fafd4SAndroid Build Coastguard Worker         setState(State::kRemoved);
210*f40fafd4SAndroid Build Coastguard Worker     }
211*f40fafd4SAndroid Build Coastguard Worker 
212*f40fafd4SAndroid Build Coastguard Worker     auto listener = getListener();
213*f40fafd4SAndroid Build Coastguard Worker     if (listener) {
214*f40fafd4SAndroid Build Coastguard Worker         listener->onVolumeDestroyed(getId());
215*f40fafd4SAndroid Build Coastguard Worker     }
216*f40fafd4SAndroid Build Coastguard Worker 
217*f40fafd4SAndroid Build Coastguard Worker     status_t res = doDestroy();
218*f40fafd4SAndroid Build Coastguard Worker     mCreated = false;
219*f40fafd4SAndroid Build Coastguard Worker     return res;
220*f40fafd4SAndroid Build Coastguard Worker }
221*f40fafd4SAndroid Build Coastguard Worker 
doDestroy()222*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::doDestroy() {
223*f40fafd4SAndroid Build Coastguard Worker     return OK;
224*f40fafd4SAndroid Build Coastguard Worker }
225*f40fafd4SAndroid Build Coastguard Worker 
mount()226*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::mount() {
227*f40fafd4SAndroid Build Coastguard Worker     if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
228*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " mount requires state unmounted or unmountable";
229*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
230*f40fafd4SAndroid Build Coastguard Worker     }
231*f40fafd4SAndroid Build Coastguard Worker 
232*f40fafd4SAndroid Build Coastguard Worker     setState(State::kChecking);
233*f40fafd4SAndroid Build Coastguard Worker     status_t res = doMount();
234*f40fafd4SAndroid Build Coastguard Worker     setState(res == OK ? State::kMounted : State::kUnmountable);
235*f40fafd4SAndroid Build Coastguard Worker 
236*f40fafd4SAndroid Build Coastguard Worker     if (res == OK) {
237*f40fafd4SAndroid Build Coastguard Worker         doPostMount();
238*f40fafd4SAndroid Build Coastguard Worker     }
239*f40fafd4SAndroid Build Coastguard Worker     return res;
240*f40fafd4SAndroid Build Coastguard Worker }
241*f40fafd4SAndroid Build Coastguard Worker 
doPostMount()242*f40fafd4SAndroid Build Coastguard Worker void VolumeBase::doPostMount() {}
243*f40fafd4SAndroid Build Coastguard Worker 
unmount()244*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::unmount() {
245*f40fafd4SAndroid Build Coastguard Worker     if (mState != State::kMounted) {
246*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " unmount requires state mounted";
247*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
248*f40fafd4SAndroid Build Coastguard Worker     }
249*f40fafd4SAndroid Build Coastguard Worker 
250*f40fafd4SAndroid Build Coastguard Worker     setState(State::kEjecting);
251*f40fafd4SAndroid Build Coastguard Worker     for (const auto& vol : mVolumes) {
252*f40fafd4SAndroid Build Coastguard Worker         if (vol->destroy()) {
253*f40fafd4SAndroid Build Coastguard Worker             LOG(WARNING) << getId() << " failed to destroy " << vol->getId() << " stacked above";
254*f40fafd4SAndroid Build Coastguard Worker         }
255*f40fafd4SAndroid Build Coastguard Worker     }
256*f40fafd4SAndroid Build Coastguard Worker     mVolumes.clear();
257*f40fafd4SAndroid Build Coastguard Worker 
258*f40fafd4SAndroid Build Coastguard Worker     status_t res = doUnmount();
259*f40fafd4SAndroid Build Coastguard Worker     setState(State::kUnmounted);
260*f40fafd4SAndroid Build Coastguard Worker     return res;
261*f40fafd4SAndroid Build Coastguard Worker }
262*f40fafd4SAndroid Build Coastguard Worker 
format(const std::string & fsType)263*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::format(const std::string& fsType) {
264*f40fafd4SAndroid Build Coastguard Worker     if (mState == State::kMounted) {
265*f40fafd4SAndroid Build Coastguard Worker         unmount();
266*f40fafd4SAndroid Build Coastguard Worker     }
267*f40fafd4SAndroid Build Coastguard Worker 
268*f40fafd4SAndroid Build Coastguard Worker     if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
269*f40fafd4SAndroid Build Coastguard Worker         LOG(WARNING) << getId() << " format requires state unmounted or unmountable";
270*f40fafd4SAndroid Build Coastguard Worker         return -EBUSY;
271*f40fafd4SAndroid Build Coastguard Worker     }
272*f40fafd4SAndroid Build Coastguard Worker 
273*f40fafd4SAndroid Build Coastguard Worker     setState(State::kFormatting);
274*f40fafd4SAndroid Build Coastguard Worker     status_t res = doFormat(fsType);
275*f40fafd4SAndroid Build Coastguard Worker     setState(State::kUnmounted);
276*f40fafd4SAndroid Build Coastguard Worker     return res;
277*f40fafd4SAndroid Build Coastguard Worker }
278*f40fafd4SAndroid Build Coastguard Worker 
doFormat(const std::string & fsType)279*f40fafd4SAndroid Build Coastguard Worker status_t VolumeBase::doFormat(const std::string& fsType) {
280*f40fafd4SAndroid Build Coastguard Worker     return -ENOTSUP;
281*f40fafd4SAndroid Build Coastguard Worker }
282*f40fafd4SAndroid Build Coastguard Worker 
getRootPath() const283*f40fafd4SAndroid Build Coastguard Worker std::string VolumeBase::getRootPath() const {
284*f40fafd4SAndroid Build Coastguard Worker     // Usually the same as the internal path, except for emulated volumes.
285*f40fafd4SAndroid Build Coastguard Worker     return getInternalPath();
286*f40fafd4SAndroid Build Coastguard Worker }
287*f40fafd4SAndroid Build Coastguard Worker 
operator <<(std::ostream & stream) const288*f40fafd4SAndroid Build Coastguard Worker std::ostream& VolumeBase::operator<<(std::ostream& stream) const {
289*f40fafd4SAndroid Build Coastguard Worker     return stream << " VolumeBase{id=" << mId << ",mountFlags=" << mMountFlags
290*f40fafd4SAndroid Build Coastguard Worker                   << ",mountUserId=" << mMountUserId << "}";
291*f40fafd4SAndroid Build Coastguard Worker }
292*f40fafd4SAndroid Build Coastguard Worker 
293*f40fafd4SAndroid Build Coastguard Worker }  // namespace vold
294*f40fafd4SAndroid Build Coastguard Worker }  // namespace android
295