1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <stdio.h> 18 #include <stdlib.h> 19 #include <fcntl.h> 20 #include <unistd.h> 21 #include <errno.h> 22 #include <string.h> 23 #include <dirent.h> 24 #include <errno.h> 25 #include <fcntl.h> 26 27 #include <sys/types.h> 28 #include <sys/stat.h> 29 #include <sys/types.h> 30 #include <sys/mman.h> 31 #include <sys/mount.h> 32 #include <sys/wait.h> 33 34 #include <linux/kdev_t.h> 35 36 #define LOG_TAG "Vold" 37 38 #include <cutils/log.h> 39 #include <cutils/properties.h> 40 41 #include <logwrap/logwrap.h> 42 43 #include "Ext4.h" 44 #include "VoldUtil.h" 45 46 #define MKEXT4FS_PATH "/system/bin/make_ext4fs"; 47 48 int Ext4::doMount(const char *fsPath, const char *mountPoint, bool ro, bool remount, 49 bool executable) { 50 int rc; 51 unsigned long flags; 52 53 flags = MS_NOATIME | MS_NODEV | MS_NOSUID | MS_DIRSYNC; 54 55 flags |= (executable ? 0 : MS_NOEXEC); 56 flags |= (ro ? MS_RDONLY : 0); 57 flags |= (remount ? MS_REMOUNT : 0); 58 59 rc = mount(fsPath, mountPoint, "ext4", flags, NULL); 60 61 if (rc && errno == EROFS) { 62 SLOGE("%s appears to be a read only filesystem - retrying mount RO", fsPath); 63 flags |= MS_RDONLY; 64 rc = mount(fsPath, mountPoint, "ext4", flags, NULL); 65 } 66 67 return rc; 68 } 69 70 int Ext4::format(const char *fsPath, const char *mountpoint) { 71 int fd; 72 const char *args[5]; 73 int rc; 74 int status; 75 76 args[0] = MKEXT4FS_PATH; 77 args[1] = "-J"; 78 args[2] = "-a"; 79 args[3] = mountpoint; 80 args[4] = fsPath; 81 rc = android_fork_execvp(ARRAY_SIZE(args), (char **)args, &status, false, 82 true); 83 if (rc != 0) { 84 SLOGE("Filesystem (ext4) format failed due to logwrap error"); 85 errno = EIO; 86 return -1; 87 } 88 89 if (!WIFEXITED(status)) { 90 SLOGE("Filesystem (ext4) format did not exit properly"); 91 errno = EIO; 92 return -1; 93 } 94 95 status = WEXITSTATUS(status); 96 97 if (status == 0) { 98 SLOGI("Filesystem (ext4) formatted OK"); 99 return 0; 100 } else { 101 SLOGE("Format (ext4) failed (unknown exit code %d)", status); 102 errno = EIO; 103 return -1; 104 } 105 return 0; 106 } 107