f2fs_fs.h revision fef98ebdf3a7728017cb3d0ae4ffedc5405e531d
1036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/** 240b9f96587c191269a41b20bd2bd5000fc9db259Jaegeuk Kim * f2fs_fs.h 3036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * 4036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * http://www.samsung.com/ 6036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * 7036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * This program is free software; you can redistribute it and/or modify 8036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * it under the terms of the GNU General Public License version 2 as 9036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * published by the Free Software Foundation. 10036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 1140b9f96587c191269a41b20bd2bd5000fc9db259Jaegeuk Kim#ifndef __F2FS_FS_H__ 1240b9f96587c191269a41b20bd2bd5000fc9db259Jaegeuk Kim#define __F2FS_FS_H__ 13036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 14e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#include <inttypes.h> 15036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#include <linux/types.h> 16e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#include <sys/types.h> 17036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#include <endian.h> 18036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#include <byteswap.h> 19036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 20dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh#ifdef HAVE_CONFIG_H 21dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh#include <config.h> 22dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh#endif 23dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh 24036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#if __BYTE_ORDER == __LITTLE_ENDIAN 25036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le16_to_cpu(x) ((__u16)(x)) 26036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le32_to_cpu(x) ((__u32)(x)) 27036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le64_to_cpu(x) ((__u64)(x)) 28036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le16(x) ((__u16)(x)) 29036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le32(x) ((__u32)(x)) 30036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le64(x) ((__u64)(x)) 31036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#elif __BYTE_ORDER == __BIG_ENDIAN 32036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le16_to_cpu(x) bswap_16(x) 33036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le32_to_cpu(x) bswap_32(x) 34036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le64_to_cpu(x) bswap_64(x) 35036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le16(x) bswap_16(x) 36036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le32(x) bswap_32(x) 37036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le64(x) bswap_64(x) 38036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#endif 39036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 40e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim/* 41e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim * Debugging interfaces 42e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim */ 43e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define ASSERT_MSG(exp, fmt, ...) \ 44e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 45e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim if (!(exp)) { \ 46e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("\nAssertion failed!\n"); \ 47e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("[%s:%4d] " #exp, __func__, __LINE__); \ 48e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("\n --> "fmt, ##__VA_ARGS__); \ 49e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim exit(-1); \ 50e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 51e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 52e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 53e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define ASSERT(exp) \ 54e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 55e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim if (!(exp)) { \ 56e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("\nAssertion failed!\n"); \ 57e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("[%s:%4d] " #exp"\n", __func__, __LINE__);\ 58e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim exit(-1); \ 59e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 60e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 61e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 62e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define MSG(n, fmt, ...) \ 63e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 64e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim if (config.dbg_lv >= n) { \ 65e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf(fmt, ##__VA_ARGS__); \ 66e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 67e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 68e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 69e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DBG(n, fmt, ...) \ 70e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 71e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim if (config.dbg_lv >= n) { \ 72e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("[%s:%4d] " fmt, \ 73e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim __func__, __LINE__, ##__VA_ARGS__); \ 74e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 75e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 76e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 77e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim/* Display on console */ 78e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP(fmt, ptr, member) \ 79e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 80e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("%-30s" fmt, #member, ((ptr)->member)); \ 81e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 82e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 83e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP_u32(ptr, member) \ 84e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 85e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim assert(sizeof((ptr)->member) <= 4); \ 86e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("%-30s" "\t\t[0x%8x : %u]\n", \ 87e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim #member, ((ptr)->member), ((ptr)->member) ); \ 88e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 89e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 90e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP_u64(ptr, member) \ 91e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 92e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim assert(sizeof((ptr)->member) == 8); \ 93e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("%-30s" "\t\t[0x%8llx : %llu]\n", \ 94e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim #member, ((ptr)->member), ((ptr)->member) ); \ 95e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 96e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 97e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP_utf(ptr, member) \ 98e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 99e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf(#member "\t\t\t\t[%s]\n", ((ptr)->member) ); \ 100e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 101e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 102e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim/* Display to buffer */ 103e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define BUF_DISP_u32(buf, data, len, ptr, member) \ 104e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 105e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim assert(sizeof((ptr)->member) <= 4); \ 106e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim snprintf(buf, len, #member); \ 107e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim snprintf(data, len, "0x%x : %u", ((ptr)->member), ((ptr)->member)); \ 108e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 109e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 110e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define BUF_DISP_u64(buf, data, len, ptr, member) \ 111e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 112e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim assert(sizeof((ptr)->member) == 8); \ 113e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim snprintf(buf, len, #member); \ 114e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim snprintf(data, len, "0x%llx : %llu", ((ptr)->member), ((ptr)->member)); \ 115e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 116e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 117e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define BUF_DISP_utf(buf, data, len, ptr, member) \ 118e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 119e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim snprintf(buf, len, #member); \ 120e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } while (0); 121e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 122036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* these are defined in kernel */ 123036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define PAGE_SIZE 4096 124036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define PAGE_CACHE_SIZE 4096 125036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define BITS_PER_BYTE 8 1262784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */ 127036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 128036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* for mkfs */ 129036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define F2FS_MIN_VOLUME_SIZE 104857600 130036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define F2FS_NUMBER_OF_CHECKPOINT_PACK 2 131036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_SECTOR_SIZE 512 132036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_SECTORS_PER_BLOCK 8 133036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_BLOCKS_PER_SEGMENT 512 134036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_SEGMENTS_PER_SECTION 1 135036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 136e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimstruct f2fs_configuration { 1372784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t sector_size; 1382784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t reserved_segments; 1392784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t overprovision; 1402784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t cur_seg[6]; 1412784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t segs_per_sec; 1422784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t secs_per_zone; 1432784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t start_sector; 1442784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int64_t total_sectors; 1452784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t sectors_per_blk; 1462784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t blks_per_seg; 1479799d6364dc93e1fd259d812d4a50ed984a6456bMike Fleetwood char *vol_label; 1482784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim int heap; 1492784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim int32_t fd; 1502784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim char *device_name; 1512784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim char *extension_list; 152e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim int dbg_lv; 153fef98ebdf3a7728017cb3d0ae4ffedc5405e531dChangman Lee int trim; 154036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 155036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 156036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#ifdef CONFIG_64BIT 157036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define BITS_PER_LONG 64 158036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#else 159036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define BITS_PER_LONG 32 160036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#endif 161036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 1622784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define BIT_MASK(nr) (1 << (nr % BITS_PER_LONG)) 1632784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define BIT_WORD(nr) (nr / BITS_PER_LONG) 164036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 165036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 1662784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Copied from fs/f2fs/f2fs.h 167036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 1682784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NR_CURSEG_DATA_TYPE (3) 1692784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NR_CURSEG_NODE_TYPE (3) 1702784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NR_CURSEG_TYPE (NR_CURSEG_DATA_TYPE + NR_CURSEG_NODE_TYPE) 1712784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 1722784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimenum { 1732784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_HOT_DATA = 0, /* directory entry blocks */ 1742784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_WARM_DATA, /* data blocks */ 1752784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_COLD_DATA, /* multimedia or GCed data blocks */ 1762784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_HOT_NODE, /* direct node blocks of directory files */ 1772784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_WARM_NODE, /* direct node blocks of normal files */ 1782784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_COLD_NODE, /* indirect node blocks */ 1792784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim NO_CHECK_TYPE 1802784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim}; 1812784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 1822784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 1832784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Copied from fs/f2fs/segment.h 1842784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 1852784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GET_SUM_TYPE(footer) ((footer)->entry_type) 1862784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SET_SUM_TYPE(footer, type) ((footer)->entry_type = type) 1872784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 1882784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 1892784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Copied from include/linux/f2fs_sb.h 1902784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 1912784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_SUPER_OFFSET 1024 /* byte-size offset */ 1922784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_LOG_SECTOR_SIZE 9 /* 9 bits for 512 byte */ 1932784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_LOG_SECTORS_PER_BLOCK 3 /* 4KB: F2FS_BLKSIZE */ 1942784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_BLKSIZE 4096 /* support only 4KB block */ 1952784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_MAX_EXTENSION 64 /* # of extension entries */ 1962784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 1972784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NULL_ADDR 0x0U 1982784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NEW_ADDR -1U 1992784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 2002784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_ROOT_INO(sbi) (sbi->root_ino_num) 2012784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_NODE_INO(sbi) (sbi->node_ino_num) 2022784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_META_INO(sbi) (sbi->meta_ino_num) 2032784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 2042784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* This flag is used by node and meta inodes, and by recovery */ 2052784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO) 206036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 2072784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 2082784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * For further optimization on multi-head logs, on-disk layout supports maximum 2092784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * 16 logs by default. The number, 16, is expected to cover all the cases 2102784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * enoughly. The implementaion currently uses no more than 6 logs. 2112784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Half the logs are used for nodes, and the other half are used for data. 2122784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 2132784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define MAX_ACTIVE_LOGS 16 2142784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define MAX_ACTIVE_NODE_LOGS 8 2152784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define MAX_ACTIVE_DATA_LOGS 8 2162784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 2172784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 2182784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * For superblock 2192784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 220036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_super_block { 221bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 magic; /* Magic Number */ 222bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 major_ver; /* Major Version */ 223bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 minor_ver; /* Minor Version */ 224bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_sectorsize; /* log2 sector size in bytes */ 225bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_sectors_per_block; /* log2 # of sectors per block */ 226bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_blocksize; /* log2 block size in bytes */ 227bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_blocks_per_seg; /* log2 # of blocks per segment */ 228bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segs_per_sec; /* # of segments per section */ 229bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 secs_per_zone; /* # of sections per zone */ 230bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 checksum_offset; /* checksum offset inside super block */ 231bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 block_count; /* total # of user blocks */ 232bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 section_count; /* total # of sections */ 233bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count; /* total # of segments */ 234bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_ckpt; /* # of segments for checkpoint */ 235bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_sit; /* # of segments for SIT */ 236bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_nat; /* # of segments for NAT */ 237bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_ssa; /* # of segments for SSA */ 238bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_main; /* # of segments for main area */ 239bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment0_blkaddr; /* start block address of segment 0 */ 240bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 cp_blkaddr; /* start block address of checkpoint */ 241bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 sit_blkaddr; /* start block address of SIT */ 242bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 nat_blkaddr; /* start block address of NAT */ 243bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ssa_blkaddr; /* start block address of SSA */ 244bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 main_blkaddr; /* start block address of main area */ 245bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 root_ino; /* root inode number */ 246bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 node_ino; /* node inode number */ 247bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 meta_ino; /* meta inode number */ 248bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 uuid[16]; /* 128-bit uuid for volume */ 249bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 volume_name[512]; /* volume name */ 250bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 extension_count; /* # of extensions below */ 251bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 extension_list[F2FS_MAX_EXTENSION][8]; /* extension array */ 252036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 253036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 254036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 255036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For checkpoint 256036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 25722a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_ERROR_FLAG 0x00000008 25822a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_COMPACT_SUM_FLAG 0x00000004 25922a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_ORPHAN_PRESENT_FLAG 0x00000002 26022a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_UMOUNT_FLAG 0x00000001 26122a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim 262036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_checkpoint { 263bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 checkpoint_ver; /* checkpoint block version number */ 264036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le64 user_block_count; /* # of user blocks */ 265bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 valid_block_count; /* # of valid blocks in main area */ 266036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 rsvd_segment_count; /* # of reserved segments for gc */ 267036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 overprov_segment_count; /* # of overprovision segments */ 268bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 free_segment_count; /* # of free segments in main area */ 269036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 270036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim /* information of current node segments */ 271036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 cur_node_segno[MAX_ACTIVE_NODE_LOGS]; 272036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 cur_node_blkoff[MAX_ACTIVE_NODE_LOGS]; 273036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim /* information of current data segments */ 274036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 cur_data_segno[MAX_ACTIVE_DATA_LOGS]; 275036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 cur_data_blkoff[MAX_ACTIVE_DATA_LOGS]; 276036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 ckpt_flags; /* Flags : umount and journal_present */ 277bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 cp_pack_total_block_count; /* total # of one cp pack */ 278036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 cp_pack_start_sum; /* start block number of data summary */ 279036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 valid_node_count; /* Total number of valid nodes */ 280036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 valid_inode_count; /* Total number of valid inodes */ 281036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 next_free_nid; /* Next free node number */ 282036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 sit_ver_bitmap_bytesize; /* Default value 64 */ 283036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 nat_ver_bitmap_bytesize; /* Default value 256 */ 284bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 checksum_offset; /* checksum offset inside cp block */ 285bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 elapsed_time; /* mounted time */ 286036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim /* allocation type of current segment */ 287036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim unsigned char alloc_type[MAX_ACTIVE_LOGS]; 288036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 289bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* SIT and NAT version bitmap */ 290036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim unsigned char sit_nat_version_bitmap[1]; 291036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 292036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 293036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 2942784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * For orphan inode management 2952784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 2962784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_ORPHANS_PER_BLOCK 1020 2972784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 2982784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimstruct f2fs_orphan_block { 2992784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 ino[F2FS_ORPHANS_PER_BLOCK]; /* inode numbers */ 3002784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 reserved; /* reserved */ 3012784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le16 blk_addr; /* block index in current CP */ 3022784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le16 blk_count; /* Number of orphan inode blocks in CP */ 3032784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 entry_count; /* Total number of orphan nodes in current CP */ 3042784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 check_sum; /* CRC32 for orphan inode block */ 3052784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim} __attribute__((packed)); 3062784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 3072784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 308036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For NODE structure 309036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 310036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_extent { 311bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 fofs; /* start file offset of the extent */ 312bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 blk_addr; /* start block address of the extent */ 313bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 len; /* lengh of the extent */ 314036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 315036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 316f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define F2FS_NAME_LEN 255 317b5af7953f81018c9edd844bd1bc9f4f6752a756aJaegeuk Kim#define ADDRS_PER_INODE 923 /* Address Pointers in an Inode */ 318036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */ 319036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block */ 320036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 321036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_inode { 322bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 i_mode; /* file mode */ 323bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 i_advise; /* file hints */ 324bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 i_reserved; /* reserved */ 325bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_uid; /* user ID */ 326bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_gid; /* group ID */ 327bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_links; /* links count */ 328bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_size; /* file size in bytes */ 329bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_blocks; /* file size in blocks */ 330bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_atime; /* access time */ 331bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_ctime; /* change time */ 332bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_mtime; /* modification time */ 333bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_atime_nsec; /* access time in nano scale */ 334bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_ctime_nsec; /* change time in nano scale */ 335bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_mtime_nsec; /* modification time in nano scale */ 336bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_generation; /* file version (for NFS) */ 337b5af7953f81018c9edd844bd1bc9f4f6752a756aJaegeuk Kim __le32 i_current_depth; /* only for directory depth */ 338bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_xattr_nid; /* nid to save xattr */ 339036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_flags; /* file attributes */ 340036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_pino; /* parent inode number */ 341036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_namelen; /* file name length */ 342f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim __u8 i_name[F2FS_NAME_LEN]; /* file name for SPOR */ 343f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim __u8 i_reserved2; /* for backward compatibility */ 344036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 345036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_extent i_ext; /* caching a largest extent */ 346036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 347036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_addr[ADDRS_PER_INODE]; /* Pointers to data blocks */ 348036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 349036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_nid[5]; /* direct(2), indirect(2), 350036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim double_indirect(1) node id */ 351036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 352036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 353036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct direct_node { 3542784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 addr[ADDRS_PER_BLOCK]; /* array of data block address */ 355036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 356036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 357036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct indirect_node { 3582784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 nid[NIDS_PER_BLOCK]; /* array of data block address */ 359036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 360036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 3612784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimenum { 3622784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim COLD_BIT_SHIFT = 0, 3632784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim FSYNC_BIT_SHIFT, 3642784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim DENT_BIT_SHIFT, 3652784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim OFFSET_BIT_SHIFT 3662784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim}; 3672784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 368036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct node_footer { 369bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 nid; /* node id */ 370bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ino; /* inode nunmber */ 371036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 flag; /* include cold/fsync/dentry marks and offset */ 372036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le64 cp_ver; /* checkpoint version */ 373036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 next_blkaddr; /* next node page block address */ 374036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 375036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 376036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_node { 377bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* can be one of three types: inode, direct, and indirect types */ 378036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 379036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_inode i; 380036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct direct_node dn; 381036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct indirect_node in; 382036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 383036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct node_footer footer; 384036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 385036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 386036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 387036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For NAT entries 388036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 3892784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NAT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_nat_entry)) 390036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 391036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_nat_entry { 392bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 version; /* latest version of cached nat entry */ 393bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ino; /* inode number */ 394bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 block_addr; /* block address */ 395036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 396036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 397036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_nat_block { 398036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_nat_entry entries[NAT_ENTRY_PER_BLOCK]; 399036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 400036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 401036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 402036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For SIT entries 403bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * 404bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * Each segment is 2MB in size by default so that a bitmap for validity of 405bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * there-in blocks should occupy 64 bytes, 512 bits. 406bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * Not allow to change this. 407036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 4082784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SIT_VBLOCK_MAP_SIZE 64 409036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry)) 410036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 41199b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* 41299b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * Note that f2fs_sit_entry->vblocks has the following bit-field information. 41399b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * [15:10] : allocation type such as CURSEG_XXXX_TYPE 41499b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * [9:0] : valid block count 41599b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim */ 4162784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SIT_VBLOCKS_SHIFT 10 4172784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SIT_VBLOCKS_MASK ((1 << SIT_VBLOCKS_SHIFT) - 1) 4182784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GET_SIT_VBLOCKS(raw_sit) \ 4192784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim (le16_to_cpu((raw_sit)->vblocks) & SIT_VBLOCKS_MASK) 4202784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GET_SIT_TYPE(raw_sit) \ 4212784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim ((le16_to_cpu((raw_sit)->vblocks) & ~SIT_VBLOCKS_MASK) \ 4222784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim >> SIT_VBLOCKS_SHIFT) 423bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 424036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_sit_entry { 425bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 vblocks; /* reference above */ 426bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 valid_map[SIT_VBLOCK_MAP_SIZE]; /* bitmap for valid blocks */ 427bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 mtime; /* segment age for cleaning */ 428036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 429036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 430036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_sit_block { 431036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK]; 432036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 433036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 4342784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 43599b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * For segment summary 43699b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * 437bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * One summary block contains exactly 512 summary entries, which represents 438bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * exactly 2MB segment by default. Not allow to change the basic units. 439bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * 4402784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * NOTE: For initializing fields, you must use set_summary 44199b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * 44299b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * - If data page, nid represents dnode's nid 44399b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * - If node page, nid represents the node page's nid. 44499b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * 44599b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * The ofs_in_node is used by only data page. It represents offset 44699b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * from node's page's beginning to get a data block address. 44799b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * ex) data_blkaddr = (block_t)(nodepage_start_address + ofs_in_node) 44899b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim */ 449bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define ENTRIES_IN_SUM 512 4502784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SUMMARY_SIZE (7) /* sizeof(struct summary) */ 4512784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SUM_FOOTER_SIZE (5) /* sizeof(struct summary_footer) */ 452bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define SUM_ENTRY_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM) 453bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 454bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* a summary entry for a 4KB-sized block in a segment */ 455036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_summary { 456036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 nid; /* parent node id */ 457036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 458036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[3]; 459036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct { 460036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 version; /* node version number */ 46199b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim __le16 ofs_in_node; /* block index in parent node */ 462036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim } __attribute__((packed)); 463036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 464036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 465036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 466bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* summary block type, node or data, is stored to the summary_footer */ 467bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define SUM_TYPE_NODE (1) 468bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define SUM_TYPE_DATA (0) 469036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 470bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kimstruct summary_footer { 471bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim unsigned char entry_type; /* SUM_TYPE_XXX */ 472bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u32 check_sum; /* summary checksum */ 473036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 474036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 4752784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE -\ 476bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim SUM_ENTRY_SIZE) 477036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\ 478036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct nat_journal_entry)) 479036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\ 480036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct nat_journal_entry)) 481036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\ 482036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct sit_journal_entry)) 483036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\ 484036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct sit_journal_entry)) 485bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* 486bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * frequently updated NAT/SIT entries can be stored in the spare area in 487bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * summary blocks 488bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim */ 489036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimenum { 490036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim NAT_JOURNAL = 0, 491036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim SIT_JOURNAL 492036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim}; 493036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 494bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kimstruct nat_journal_entry { 495bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 nid; 496bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim struct f2fs_nat_entry ne; 497bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim} __attribute__((packed)); 498bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 499036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct nat_journal { 500036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct nat_journal_entry entries[NAT_JOURNAL_ENTRIES]; 501036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[NAT_JOURNAL_RESERVED]; 502036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 503036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 504bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kimstruct sit_journal_entry { 505bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segno; 506bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim struct f2fs_sit_entry se; 507bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim} __attribute__((packed)); 508bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 509036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct sit_journal { 510036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct sit_journal_entry entries[SIT_JOURNAL_ENTRIES]; 511036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[SIT_JOURNAL_RESERVED]; 512036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 513036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 514bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* 4KB-sized summary block structure */ 515036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_summary_block { 516036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_summary entries[ENTRIES_IN_SUM]; 517036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 518036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 n_nats; 519036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 n_sits; 520036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 521bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* spare area is used by NAT or SIT journals */ 522036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 523036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct nat_journal nat_j; 524036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct sit_journal sit_j; 525036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 526036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct summary_footer footer; 527036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 528036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 529036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 530036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For directory operations 531036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 5322784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_DOT_HASH 0 5332784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_DDOT_HASH F2FS_DOT_HASH 5342784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_MAX_HASH (~((0x3ULL) << 62)) 5352784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_HASH_COL_BIT ((0x1ULL) << 63) 5362784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 5372784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimtypedef __le32 f2fs_hash_t; 5382784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 53999b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* One directory entry slot covers 8bytes-long file name */ 540f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define F2FS_SLOT_LEN 8 541f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define F2FS_SLOT_LEN_BITS 3 5422784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 543f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define GET_DENTRY_SLOTS(x) ((x + F2FS_SLOT_LEN - 1) >> F2FS_SLOT_LEN_BITS) 54499b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim 54599b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* the number of dentry in a block */ 54699b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim#define NR_DENTRY_IN_BLOCK 214 54799b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim 54899b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* MAX level for dir lookup */ 54999b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim#define MAX_DIR_HASH_DEPTH 63 550036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 551036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIZE_OF_DIR_ENTRY 11 /* by byte */ 552036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \ 5532784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim BITS_PER_BYTE) 554036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \ 555f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim F2FS_SLOT_LEN) * \ 556036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) 557036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 558f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim/* One directory entry slot representing F2FS_SLOT_LEN-sized file name */ 559036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_dir_entry { 560036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 hash_code; /* hash code of file name */ 561bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ino; /* inode number */ 562bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 name_len; /* lengh of file name */ 563bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 file_type; /* file type */ 564036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 565036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 566bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* 4KB-sized directory entry block */ 567036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_dentry_block { 568bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* validity bitmap for directory entries in each block */ 569036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP]; 570036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[SIZE_OF_RESERVED]; 571036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK]; 572f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim __u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN]; 573036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 574036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 575bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* file types used in inode_info->flags */ 576036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimenum { 577036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_UNKNOWN, 578036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_REG_FILE, 579036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_DIR, 580036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_CHRDEV, 581036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_BLKDEV, 582036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_FIFO, 583036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_SOCK, 584036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_SYMLINK, 585036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_MAX 586036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim}; 587036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 588e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimvoid ASCIIToUNICODE(u_int16_t *, u_int8_t *); 589e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimint log_base_2(u_int32_t); 590e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 591e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimint f2fs_test_bit(unsigned int, const char *); 592e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimint f2fs_set_bit(unsigned int, unsigned char *); 593e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimint f2fs_clear_bit(unsigned int, char *); 594e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 595e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimu_int32_t f2fs_cal_crc32(u_int32_t, void *, int); 596e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 597e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimvoid f2fs_init_configuration(struct f2fs_configuration *); 598e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimint f2fs_dev_is_mounted(struct f2fs_configuration *); 599e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kimint f2fs_get_device_info(struct f2fs_configuration *); 600e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 6015043dffbd1d2b89c71966dde31780b0ca313b5c9Jaegeuk Kimint dev_read(void *, __u64, size_t); 6025043dffbd1d2b89c71966dde31780b0ca313b5c9Jaegeuk Kimint dev_write(void *, __u64, size_t); 603e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 6045043dffbd1d2b89c71966dde31780b0ca313b5c9Jaegeuk Kimint dev_read_block(void *, __u64); 6055043dffbd1d2b89c71966dde31780b0ca313b5c9Jaegeuk Kimint dev_read_blocks(void *, __u64, __u32 ); 606e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 6075043dffbd1d2b89c71966dde31780b0ca313b5c9Jaegeuk Kim#endif /*__F2FS_FS_H */ 608