When formatting volumes, pass along fsType string which can be "auto" to let the volume select the best choice. For now, private volumes assume that MMC devices (like SD cards) are best off using f2fs when both kernel support and tools are present, otherwise fall back to ext4. Use blkid when mounting to pick the right set of tools. Move filesystem utility methods into namespaces and place in separate directory to be more organized. Bug: 20275581 Change-Id: Id5f82d8672dda2e9f68c35b075f28232b0b55ed4gugelfrei
parent
d0b4295ccc
commit
d0640f6358
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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_EXT4_H
|
||||
#define ANDROID_VOLD_EXT4_H
|
||||
|
||||
#include <utils/Errors.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace android {
|
||||
namespace vold {
|
||||
namespace ext4 {
|
||||
|
||||
bool IsSupported();
|
||||
|
||||
status_t Check(const std::string& source, const std::string& target);
|
||||
status_t Mount(const std::string& source, const std::string& target, bool ro,
|
||||
bool remount, bool executable);
|
||||
status_t Format(const std::string& source, unsigned int numSectors,
|
||||
const std::string& target);
|
||||
status_t Resize(const std::string& source, unsigned int numSectors);
|
||||
|
||||
} // namespace ext4
|
||||
} // namespace vold
|
||||
} // namespace android
|
||||
|
||||
#endif
|
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "F2fs.h"
|
||||
#include "Utils.h"
|
||||
|
||||
#include <base/logging.h>
|
||||
#include <base/stringprintf.h>
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include <sys/mount.h>
|
||||
|
||||
using android::base::StringPrintf;
|
||||
|
||||
namespace android {
|
||||
namespace vold {
|
||||
namespace f2fs {
|
||||
|
||||
static const char* kMkfsPath = "/system/bin/make_f2fs";
|
||||
static const char* kFsckPath = "/system/bin/fsck.f2fs";
|
||||
|
||||
bool IsSupported() {
|
||||
return access(kMkfsPath, X_OK) == 0
|
||||
&& access(kFsckPath, X_OK) == 0
|
||||
&& IsFilesystemSupported("f2fs");
|
||||
}
|
||||
|
||||
status_t Check(const std::string& source) {
|
||||
std::vector<std::string> cmd;
|
||||
cmd.push_back(kFsckPath);
|
||||
cmd.push_back("-f");
|
||||
cmd.push_back(source);
|
||||
|
||||
// f2fs devices are currently always trusted
|
||||
return ForkExecvp(cmd, sFsckContext);
|
||||
}
|
||||
|
||||
status_t Mount(const std::string& source, const std::string& target) {
|
||||
const char* c_source = source.c_str();
|
||||
const char* c_target = target.c_str();
|
||||
unsigned long flags = MS_NOATIME | MS_NODEV | MS_NOSUID | MS_DIRSYNC;
|
||||
|
||||
int res = mount(c_source, c_target, "f2fs", flags, NULL);
|
||||
if (res != 0) {
|
||||
PLOG(ERROR) << "Failed to mount " << source;
|
||||
if (errno == EROFS) {
|
||||
res = mount(c_source, c_target, "f2fs", flags | MS_RDONLY, NULL);
|
||||
if (res != 0) {
|
||||
PLOG(ERROR) << "Failed to mount read-only " << source;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
status_t Format(const std::string& source) {
|
||||
std::vector<std::string> cmd;
|
||||
cmd.push_back(kMkfsPath);
|
||||
cmd.push_back(source);
|
||||
|
||||
return ForkExecvp(cmd);
|
||||
}
|
||||
|
||||
} // namespace f2fs
|
||||
} // namespace vold
|
||||
} // namespace android
|
Loading…
Reference in new issue