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 * 7e35b8afb34822ccc0835b453c7a3417bc0825569Jaegeuk Kim * Dual licensed under the GPL or LGPL version 2 licenses. 8f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * 9f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * The byteswap codes are copied from: 10f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * samba_3_master/lib/ccan/endian/endian.h under LGPL 2.1 11036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 1240b9f96587c191269a41b20bd2bd5000fc9db259Jaegeuk Kim#ifndef __F2FS_FS_H__ 1340b9f96587c191269a41b20bd2bd5000fc9db259Jaegeuk Kim#define __F2FS_FS_H__ 14036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 15e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#include <inttypes.h> 16036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#include <linux/types.h> 17e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#include <sys/types.h> 18036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 19dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh#ifdef HAVE_CONFIG_H 20dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh#include <config.h> 21dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh#endif 22dd1ba078fae270c4174a221a873026fea85aae32Sven-Göran Bergh 239691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#ifdef HAVE_LINUX_BLKZONED_H 249691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#include <linux/blkzoned.h> 259691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#endif 269691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 277f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef u_int64_t u64; 287f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef u_int32_t u32; 297f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef u_int16_t u16; 307f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef u_int8_t u8; 31858c4039c85f7c00c57925902985701b1e083555Jaegeuk Kimtypedef u32 block_t; 327f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef u32 nid_t; 337f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef u8 bool; 347f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leetypedef unsigned long pgoff_t; 35603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kimtypedef unsigned short umode_t; 367f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 37f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim#if HAVE_BYTESWAP_H 38f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim#include <byteswap.h> 39f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim#else 40f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim/** 41f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * bswap_16 - reverse bytes in a uint16_t value. 42f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * @val: value whose bytes to swap. 43f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * 44f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * Example: 45f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * // Output contains "1024 is 4 as two bytes reversed" 46f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * printf("1024 is %u as two bytes reversed\n", bswap_16(1024)); 47f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim */ 48f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kimstatic inline uint16_t bswap_16(uint16_t val) 49f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim{ 50f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim return ((val & (uint16_t)0x00ffU) << 8) 51f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint16_t)0xff00U) >> 8); 52f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim} 53f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim 54f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim/** 55f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * bswap_32 - reverse bytes in a uint32_t value. 56f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * @val: value whose bytes to swap. 57f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * 58f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * Example: 59f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * // Output contains "1024 is 262144 as four bytes reversed" 60f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * printf("1024 is %u as four bytes reversed\n", bswap_32(1024)); 61f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim */ 62f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kimstatic inline uint32_t bswap_32(uint32_t val) 63f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim{ 64f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim return ((val & (uint32_t)0x000000ffUL) << 24) 65f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint32_t)0x0000ff00UL) << 8) 66f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint32_t)0x00ff0000UL) >> 8) 67f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint32_t)0xff000000UL) >> 24); 68f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim} 69f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim#endif /* !HAVE_BYTESWAP_H */ 70f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim 71dc532e5316488cc41668e918c2105f6c051d0767Yann E. MORIN#if defined HAVE_DECL_BSWAP_64 && !HAVE_DECL_BSWAP_64 72f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim/** 73f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * bswap_64 - reverse bytes in a uint64_t value. 74f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * @val: value whose bytes to swap. 75f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * 76f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * Example: 77f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * // Output contains "1024 is 1125899906842624 as eight bytes reversed" 78f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * printf("1024 is %llu as eight bytes reversed\n", 79f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim * (unsigned long long)bswap_64(1024)); 80f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim */ 81f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kimstatic inline uint64_t bswap_64(uint64_t val) 82f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim{ 83f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim return ((val & (uint64_t)0x00000000000000ffULL) << 56) 84f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0x000000000000ff00ULL) << 40) 85f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0x0000000000ff0000ULL) << 24) 86f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0x00000000ff000000ULL) << 8) 87f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0x000000ff00000000ULL) >> 8) 88f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0x0000ff0000000000ULL) >> 24) 89f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0x00ff000000000000ULL) >> 40) 90f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim | ((val & (uint64_t)0xff00000000000000ULL) >> 56); 91f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim} 92f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim#endif 93f3a1ea9c7af493b873641fa4263e1b2101fc277bJaegeuk Kim 94036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#if __BYTE_ORDER == __LITTLE_ENDIAN 95036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le16_to_cpu(x) ((__u16)(x)) 96036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le32_to_cpu(x) ((__u32)(x)) 97036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le64_to_cpu(x) ((__u64)(x)) 98036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le16(x) ((__u16)(x)) 99036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le32(x) ((__u32)(x)) 100036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le64(x) ((__u64)(x)) 101036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#elif __BYTE_ORDER == __BIG_ENDIAN 102036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le16_to_cpu(x) bswap_16(x) 103036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le32_to_cpu(x) bswap_32(x) 104036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define le64_to_cpu(x) bswap_64(x) 105036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le16(x) bswap_16(x) 106036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le32(x) bswap_32(x) 107036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define cpu_to_le64(x) bswap_64(x) 108036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#endif 109036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 1107f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee#define typecheck(type,x) \ 1117f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee ({ type __dummy; \ 1127f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee typeof(x) __dummy2; \ 1137f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee (void)(&__dummy == &__dummy2); \ 1147f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 1; \ 1157f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee }) 1167f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 1177f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee#define NULL_SEGNO ((unsigned int)~0) 1187f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 119e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim/* 120e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim * Debugging interfaces 121e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim */ 12248ffea7ba8669f372cb372f870a12e6faf02bc36Jaegeuk Kim#define FIX_MSG(fmt, ...) \ 12348ffea7ba8669f372cb372f870a12e6faf02bc36Jaegeuk Kim do { \ 12448ffea7ba8669f372cb372f870a12e6faf02bc36Jaegeuk Kim printf("[FIX] (%s:%4d) ", __func__, __LINE__); \ 12548ffea7ba8669f372cb372f870a12e6faf02bc36Jaegeuk Kim printf(" --> "fmt"\n", ##__VA_ARGS__); \ 12648ffea7ba8669f372cb372f870a12e6faf02bc36Jaegeuk Kim } while (0) 12748ffea7ba8669f372cb372f870a12e6faf02bc36Jaegeuk Kim 128f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim#define ASSERT_MSG(fmt, ...) \ 129e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 130f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim printf("[ASSERT] (%s:%4d) ", __func__, __LINE__); \ 131f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim printf(" --> "fmt"\n", ##__VA_ARGS__); \ 1323ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.bug_on = 1; \ 133f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 134e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 135e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define ASSERT(exp) \ 136e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 137e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim if (!(exp)) { \ 138f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim printf("[ASSERT] (%s:%4d) " #exp"\n", \ 139f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim __func__, __LINE__); \ 140e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim exit(-1); \ 141e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 142f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 143e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 1447f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee#define ERR_MSG(fmt, ...) \ 1457f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee do { \ 146f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim printf("[%s:%d] " fmt, __func__, __LINE__, ##__VA_ARGS__); \ 147f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 1487f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 149e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define MSG(n, fmt, ...) \ 150e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 1513ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.dbg_lv >= n) { \ 152e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf(fmt, ##__VA_ARGS__); \ 153e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 154f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 155e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 156e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DBG(n, fmt, ...) \ 157e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 1583ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim if (c.dbg_lv >= n) { \ 159e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("[%s:%4d] " fmt, \ 160e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim __func__, __LINE__, ##__VA_ARGS__); \ 161e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim } \ 162f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 163e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 164e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim/* Display on console */ 165e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP(fmt, ptr, member) \ 166e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 167e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("%-30s" fmt, #member, ((ptr)->member)); \ 168f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 169e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 170e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP_u32(ptr, member) \ 171e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 172e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim assert(sizeof((ptr)->member) <= 4); \ 1739deb6fd9f2104eac0748f42c1135e6dff175e9b5Sheng Yong printf("%-30s" "\t\t[0x%8x : %u]\n", \ 1749deb6fd9f2104eac0748f42c1135e6dff175e9b5Sheng Yong #member, le32_to_cpu(((ptr)->member)), \ 1759deb6fd9f2104eac0748f42c1135e6dff175e9b5Sheng Yong le32_to_cpu(((ptr)->member))); \ 176f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 177e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 178e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP_u64(ptr, member) \ 179e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 180e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim assert(sizeof((ptr)->member) == 8); \ 181e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim printf("%-30s" "\t\t[0x%8llx : %llu]\n", \ 1829deb6fd9f2104eac0748f42c1135e6dff175e9b5Sheng Yong #member, le64_to_cpu(((ptr)->member)), \ 1839deb6fd9f2104eac0748f42c1135e6dff175e9b5Sheng Yong le64_to_cpu(((ptr)->member))); \ 184f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 185e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 186e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim#define DISP_utf(ptr, member) \ 187e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim do { \ 188f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim printf("%-30s" "\t\t[%s]\n", #member, ((ptr)->member)); \ 189f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 190e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 191e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim/* Display to buffer */ 192f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim#define BUF_DISP_u32(buf, data, len, ptr, member) \ 193f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim do { \ 194f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim assert(sizeof((ptr)->member) <= 4); \ 195f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim snprintf(buf, len, #member); \ 196f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim snprintf(data, len, "0x%x : %u", ((ptr)->member), \ 197f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim ((ptr)->member)); \ 198f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 199f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim 200f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim#define BUF_DISP_u64(buf, data, len, ptr, member) \ 201f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim do { \ 202f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim assert(sizeof((ptr)->member) == 8); \ 203f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim snprintf(buf, len, #member); \ 204f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim snprintf(data, len, "0x%llx : %llu", ((ptr)->member), \ 205f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim ((ptr)->member)); \ 206f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim } while (0) 207f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim 208f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim#define BUF_DISP_utf(buf, data, len, ptr, member) \ 209f6d1d582e9d561082834726475e1e7f51ea6d06dJaegeuk Kim snprintf(buf, len, #member) 210e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 211036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* these are defined in kernel */ 212036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define PAGE_SIZE 4096 213036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define PAGE_CACHE_SIZE 4096 214036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define BITS_PER_BYTE 8 2152784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */ 216cc9d9caeb6853d38297d97d3dd4731c452418f02Jaegeuk Kim#define CHECKSUM_OFFSET 4092 217de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim#define MAX_PATH_LEN 64 218de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim#define MAX_DEVICES 8 219036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 220603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim#define F2FS_BYTES_TO_BLK(bytes) ((bytes) >> F2FS_BLKSIZE_BITS) 221603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim#define F2FS_BLKSIZE_BITS 12 222603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim 223036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* for mkfs */ 224036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define F2FS_NUMBER_OF_CHECKPOINT_PACK 2 225036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_SECTOR_SIZE 512 226036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_SECTORS_PER_BLOCK 8 227036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_BLOCKS_PER_SEGMENT 512 228036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define DEFAULT_SEGMENTS_PER_SECTION 1 229036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 2306fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kim#define VERSION_LEN 256 2316fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kim 2327f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeenum f2fs_config_func { 2337f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee FSCK, 2347f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee DUMP, 2352c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim DEFRAG, 236d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim RESIZE, 237603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim SLOAD, 2387f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee}; 2397f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 240de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimstruct device_info { 241de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim char *path; 242de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim int32_t fd; 2432784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t sector_size; 244de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int64_t total_sectors; /* got by get_device_info */ 245de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int64_t start_blkaddr; 246de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int64_t end_blkaddr; 247de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int32_t total_segments; 248de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim 249de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim /* to handle zone block devices */ 250de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim int zoned_model; 251de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int32_t nr_zones; 252de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int32_t nr_rnd_zones; 253de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim size_t zone_blocks; 254de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim}; 255de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim 256de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimstruct f2fs_configuration { 2572784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t reserved_segments; 258d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim u_int32_t new_reserved_segments; 25991a801f1627c1b09535f28c8d91a87c033928a9bYang Jin int sparse_mode; 260de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim int zoned_mode; 261de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim int zoned_model; 262de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim size_t zone_blocks; 2632cdb04b52f202e931e370564396366d44bd4d1e2Jaegeuk Kim double overprovision; 264d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim double new_overprovision; 2652784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t cur_seg[6]; 2662784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t segs_per_sec; 2672784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t secs_per_zone; 268370a24287e9b499f0776c4ac15b817373f69dbc4Changman Lee u_int32_t segs_per_zone; 2692784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t start_sector; 270de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int32_t total_segments; 271de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int32_t sector_size; 27291a801f1627c1b09535f28c8d91a87c033928a9bYang Jin u_int64_t device_size; 2732784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int64_t total_sectors; 274de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim u_int64_t wanted_total_sectors; 275d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim u_int64_t target_sectors; 2762784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t sectors_per_blk; 2772784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim u_int32_t blks_per_seg; 278762eedf87fe28f3c2c340a3b41438cbeee7e0c96Jaegeuk Kim __u8 init_version[VERSION_LEN + 1]; 2796fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kim __u8 sb_version[VERSION_LEN + 1]; 2806fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kim __u8 version[VERSION_LEN + 1]; 2819799d6364dc93e1fd259d812d4a50ed984a6456bMike Fleetwood char *vol_label; 2822784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim int heap; 283de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim int32_t kd; 2846cd2c51c205b039e71fe0ffe695d6c7a8864bae4Jaegeuk Kim int32_t dump_fd; 285de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim struct device_info devices[MAX_DEVICES]; 286de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim int ndevs; 2872784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim char *extension_list; 288e5b3ec89eec84e9d073788e6169b464169305026Tobias Jakobi const char *rootdev_name; 289e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim int dbg_lv; 290f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim int show_dentry; 291fef98ebdf3a7728017cb3d0ae4ffedc5405e531dChangman Lee int trim; 292f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim int trimmed; 2937f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee int func; 2947f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee void *private; 2956f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim int fix_on; 2966f4106c12bb2faa6cd9922ae3a03b400bdf49fdeJaegeuk Kim int bug_on; 2977eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim int auto_fix; 2986e225697bda9459ffb62d0bcccc545193cc9ecdfSheng Yong int preen_mode; 29967de42f76ac67a941cacb689cbd2e0d750ad67a9Jaegeuk Kim int ro; 3006e6c7132400b5a0c2f55b85feb64a464f2a6fb78Jaegeuk Kim __le32 feature; /* defined features */ 3012c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim 3022c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim /* defragmentation parameters */ 3032c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim int defrag_shrink; 3042c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim u_int64_t defrag_start; 3052c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim u_int64_t defrag_len; 3062c1ebe237acb9b1e8093f9aecd0c92b53583877bJaegeuk Kim u_int64_t defrag_target; 307603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim 308603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim /* sload parameters */ 309603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim char *from_dir; 310603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim char *mount_point; 311f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim}; 312036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 313cb54e79739672366d849e02a3068f857c6bb544cJP Abgrall#ifdef CONFIG_64BIT 314036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define BITS_PER_LONG 64 315036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#else 316036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define BITS_PER_LONG 32 317036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#endif 318036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 3192784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define BIT_MASK(nr) (1 << (nr % BITS_PER_LONG)) 3202784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define BIT_WORD(nr) (nr / BITS_PER_LONG) 321036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 32206a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_sb_le64(member, val) (sb->member = cpu_to_le64(val)) 32306a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_sb_le32(member, val) (sb->member = cpu_to_le32(val)) 32406a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_sb_le16(member, val) (sb->member = cpu_to_le16(val)) 32506a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_sb_le64(member) le64_to_cpu(sb->member) 32606a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_sb_le32(member) le32_to_cpu(sb->member) 32706a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_sb_le16(member) le16_to_cpu(sb->member) 328d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim#define get_newsb_le64(member) le64_to_cpu(new_sb->member) 329d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim#define get_newsb_le32(member) le32_to_cpu(new_sb->member) 330d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim#define get_newsb_le16(member) le16_to_cpu(new_sb->member) 33106a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim 33206a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_sb(member, val) \ 33306a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim do { \ 33406a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim typeof(sb->member) t; \ 33506a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim switch (sizeof(t)) { \ 33606a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 8: set_sb_le64(member, val); break; \ 33706a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 4: set_sb_le32(member, val); break; \ 33806a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 2: set_sb_le16(member, val); break; \ 33906a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim } \ 34006a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim } while(0) 34106a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim 34206a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_sb(member) \ 34306a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim ({ \ 34406a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim typeof(sb->member) t; \ 34506a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim switch (sizeof(t)) { \ 34606a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 8: t = get_sb_le64(member); break; \ 34706a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 4: t = get_sb_le32(member); break; \ 34806a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 2: t = get_sb_le16(member); break; \ 34906a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim } \ 35006a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim t; \ 35106a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim }) 352d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim#define get_newsb(member) \ 353d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim ({ \ 354d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim typeof(new_sb->member) t; \ 355d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim switch (sizeof(t)) { \ 356d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim case 8: t = get_newsb_le64(member); break; \ 357d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim case 4: t = get_newsb_le32(member); break; \ 358d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim case 2: t = get_newsb_le16(member); break; \ 359d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim } \ 360d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim t; \ 361d3be08825e9f5ebe8e9bf9da9a9b77cefd9b525dJaegeuk Kim }) 36206a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim 36306a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_cp_le64(member, val) (cp->member = cpu_to_le64(val)) 36406a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_cp_le32(member, val) (cp->member = cpu_to_le32(val)) 36506a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_cp_le16(member, val) (cp->member = cpu_to_le16(val)) 36606a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_cp_le64(member) le64_to_cpu(cp->member) 36706a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_cp_le32(member) le32_to_cpu(cp->member) 36806a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_cp_le16(member) le16_to_cpu(cp->member) 36906a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim 37006a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define set_cp(member, val) \ 37106a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim do { \ 37206a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim typeof(cp->member) t; \ 37306a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim switch (sizeof(t)) { \ 37406a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 8: set_cp_le64(member, val); break; \ 37506a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 4: set_cp_le32(member, val); break; \ 37606a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 2: set_cp_le16(member, val); break; \ 37706a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim } \ 37806a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim } while(0) 37906a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim 38006a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim#define get_cp(member) \ 38106a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim ({ \ 38206a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim typeof(cp->member) t; \ 38306a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim switch (sizeof(t)) { \ 38406a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 8: t = get_cp_le64(member); break; \ 38506a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 4: t = get_cp_le32(member); break; \ 38606a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim case 2: t = get_cp_le16(member); break; \ 38706a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim } \ 38806a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim t; \ 38906a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim }) 39006a19451eeecd8421be7eafd8d6581d54b9f6b05Jaegeuk Kim 391036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 3921ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim * Copied from include/linux/kernel.h 3931ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim */ 3941ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim#define __round_mask(x, y) ((__typeof__(x))((y)-1)) 3951ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim#define round_down(x, y) ((x) & ~__round_mask(x, y)) 3961ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim#define min(x, y) ({ \ 3971ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim typeof(x) _min1 = (x); \ 3981ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim typeof(y) _min2 = (y); \ 3991ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim (void) (&_min1 == &_min2); \ 4001ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim _min1 < _min2 ? _min1 : _min2; }) 4011ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim 4021ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim#define max(x, y) ({ \ 4031ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim typeof(x) _max1 = (x); \ 4041ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim typeof(y) _max2 = (y); \ 4051ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim (void) (&_max1 == &_max2); \ 4061ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim _max1 > _max2 ? _max1 : _max2; }) 4071ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim 4081ea31c47f4050e9d4b6685f28d4ae6bfd10d4368Jaegeuk Kim/* 4092784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Copied from fs/f2fs/f2fs.h 410036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 4112784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NR_CURSEG_DATA_TYPE (3) 4122784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NR_CURSEG_NODE_TYPE (3) 4132784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NR_CURSEG_TYPE (NR_CURSEG_DATA_TYPE + NR_CURSEG_NODE_TYPE) 4142784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4152784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimenum { 4162784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_HOT_DATA = 0, /* directory entry blocks */ 4172784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_WARM_DATA, /* data blocks */ 4182784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_COLD_DATA, /* multimedia or GCed data blocks */ 4192784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_HOT_NODE, /* direct node blocks of directory files */ 4202784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_WARM_NODE, /* direct node blocks of normal files */ 4212784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim CURSEG_COLD_NODE, /* indirect node blocks */ 4222784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim NO_CHECK_TYPE 4232784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim}; 4242784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4250a48220641c27c534e987d43be66781729727797Jaegeuk Kim#define F2FS_MIN_SEGMENTS 9 /* SB + 2 (CP + SIT + NAT) + SSA + MAIN */ 4260a48220641c27c534e987d43be66781729727797Jaegeuk Kim 4272784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 4282784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Copied from fs/f2fs/segment.h 4292784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 4302784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GET_SUM_TYPE(footer) ((footer)->entry_type) 4312784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SET_SUM_TYPE(footer, type) ((footer)->entry_type = type) 4322784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4332784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 4342784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Copied from include/linux/f2fs_sb.h 4352784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 4362784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_SUPER_OFFSET 1024 /* byte-size offset */ 43737580f1c5b2d7d0f815105685b68c329002d459bChao Yu#define F2FS_MIN_LOG_SECTOR_SIZE 9 /* 9 bits for 512 bytes */ 43837580f1c5b2d7d0f815105685b68c329002d459bChao Yu#define F2FS_MAX_LOG_SECTOR_SIZE 12 /* 12 bits for 4096 bytes */ 4392784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_BLKSIZE 4096 /* support only 4KB block */ 4402784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_MAX_EXTENSION 64 /* # of extension entries */ 441092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee#define F2FS_BLK_ALIGN(x) (((x) + F2FS_BLKSIZE - 1) / F2FS_BLKSIZE) 4422784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4432784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NULL_ADDR 0x0U 4442784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NEW_ADDR -1U 4452784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4462784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_ROOT_INO(sbi) (sbi->root_ino_num) 4472784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_NODE_INO(sbi) (sbi->node_ino_num) 4482784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_META_INO(sbi) (sbi->meta_ino_num) 4492784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4502784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* This flag is used by node and meta inodes, and by recovery */ 4512784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO) 452036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 4532784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 4542784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * For further optimization on multi-head logs, on-disk layout supports maximum 4552784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * 16 logs by default. The number, 16, is expected to cover all the cases 4562784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * enoughly. The implementaion currently uses no more than 6 logs. 4572784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * Half the logs are used for nodes, and the other half are used for data. 4582784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 4592784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define MAX_ACTIVE_LOGS 16 4602784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define MAX_ACTIVE_NODE_LOGS 8 4612784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define MAX_ACTIVE_DATA_LOGS 8 4622784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 4636e6c7132400b5a0c2f55b85feb64a464f2a6fb78Jaegeuk Kim#define F2FS_FEATURE_ENCRYPT 0x0001 46481c62e2537caaacfd0937b93535006edda73e1b5Damien Le Moal#define F2FS_FEATURE_BLKZONED 0x0002 4656e6c7132400b5a0c2f55b85feb64a464f2a6fb78Jaegeuk Kim 4669e5c021b679ebd54c719d68e8b5e6b5614fbf127Jaegeuk Kim#define MAX_VOLUME_NAME 512 4679e5c021b679ebd54c719d68e8b5e6b5614fbf127Jaegeuk Kim 4682784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 4692784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * For superblock 4702784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 471de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimstruct f2fs_device { 472de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim __u8 path[MAX_PATH_LEN]; 473de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim __le32 total_segments; 474de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim} __attribute__((packed)); 475de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim 476036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_super_block { 477bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 magic; /* Magic Number */ 478bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 major_ver; /* Major Version */ 479bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 minor_ver; /* Minor Version */ 480bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_sectorsize; /* log2 sector size in bytes */ 481bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_sectors_per_block; /* log2 # of sectors per block */ 482bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_blocksize; /* log2 block size in bytes */ 483bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 log_blocks_per_seg; /* log2 # of blocks per segment */ 484bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segs_per_sec; /* # of segments per section */ 485bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 secs_per_zone; /* # of sections per zone */ 486bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 checksum_offset; /* checksum offset inside super block */ 487bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 block_count; /* total # of user blocks */ 488bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 section_count; /* total # of sections */ 489bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count; /* total # of segments */ 490bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_ckpt; /* # of segments for checkpoint */ 491bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_sit; /* # of segments for SIT */ 492bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_nat; /* # of segments for NAT */ 493bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_ssa; /* # of segments for SSA */ 494bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment_count_main; /* # of segments for main area */ 495bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segment0_blkaddr; /* start block address of segment 0 */ 496bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 cp_blkaddr; /* start block address of checkpoint */ 497bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 sit_blkaddr; /* start block address of SIT */ 498bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 nat_blkaddr; /* start block address of NAT */ 499bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ssa_blkaddr; /* start block address of SSA */ 500bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 main_blkaddr; /* start block address of main area */ 501bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 root_ino; /* root inode number */ 502bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 node_ino; /* node inode number */ 503bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 meta_ino; /* meta inode number */ 504bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 uuid[16]; /* 128-bit uuid for volume */ 5059e5c021b679ebd54c719d68e8b5e6b5614fbf127Jaegeuk Kim __le16 volume_name[MAX_VOLUME_NAME]; /* volume name */ 506bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 extension_count; /* # of extensions below */ 507bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 extension_list[F2FS_MAX_EXTENSION][8]; /* extension array */ 5084ea4f1db27c0d0d3e40f561191b4ceeecb80ab1aChangman Lee __le32 cp_payload; 5096fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kim __u8 version[VERSION_LEN]; /* the kernel version */ 510762eedf87fe28f3c2c340a3b41438cbeee7e0c96Jaegeuk Kim __u8 init_version[VERSION_LEN]; /* the initial kernel version */ 5116e6c7132400b5a0c2f55b85feb64a464f2a6fb78Jaegeuk Kim __le32 feature; /* defined features */ 5126e6c7132400b5a0c2f55b85feb64a464f2a6fb78Jaegeuk Kim __u8 encryption_level; /* versioning level for encryption */ 5136e6c7132400b5a0c2f55b85feb64a464f2a6fb78Jaegeuk Kim __u8 encrypt_pw_salt[16]; /* Salt used for string2key algorithm */ 514de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim struct f2fs_device devs[MAX_DEVICES]; /* device list */ 515de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kim __u8 reserved[327]; /* valid reserved region */ 516036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 517036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 518036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 519036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For checkpoint 520036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 521f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim#define CP_TRIMMED_FLAG 0x00000100 522f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim#define CP_NAT_BITS_FLAG 0x00000080 523f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim#define CP_CRC_RECOVERY_FLAG 0x00000040 524b57708aecf07a7caa8fcce02f65735a11e987154Jaegeuk Kim#define CP_FASTBOOT_FLAG 0x00000020 5257eb6c5a03b78d8673030e89ce15345d69d5e5777Jaegeuk Kim#define CP_FSCK_FLAG 0x00000010 52622a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_ERROR_FLAG 0x00000008 52722a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_COMPACT_SUM_FLAG 0x00000004 52822a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_ORPHAN_PRESENT_FLAG 0x00000002 52922a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim#define CP_UMOUNT_FLAG 0x00000001 53022a75edd47adea7d466ecd245c62b75fd1866628Jaegeuk Kim 531036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_checkpoint { 532bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 checkpoint_ver; /* checkpoint block version number */ 533036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le64 user_block_count; /* # of user blocks */ 534bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 valid_block_count; /* # of valid blocks in main area */ 535036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 rsvd_segment_count; /* # of reserved segments for gc */ 536036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 overprov_segment_count; /* # of overprovision segments */ 537bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 free_segment_count; /* # of free segments in main area */ 538036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 539036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim /* information of current node segments */ 540036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 cur_node_segno[MAX_ACTIVE_NODE_LOGS]; 541036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 cur_node_blkoff[MAX_ACTIVE_NODE_LOGS]; 542036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim /* information of current data segments */ 543036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 cur_data_segno[MAX_ACTIVE_DATA_LOGS]; 544036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 cur_data_blkoff[MAX_ACTIVE_DATA_LOGS]; 545036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 ckpt_flags; /* Flags : umount and journal_present */ 546bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 cp_pack_total_block_count; /* total # of one cp pack */ 547036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 cp_pack_start_sum; /* start block number of data summary */ 548036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 valid_node_count; /* Total number of valid nodes */ 549036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 valid_inode_count; /* Total number of valid inodes */ 550036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 next_free_nid; /* Next free node number */ 551036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 sit_ver_bitmap_bytesize; /* Default value 64 */ 552036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 nat_ver_bitmap_bytesize; /* Default value 256 */ 553bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 checksum_offset; /* checksum offset inside cp block */ 554bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 elapsed_time; /* mounted time */ 555036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim /* allocation type of current segment */ 556036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim unsigned char alloc_type[MAX_ACTIVE_LOGS]; 557036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 558bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* SIT and NAT version bitmap */ 559036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim unsigned char sit_nat_version_bitmap[1]; 560036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 561036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 562036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 5632784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * For orphan inode management 5642784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim */ 5652784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_ORPHANS_PER_BLOCK 1020 5662784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 5672784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimstruct f2fs_orphan_block { 5682784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 ino[F2FS_ORPHANS_PER_BLOCK]; /* inode numbers */ 5692784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 reserved; /* reserved */ 5702784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le16 blk_addr; /* block index in current CP */ 5712784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le16 blk_count; /* Number of orphan inode blocks in CP */ 5722784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 entry_count; /* Total number of orphan nodes in current CP */ 5732784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 check_sum; /* CRC32 for orphan inode block */ 5742784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim} __attribute__((packed)); 5752784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 5762784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 577036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For NODE structure 578036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 579036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_extent { 580bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 fofs; /* start file offset of the extent */ 581bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 blk_addr; /* start block address of the extent */ 582bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 len; /* lengh of the extent */ 583036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 584036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 585f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define F2FS_NAME_LEN 255 586cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define F2FS_INLINE_XATTR_ADDRS 50 /* 200 bytes for inline xattrs */ 587cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode */ 588603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim#define ADDRS_PER_INODE(i) addrs_per_inode(i) 589603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim#define DEF_ADDRS_PER_INODE_INLINE_XATTR \ 590603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim (DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS) 591036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */ 592036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block */ 593036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 594cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define NODE_DIR1_BLOCK (DEF_ADDRS_PER_INODE + 1) 595cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define NODE_DIR2_BLOCK (DEF_ADDRS_PER_INODE + 2) 596cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define NODE_IND1_BLOCK (DEF_ADDRS_PER_INODE + 3) 597cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define NODE_IND2_BLOCK (DEF_ADDRS_PER_INODE + 4) 598cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define NODE_DIND_BLOCK (DEF_ADDRS_PER_INODE + 5) 599cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim 600cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define F2FS_INLINE_XATTR 0x01 /* file inline xattr flag */ 601cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim#define F2FS_INLINE_DATA 0x02 /* file inline data flag */ 6026d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim#define F2FS_INLINE_DENTRY 0x04 /* file inline dentry flag */ 6037279f0383cfb7f34a79b1ced95c44186a2c36196Jaegeuk Kim#define F2FS_DATA_EXIST 0x08 /* file inline data exist flag */ 604f1e4f9c0e91104b2bd56ffd10c303b1bec172db1Jaegeuk Kim#define F2FS_INLINE_DOTS 0x10 /* file having implicit dot dentries */ 6056d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim 606603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim#define MAX_INLINE_DATA (sizeof(__le32) * \ 607603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim (DEF_ADDRS_PER_INODE_INLINE_XATTR - 1)) 608061ee67915ba3e8c86bde89a2efb1b8a9aadfb37Huajun Li 609061ee67915ba3e8c86bde89a2efb1b8a9aadfb37Huajun Li#define INLINE_DATA_OFFSET (PAGE_CACHE_SIZE - sizeof(struct node_footer) \ 610061ee67915ba3e8c86bde89a2efb1b8a9aadfb37Huajun Li - sizeof(__le32)*(DEF_ADDRS_PER_INODE + 5 - 1)) 611cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim 61299250ec1aa15ea329fb090fd8f4c1e7e7b50bba3Jaegeuk Kim#define DEF_DIR_LEVEL 0 61399250ec1aa15ea329fb090fd8f4c1e7e7b50bba3Jaegeuk Kim 614d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim/* 615d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim * i_advise uses FADVISE_XXX_BIT. We can add additional hints later. 616d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim */ 617d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim#define FADVISE_COLD_BIT 0x01 618d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim#define FADVISE_LOST_PINO_BIT 0x02 619d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim#define FADVISE_ENCRYPT_BIT 0x04 620f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim#define FADVISE_ENC_NAME_BIT 0x08 621d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim 622c4c65265da347bf98af6f080abf6d7081df09ea1Sheng Yong#define file_is_encrypt(fi) ((fi)->i_advise & FADVISE_ENCRYPT_BIT) 623f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim#define file_enc_name(fi) ((fi)->i_advise & FADVISE_ENC_NAME_BIT) 624d24f1bb16d6b4e48c8317700021fa037c482054cJaegeuk Kim 625036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_inode { 626bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 i_mode; /* file mode */ 627bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 i_advise; /* file hints */ 628cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim __u8 i_inline; /* file inline flags */ 629bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_uid; /* user ID */ 630bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_gid; /* group ID */ 631bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_links; /* links count */ 632bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_size; /* file size in bytes */ 633bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_blocks; /* file size in blocks */ 634bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_atime; /* access time */ 635bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_ctime; /* change time */ 636bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 i_mtime; /* modification time */ 637bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_atime_nsec; /* access time in nano scale */ 638bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_ctime_nsec; /* change time in nano scale */ 639bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_mtime_nsec; /* modification time in nano scale */ 640bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_generation; /* file version (for NFS) */ 641b5af7953f81018c9edd844bd1bc9f4f6752a756aJaegeuk Kim __le32 i_current_depth; /* only for directory depth */ 642bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 i_xattr_nid; /* nid to save xattr */ 643036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_flags; /* file attributes */ 644036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_pino; /* parent inode number */ 645036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_namelen; /* file name length */ 646f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim __u8 i_name[F2FS_NAME_LEN]; /* file name for SPOR */ 64799250ec1aa15ea329fb090fd8f4c1e7e7b50bba3Jaegeuk Kim __u8 i_dir_level; /* dentry_level for large dir */ 648036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 649036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_extent i_ext; /* caching a largest extent */ 650036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 651cd1e4704d0cbf1cbb49b3f33c576566b4b1e296eJaegeuk Kim __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */ 652036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 653036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 i_nid[5]; /* direct(2), indirect(2), 654036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim double_indirect(1) node id */ 655036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 656036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 657036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct direct_node { 6582784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 addr[ADDRS_PER_BLOCK]; /* array of data block address */ 659036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 660036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 661036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct indirect_node { 6622784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim __le32 nid[NIDS_PER_BLOCK]; /* array of data block address */ 663036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 664036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 6652784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimenum { 6662784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim COLD_BIT_SHIFT = 0, 6672784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim FSYNC_BIT_SHIFT, 6682784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim DENT_BIT_SHIFT, 6692784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim OFFSET_BIT_SHIFT 6702784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim}; 6712784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 6725cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim#define XATTR_NODE_OFFSET ((((unsigned int)-1) << OFFSET_BIT_SHIFT) \ 6735cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim >> OFFSET_BIT_SHIFT) 6745cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim 675036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct node_footer { 676bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 nid; /* node id */ 677bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ino; /* inode nunmber */ 678036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 flag; /* include cold/fsync/dentry marks and offset */ 679036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le64 cp_ver; /* checkpoint version */ 680036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 next_blkaddr; /* next node page block address */ 681036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 682036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 683036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_node { 684bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* can be one of three types: inode, direct, and indirect types */ 685036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 686036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_inode i; 687036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct direct_node dn; 688036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct indirect_node in; 689036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 690036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct node_footer footer; 691036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 692036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 693036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 694036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For NAT entries 695036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 6962784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define NAT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_nat_entry)) 697603f8f9d3628e8b81fea301e5f543a9f0b0d902dJaegeuk Kim#define NAT_BLOCK_OFFSET(start_nid) (start_nid / NAT_ENTRY_PER_BLOCK) 698036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 699036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_nat_entry { 700bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 version; /* latest version of cached nat entry */ 701bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ino; /* inode number */ 702bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 block_addr; /* block address */ 703036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 704036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 705036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_nat_block { 706036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_nat_entry entries[NAT_ENTRY_PER_BLOCK]; 707036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 708036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 709036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 710036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For SIT entries 711bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * 712bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * Each segment is 2MB in size by default so that a bitmap for validity of 713bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * there-in blocks should occupy 64 bytes, 512 bits. 714bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * Not allow to change this. 715036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 7162784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SIT_VBLOCK_MAP_SIZE 64 717036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry)) 718036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 71999b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* 720092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee * F2FS uses 4 bytes to represent block address. As a result, supported size of 721092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments. 722092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee */ 723092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee#define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2) 724ecc43cc53f2e532c32df6947b333bc669c453c4cJunling Zheng#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(ALIGN(F2FS_MAX_SEGMENT, \ 725ecc43cc53f2e532c32df6947b333bc669c453c4cJunling Zheng SIT_ENTRY_PER_BLOCK)) * \ 7263ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.blks_per_seg / 8) 727092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee 728092e3d9da37796daf439e94141c57886d6fc6e50Changman Lee/* 72999b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * Note that f2fs_sit_entry->vblocks has the following bit-field information. 73099b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * [15:10] : allocation type such as CURSEG_XXXX_TYPE 73199b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * [9:0] : valid block count 73299b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim */ 7332784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SIT_VBLOCKS_SHIFT 10 7342784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SIT_VBLOCKS_MASK ((1 << SIT_VBLOCKS_SHIFT) - 1) 7352784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GET_SIT_VBLOCKS(raw_sit) \ 7362784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim (le16_to_cpu((raw_sit)->vblocks) & SIT_VBLOCKS_MASK) 7372784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define GET_SIT_TYPE(raw_sit) \ 7382784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim ((le16_to_cpu((raw_sit)->vblocks) & ~SIT_VBLOCKS_MASK) \ 7392784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim >> SIT_VBLOCKS_SHIFT) 740bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 741036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_sit_entry { 742bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 vblocks; /* reference above */ 743bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 valid_map[SIT_VBLOCK_MAP_SIZE]; /* bitmap for valid blocks */ 744bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le64 mtime; /* segment age for cleaning */ 745036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 746036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 747036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_sit_block { 748036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_sit_entry entries[SIT_ENTRY_PER_BLOCK]; 749036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 750036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 7512784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim/* 75299b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * For segment summary 75399b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * 754bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * One summary block contains exactly 512 summary entries, which represents 755bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * exactly 2MB segment by default. Not allow to change the basic units. 756bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * 7572784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim * NOTE: For initializing fields, you must use set_summary 75899b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * 75999b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * - If data page, nid represents dnode's nid 76099b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * - If node page, nid represents the node page's nid. 76199b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * 76299b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * The ofs_in_node is used by only data page. It represents offset 76399b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * from node's page's beginning to get a data block address. 76499b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim * ex) data_blkaddr = (block_t)(nodepage_start_address + ofs_in_node) 76599b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim */ 766bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define ENTRIES_IN_SUM 512 7672784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SUMMARY_SIZE (7) /* sizeof(struct summary) */ 7682784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SUM_FOOTER_SIZE (5) /* sizeof(struct summary_footer) */ 7697f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee#define SUM_ENTRIES_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM) 770bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 771bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* a summary entry for a 4KB-sized block in a segment */ 772036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_summary { 773036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 nid; /* parent node id */ 774036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 775036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[3]; 776036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct { 777036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 version; /* node version number */ 77899b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim __le16 ofs_in_node; /* block index in parent node */ 779036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim } __attribute__((packed)); 780036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 781036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 782036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 783bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* summary block type, node or data, is stored to the summary_footer */ 784bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define SUM_TYPE_NODE (1) 785bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim#define SUM_TYPE_DATA (0) 786036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 787bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kimstruct summary_footer { 788bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim unsigned char entry_type; /* SUM_TYPE_XXX */ 7891952ab467c1a98060b7cca7e3545cf958c106b00Sheng Yong __le32 check_sum; /* summary checksum */ 790036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 791036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 7922784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE -\ 7937f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee SUM_ENTRIES_SIZE) 794036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\ 795036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct nat_journal_entry)) 796036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\ 797036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct nat_journal_entry)) 798036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\ 799036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct sit_journal_entry)) 800036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) %\ 801036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim sizeof(struct sit_journal_entry)) 802f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu 803f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu/* 804f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu * Reserved area should make size of f2fs_extra_info equals to 805f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu * that of nat_journal and sit_journal. 806f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu */ 807f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu#define EXTRA_INFO_RESERVED (SUM_JOURNAL_SIZE - 2 - 8) 808f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu 809bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* 810bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * frequently updated NAT/SIT entries can be stored in the spare area in 811bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim * summary blocks 812bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim */ 813036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimenum { 814036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim NAT_JOURNAL = 0, 815036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim SIT_JOURNAL 816036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim}; 817036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 818bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kimstruct nat_journal_entry { 819bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 nid; 820bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim struct f2fs_nat_entry ne; 821bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim} __attribute__((packed)); 822bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 823036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct nat_journal { 824036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct nat_journal_entry entries[NAT_JOURNAL_ENTRIES]; 825036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[NAT_JOURNAL_RESERVED]; 826036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 827036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 828bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kimstruct sit_journal_entry { 829bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 segno; 830bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim struct f2fs_sit_entry se; 831bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim} __attribute__((packed)); 832bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim 833036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct sit_journal { 834036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct sit_journal_entry entries[SIT_JOURNAL_ENTRIES]; 835036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[SIT_JOURNAL_RESERVED]; 836036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 837036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 838f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yustruct f2fs_extra_info { 839f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu __le64 kbytes_written; 840f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu __u8 reserved[EXTRA_INFO_RESERVED]; 841f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu} __attribute__((packed)); 842f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu 843f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yustruct f2fs_journal { 844036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 845036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 n_nats; 846036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le16 n_sits; 847036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 848f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu /* spare area is used by NAT or SIT journals or extra info */ 849036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim union { 850036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct nat_journal nat_j; 851036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct sit_journal sit_j; 852f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu struct f2fs_extra_info info; 853036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim }; 854f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu} __attribute__((packed)); 855f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu 856f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu/* 4KB-sized summary block structure */ 857f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yustruct f2fs_summary_block { 858f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu struct f2fs_summary entries[ENTRIES_IN_SUM]; 859f102ca4c3f421e04397ab2fab443ca43b86da385Chao Yu struct f2fs_journal journal; 860036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct summary_footer footer; 861036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 862036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 863036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim/* 864036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim * For directory operations 865036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim */ 8662784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_DOT_HASH 0 8672784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_DDOT_HASH F2FS_DOT_HASH 8682784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_MAX_HASH (~((0x3ULL) << 62)) 8692784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim#define F2FS_HASH_COL_BIT ((0x1ULL) << 63) 8702784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 8712784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kimtypedef __le32 f2fs_hash_t; 8722784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 87399b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* One directory entry slot covers 8bytes-long file name */ 874f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define F2FS_SLOT_LEN 8 875f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define F2FS_SLOT_LEN_BITS 3 8762784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim 877f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim#define GET_DENTRY_SLOTS(x) ((x + F2FS_SLOT_LEN - 1) >> F2FS_SLOT_LEN_BITS) 87899b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim 87999b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* the number of dentry in a block */ 88099b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim#define NR_DENTRY_IN_BLOCK 214 88199b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim 88299b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim/* MAX level for dir lookup */ 88399b74393403aab847587d6c37cd1aaf1d935a81dJaegeuk Kim#define MAX_DIR_HASH_DEPTH 63 884036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 885c8327c909f28fa306c99d262319fa8d2ce8a4324Chao Yu/* MAX buckets in one level of dir */ 886c8327c909f28fa306c99d262319fa8d2ce8a4324Chao Yu#define MAX_DIR_BUCKETS (1 << ((MAX_DIR_HASH_DEPTH / 2) - 1)) 887c8327c909f28fa306c99d262319fa8d2ce8a4324Chao Yu 888036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIZE_OF_DIR_ENTRY 11 /* by byte */ 889036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \ 8902784bd55dd9730f3a5d2126c82094990fad053c1Jaegeuk Kim BITS_PER_BYTE) 891036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \ 892f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim F2FS_SLOT_LEN) * \ 893036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) 894036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 895f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim/* One directory entry slot representing F2FS_SLOT_LEN-sized file name */ 896036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_dir_entry { 897036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __le32 hash_code; /* hash code of file name */ 898bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le32 ino; /* inode number */ 899bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __le16 name_len; /* lengh of file name */ 900bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim __u8 file_type; /* file type */ 901036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 902036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 903bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* 4KB-sized directory entry block */ 904036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kimstruct f2fs_dentry_block { 905bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim /* validity bitmap for directory entries in each block */ 906036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP]; 907036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim __u8 reserved[SIZE_OF_RESERVED]; 908036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim struct f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK]; 909f5f440f08643f6b35ad0dd70a54805a5383c4a62Jaegeuk Kim __u8 filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN]; 910036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim} __attribute__((packed)); 911036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 9126d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim/* for inline dir */ 9136d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim#define NR_INLINE_DENTRY (MAX_INLINE_DATA * BITS_PER_BYTE / \ 9146d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ 9156d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim BITS_PER_BYTE + 1)) 9166d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim#define INLINE_DENTRY_BITMAP_SIZE ((NR_INLINE_DENTRY + \ 9176d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim BITS_PER_BYTE - 1) / BITS_PER_BYTE) 9186d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim#define INLINE_RESERVED_SIZE (MAX_INLINE_DATA - \ 9196d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ 9206d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim NR_INLINE_DENTRY + INLINE_DENTRY_BITMAP_SIZE)) 9216d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim 9226d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim/* inline directory entry structure */ 9236d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kimstruct f2fs_inline_dentry { 9246d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim __u8 dentry_bitmap[INLINE_DENTRY_BITMAP_SIZE]; 9256d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim __u8 reserved[INLINE_RESERVED_SIZE]; 9266d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim struct f2fs_dir_entry dentry[NR_INLINE_DENTRY]; 9276d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim __u8 filename[NR_INLINE_DENTRY][F2FS_SLOT_LEN]; 9289691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal} __attribute__((packed)); 9296d8864014fd7038cefd7969b35672c6b881681fdJaegeuk Kim 930bbf6e62360d8eae415dc7d19325b7d70079db0e1Jaegeuk Kim/* file types used in inode_info->flags */ 9317f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeenum FILE_TYPE { 932036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim F2FS_FT_UNKNOWN, 93376a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_REG_FILE, 93476a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_DIR, 93576a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_CHRDEV, 93676a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_BLKDEV, 93776a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_FIFO, 93876a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_SOCK, 93976a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_SYMLINK, 94076a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_MAX, 9417f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee /* added for fsck */ 94276a069430a295a27bf478d4a5d2fd71112a11a54Jaegeuk Kim F2FS_FT_ORPHAN, 9435cd7001f5dfaf1c7f275826c44dcf203d49f4cceJaegeuk Kim F2FS_FT_XATTR, 944056e4b04fc44a006d5529bafbf87b1d73296c665JP Abgrall F2FS_FT_LAST_FILE_TYPE = F2FS_FT_XATTR, 945036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim}; 946036d45e551ca5405c726f8ccb51f446620cd4afJaegeuk Kim 9477f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee/* from f2fs/segment.h */ 9487f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeenum { 9497f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee LFS = 0, 9507f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee SSR 9517f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee}; 9527f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 9539e5c021b679ebd54c719d68e8b5e6b5614fbf127Jaegeuk Kimextern int utf8_to_utf16(u_int16_t *, const char *, size_t, size_t); 9549e5c021b679ebd54c719d68e8b5e6b5614fbf127Jaegeuk Kimextern int utf16_to_utf8(char *, const u_int16_t *, size_t, size_t); 9557f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int log_base_2(u_int32_t); 956465e4e7f10f59efba184fdd0788e92ea1488011cJaegeuk Kimextern unsigned int addrs_per_inode(struct f2fs_inode *); 9577f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 9587f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int get_bits_in_byte(unsigned char n); 959b008605e994ad0eec5e1680b6921dc9d9d5da355Jaegeuk Kimextern int test_and_set_bit_le(u32, u8 *); 960b008605e994ad0eec5e1680b6921dc9d9d5da355Jaegeuk Kimextern int test_and_clear_bit_le(u32, u8 *); 961b008605e994ad0eec5e1680b6921dc9d9d5da355Jaegeuk Kimextern int test_bit_le(u32, const u8 *); 9627f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int f2fs_test_bit(unsigned int, const char *); 9637f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int f2fs_set_bit(unsigned int, char *); 9647f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int f2fs_clear_bit(unsigned int, char *); 965dbe78ae5297f5507472eedc3bfc59d658632c3e4Chao Yuextern u64 find_next_bit_le(const u8 *, u64, u64); 966dbe78ae5297f5507472eedc3bfc59d658632c3e4Chao Yuextern u64 find_next_zero_bit_le(const u8 *, u64, u64); 9677f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Lee 9687f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern u_int32_t f2fs_cal_crc32(u_int32_t, void *, int); 9697f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int f2fs_crc_valid(u_int32_t blk_crc, void *buf, int len); 970e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 9713ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kimextern void f2fs_init_configuration(void); 972de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern int f2fs_devs_are_umounted(void); 973de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern int f2fs_dev_is_umounted(char *); 9743ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kimextern int f2fs_get_device_info(void); 975de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern int get_device_info(int); 9763ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kimextern void f2fs_finalize_device(void); 977e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 9787f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int dev_read(void *, __u64, size_t); 9797f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int dev_write(void *, __u64, size_t); 980634dfb15526b3a70a6454e6573693a11f8a94ceaJaegeuk Kimextern int dev_write_block(void *, __u64); 9816cd2c51c205b039e71fe0ffe695d6c7a8864bae4Jaegeuk Kimextern int dev_write_dump(void *, __u64, size_t); 982a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrall/* All bytes in the buffer must be 0 use dev_fill(). */ 983a35529fce0c5171562ec0ebebcc6120d1604924bJP Abgrallextern int dev_fill(void *, __u64, size_t); 98479b1858e791c0d9ce6c4c693140e833023d74d42Jaegeuk Kimextern int dev_fill_block(void *, __u64); 985e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 9867f35b548d4b0e3c8577ad7a09433e589a0ab3f2aChangman Leeextern int dev_read_block(void *, __u64); 987631f8166bb1634d543a443479513a175cc260f16Jaegeuk Kimextern int dev_reada_block(__u64); 988e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 9896fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kimextern int dev_read_version(void *, __u64, size_t); 9906fa2547e04d194141ef760564d3119b7c112aac8Jaegeuk Kimextern void get_kernel_version(__u8 *); 991f46078949bdc58736170a2c85ea5b8bd3bcefa25Jaegeuk Kimf2fs_hash_t f2fs_dentry_hash(const unsigned char *, int); 992e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 9939691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define F2FS_ZONED_NONE 0 9949691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define F2FS_ZONED_HA 1 9959691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define F2FS_ZONED_HM 2 9969691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 9979691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#ifdef HAVE_LINUX_BLKZONED_H 9989691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 9999691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_type(z) (z)->type 10009691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_conv(z) ((z)->type == BLK_ZONE_TYPE_CONVENTIONAL) 10019691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_seq_req(z) ((z)->type == BLK_ZONE_TYPE_SEQWRITE_REQ) 10029691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_seq_pref(z) ((z)->type == BLK_ZONE_TYPE_SEQWRITE_PREF) 10039691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_seq(z) (blk_zone_seq_req(z) || blk_zone_seq_pref(z)) 10049691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 10059691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moalstatic inline const char * 10069691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moalblk_zone_type_str(struct blk_zone *blkz) 10079691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal{ 10089691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal switch (blk_zone_type(blkz)) { 10099691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_TYPE_CONVENTIONAL: 10109691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return( "Conventional" ); 10119691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_TYPE_SEQWRITE_REQ: 10129691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return( "Sequential-write-required" ); 10139691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_TYPE_SEQWRITE_PREF: 10149691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return( "Sequential-write-preferred" ); 10159691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal } 10169691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return( "Unknown-type" ); 10179691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal} 10189691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 10199691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_cond(z) (z)->cond 10209691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 10219691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moalstatic inline const char * 10229691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moalblk_zone_cond_str(struct blk_zone *blkz) 10239691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal{ 10249691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal switch (blk_zone_cond(blkz)) { 10259691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_NOT_WP: 10269691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Not-write-pointer"; 10279691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_EMPTY: 10289691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Empty"; 10299691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_IMP_OPEN: 10309691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Implicit-open"; 10319691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_EXP_OPEN: 10329691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Explicit-open"; 10339691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_CLOSED: 10349691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Closed"; 10359691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_READONLY: 10369691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Read-only"; 10379691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_FULL: 10389691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Full"; 10399691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal case BLK_ZONE_COND_OFFLINE: 10409691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Offline"; 10419691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal } 10429691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal return "Unknown-cond"; 10439691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal} 10449691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 10459691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_empty(z) (blk_zone_cond(z) == BLK_ZONE_COND_EMPTY) 10469691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 10479691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_sector(z) (z)->start 10489691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_length(z) (z)->len 10499691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_wp_sector(z) (z)->wp 10509691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_need_reset(z) (int)(z)->reset 10519691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#define blk_zone_non_seq(z) (int)(z)->non_seq 10529691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 10539691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal#endif 10549691420a990b81895c47b08be14b74d5ce8f8da4Damien Le Moal 1055de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern void f2fs_get_zoned_model(int); 1056de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern int f2fs_get_zone_blocks(int); 1057de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern int f2fs_check_zones(int); 1058de7e07e011004a0264e27d7134ee32cbcd9695ecJaegeuk Kimextern int f2fs_reset_zones(int); 105974673eb7e6f223ce4023494b48915aa4371b3ef4Jaegeuk Kim 10603ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kimextern struct f2fs_configuration c; 1061e69e4378500b836863dfb7f6e88e39935f23ae80Jaegeuk Kim 1062370a24287e9b499f0776c4ac15b817373f69dbc4Changman Lee#define ALIGN(val, size) ((val) + (size) - 1) / (size) 10633ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim#define SEG_ALIGN(blks) ALIGN(blks, c.blks_per_seg) 10643ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim#define ZONE_ALIGN(blks) ALIGN(blks, c.blks_per_seg * \ 10653ffc5a8f3ea0a70e247d1b1b222ad27f20716bddJaegeuk Kim c.segs_per_zone) 1066370a24287e9b499f0776c4ac15b817373f69dbc4Changman Lee 1067c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kimstatic inline double get_best_overprovision(struct f2fs_super_block *sb) 1068c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim{ 1069c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim double reserved, ovp, candidate, end, diff, space; 1070c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim double max_ovp = 0, max_space = 0; 1071c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim 1072c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim if (get_sb(segment_count_main) < 256) { 1073c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim candidate = 10; 1074c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim end = 95; 1075c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim diff = 5; 1076c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim } else { 1077c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim candidate = 0.01; 1078c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim end = 10; 1079c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim diff = 0.01; 1080c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim } 1081c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim 1082c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim for (; candidate <= end; candidate += diff) { 1083c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim reserved = (2 * (100 / candidate + 1) + 6) * 1084c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim get_sb(segs_per_sec); 1085c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim ovp = (get_sb(segment_count_main) - reserved) * candidate / 100; 1086c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim space = get_sb(segment_count_main) - reserved - ovp; 1087c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim if (max_space < space) { 1088c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim max_space = space; 1089c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim max_ovp = candidate; 1090c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim } 1091c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim } 1092c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim return max_ovp; 1093c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim} 1094c8ce2bf7b1416d65655786a44187f10a0479c6e2Jaegeuk Kim 1095f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kimstatic inline __le64 get_cp_crc(struct f2fs_checkpoint *cp) 1096f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim{ 1097f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim u_int64_t cp_ver = get_cp(checkpoint_ver); 1098f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim size_t crc_offset = get_cp(checksum_offset); 1099f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim u_int32_t crc = le32_to_cpu(*(__le32 *)((unsigned char *)cp + 1100f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim crc_offset)); 1101f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim 1102f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim cp_ver |= ((u_int64_t)crc << 32); 1103f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim return cpu_to_le64(cp_ver); 1104f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim} 1105f070415c0bededac9ca300e4cac1560bbbd9d44fJaegeuk Kim 11065043dffbd1d2b89c71966dde31780b0ca313b5c9Jaegeuk Kim#endif /*__F2FS_FS_H */ 1107