1ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall/* 2ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * Copyright (C) 2014 The Android Open Source Project 3ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * All rights reserved. 4ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * 5ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * Redistribution and use in source and binary forms, with or without 6ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * modification, are permitted provided that the following conditions 7ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * are met: 8ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * * Redistributions of source code must retain the above copyright 9ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * notice, this list of conditions and the following disclaimer. 10ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * * Redistributions in binary form must reproduce the above copyright 11ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * notice, this list of conditions and the following disclaimer in 12ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * the documentation and/or other materials provided with the 13ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * distribution. 14ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * 15ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * SUCH DAMAGE. 27ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall */ 28ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 29ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define _LARGEFILE64_SOURCE 30ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 31879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include <assert.h> 32ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <asm/types.h> 33879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include <dlfcn.h> 34ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <errno.h> 35879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include <fcntl.h> 36ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <linux/fs.h> 37ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <stdio.h> 38ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <stdlib.h> 39ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <string.h> /* memset() */ 40ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <sys/param.h> 41ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <sys/stat.h> 42ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <sys/types.h> 43879785074ca93e13896ce364a45eb5cc17081c4aDan Albert#include <unistd.h> 44ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 45ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <f2fs_fs.h> 46ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <f2fs_format_utils.h> 47ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 48ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <sparse/sparse.h> 49ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 50ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstruct selabel_handle; 51ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 52ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include "make_f2fs.h" 53ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 54ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#ifdef USE_MINGW 55ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 56ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <winsock2.h> 57ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 58ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall/* These match the Linux definitions of these flags. 59ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall L_xx is defined to avoid conflicting with the win32 versions. 60ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall*/ 61ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define L_S_IRUSR 00400 62ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define L_S_IWUSR 00200 63ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define L_S_IXUSR 00100 64ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IRWXU (L_S_IRUSR | L_S_IWUSR | L_S_IXUSR) 65ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IRGRP 00040 66ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IWGRP 00020 67ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IXGRP 00010 68ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) 69ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IROTH 00004 70ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IWOTH 00002 71ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IXOTH 00001 72ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) 73ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_ISUID 0004000 74ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_ISGID 0002000 75ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define S_ISVTX 0001000 76ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 77ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#else 78ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 79ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <selinux/selinux.h> 80ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#include <selinux/label.h> 81ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 82ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#define O_BINARY 0 83ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 84ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall#endif 85ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 86ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstruct f2fs_configuration config; 87ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstruct sparse_file *f2fs_sparse_file; 88ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 89ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstruct buf_item { 90ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall void *buf; 91ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall size_t len; 92ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall struct buf_item *next; 93ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall}; 94ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 95ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstruct buf_item *buf_list; 96ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 97ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstatic int dev_write_fd(void *buf, __u64 offset, size_t len) 98ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 99ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall if (lseek64(config.fd, (off64_t)offset, SEEK_SET) < 0) 100ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return -1; 101879785074ca93e13896ce364a45eb5cc17081c4aDan Albert ssize_t written = write(config.fd, buf, len); 102879785074ca93e13896ce364a45eb5cc17081c4aDan Albert if (written == -1) 103879785074ca93e13896ce364a45eb5cc17081c4aDan Albert return -1; 104879785074ca93e13896ce364a45eb5cc17081c4aDan Albert if ((size_t)written != len) 105ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return -1; 106ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 107ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 108ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 109ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallvoid flush_sparse_buffs() 110ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 111ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall while (buf_list) { 112ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall struct buf_item *bi = buf_list; 113ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall buf_list = buf_list->next; 114ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall free(bi->buf); 115ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall free(bi); 116ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall } 117ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 118ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 119ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallstatic int dev_write_sparse(void *buf, __u64 byte_offset, size_t byte_len) 120ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 121ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall struct buf_item *bi = calloc(1, sizeof(struct buf_item)); 122ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 123ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall if (bi == NULL) { 124ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return -ENOMEM; 125ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall } 126ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall bi->buf = malloc(byte_len); 127ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall if (bi->buf == NULL) { 128ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall free(bi); 129ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return -ENOMEM; 130ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall } 131ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 132ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall bi->len = byte_len; 133ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall memcpy(bi->buf, buf, byte_len); 134ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall bi->next = buf_list; 135ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall buf_list = bi; 136ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 137ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall sparse_file_add_data(f2fs_sparse_file, bi->buf, byte_len, byte_offset/F2FS_BLKSIZE); 138ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 139ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 140ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 141aa378b28dfa25002bb20de9fd50f695c38d3084bJP Abgrallvoid f2fs_finalize_device(struct f2fs_configuration *c) 142ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 143ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 144ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 145ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallint f2fs_trim_device() 146ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 147ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 148ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 149ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 150ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall/* 151ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall * IO interfaces 152ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall */ 1539602ce28a0015c8c7411554358cb9023459e8ec7Mark Salyzynint dev_read_version(void *buf, __u64 offset, size_t len) 1549602ce28a0015c8c7411554358cb9023459e8ec7Mark Salyzyn{ 1559602ce28a0015c8c7411554358cb9023459e8ec7Mark Salyzyn return 0; 1569602ce28a0015c8c7411554358cb9023459e8ec7Mark Salyzyn} 1579602ce28a0015c8c7411554358cb9023459e8ec7Mark Salyzyn 158ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallint dev_read(void *buf, __u64 offset, size_t len) 159ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 160ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 161ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 162ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 163ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallint dev_write(void *buf, __u64 offset, size_t len) 164ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 165ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall if (config.fd >= 0) { 166ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return dev_write_fd(buf, offset, len); 167ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall } else { 168ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return dev_write_sparse(buf, offset, len); 169ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall } 170ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 171ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 172ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 173ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallint dev_fill(void *buf, __u64 offset, size_t len) 174ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 175ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall int ret; 176ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall if (config.fd >= 0) { 177ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return dev_write_fd(buf, offset, len); 178ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall } 179ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall // sparse file fills with zero by default. 180ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall // return sparse_file_add_fill(f2fs_sparse_file, ((__u8*)(bi->buf))[0], byte_len, byte_offset/F2FS_BLKSIZE); 181ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 182ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 183ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 184ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallint dev_read_block(void *buf, __u64 blk_addr) 185ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 186ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall assert(false); // Must not be invoked. 187ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 188ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 189ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 190ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrallint dev_read_blocks(void *buf, __u64 addr, __u32 nr_blks) 191ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall{ 192ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall assert(false); // Must not be invoked. 193ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall return 0; 194ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall} 195ebd6bcfd990ff42bc177c0e1a217c0d886a7f9d6JP Abgrall 196