dir.c (5d0c667121bfc8be76d1580f485bddbe73465d1a) | dir.c (3843154598a00408f4214a68bd536fdf27b1df10) |
---|---|
1/* 2 * fs/f2fs/dir.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 7 unchanged lines hidden (view full) --- 16#include "xattr.h" 17 18static unsigned long dir_blocks(struct inode *inode) 19{ 20 return ((unsigned long long) (i_size_read(inode) + PAGE_CACHE_SIZE - 1)) 21 >> PAGE_CACHE_SHIFT; 22} 23 | 1/* 2 * fs/f2fs/dir.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 7 unchanged lines hidden (view full) --- 16#include "xattr.h" 17 18static unsigned long dir_blocks(struct inode *inode) 19{ 20 return ((unsigned long long) (i_size_read(inode) + PAGE_CACHE_SIZE - 1)) 21 >> PAGE_CACHE_SHIFT; 22} 23 |
24static unsigned int dir_buckets(unsigned int level) | 24static unsigned int dir_buckets(unsigned int level, int dir_level) |
25{ 26 if (level < MAX_DIR_HASH_DEPTH / 2) | 25{ 26 if (level < MAX_DIR_HASH_DEPTH / 2) |
27 return 1 << level; | 27 return 1 << (level + dir_level); |
28 else | 28 else |
29 return 1 << ((MAX_DIR_HASH_DEPTH / 2) - 1); | 29 return 1 << ((MAX_DIR_HASH_DEPTH / 2 + dir_level) - 1); |
30} 31 32static unsigned int bucket_blocks(unsigned int level) 33{ 34 if (level < MAX_DIR_HASH_DEPTH / 2) 35 return 2; 36 else 37 return 4; --- 22 unchanged lines hidden (view full) --- 60}; 61 62static void set_de_type(struct f2fs_dir_entry *de, struct inode *inode) 63{ 64 umode_t mode = inode->i_mode; 65 de->file_type = f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT]; 66} 67 | 30} 31 32static unsigned int bucket_blocks(unsigned int level) 33{ 34 if (level < MAX_DIR_HASH_DEPTH / 2) 35 return 2; 36 else 37 return 4; --- 22 unchanged lines hidden (view full) --- 60}; 61 62static void set_de_type(struct f2fs_dir_entry *de, struct inode *inode) 63{ 64 umode_t mode = inode->i_mode; 65 de->file_type = f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT]; 66} 67 |
68static unsigned long dir_block_index(unsigned int level, unsigned int idx) | 68static unsigned long dir_block_index(unsigned int level, 69 int dir_level, unsigned int idx) |
69{ 70 unsigned long i; 71 unsigned long bidx = 0; 72 73 for (i = 0; i < level; i++) | 70{ 71 unsigned long i; 72 unsigned long bidx = 0; 73 74 for (i = 0; i < level; i++) |
74 bidx += dir_buckets(i) * bucket_blocks(i); | 75 bidx += dir_buckets(i, dir_level) * bucket_blocks(i); |
75 bidx += idx * bucket_blocks(level); 76 return bidx; 77} 78 79static bool early_match_name(const char *name, size_t namelen, 80 f2fs_hash_t namehash, struct f2fs_dir_entry *de) 81{ 82 if (le16_to_cpu(de->name_len) != namelen) --- 55 unchanged lines hidden (view full) --- 138 unsigned int bidx, end_block; 139 struct page *dentry_page; 140 struct f2fs_dir_entry *de = NULL; 141 bool room = false; 142 int max_slots = 0; 143 144 f2fs_bug_on(level > MAX_DIR_HASH_DEPTH); 145 | 76 bidx += idx * bucket_blocks(level); 77 return bidx; 78} 79 80static bool early_match_name(const char *name, size_t namelen, 81 f2fs_hash_t namehash, struct f2fs_dir_entry *de) 82{ 83 if (le16_to_cpu(de->name_len) != namelen) --- 55 unchanged lines hidden (view full) --- 139 unsigned int bidx, end_block; 140 struct page *dentry_page; 141 struct f2fs_dir_entry *de = NULL; 142 bool room = false; 143 int max_slots = 0; 144 145 f2fs_bug_on(level > MAX_DIR_HASH_DEPTH); 146 |
146 nbucket = dir_buckets(level); | 147 nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level); |
147 nblock = bucket_blocks(level); 148 | 148 nblock = bucket_blocks(level); 149 |
149 bidx = dir_block_index(level, le32_to_cpu(namehash) % nbucket); | 150 bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level, 151 le32_to_cpu(namehash) % nbucket); |
150 end_block = bidx + nblock; 151 152 for (; bidx < end_block; bidx++) { 153 /* no need to allocate new dentry pages to all the indices */ 154 dentry_page = find_data_page(dir, bidx, true); 155 if (IS_ERR(dentry_page)) { 156 room = true; 157 continue; --- 304 unchanged lines hidden (view full) --- 462start: 463 if (unlikely(current_depth == MAX_DIR_HASH_DEPTH)) 464 return -ENOSPC; 465 466 /* Increase the depth, if required */ 467 if (level == current_depth) 468 ++current_depth; 469 | 152 end_block = bidx + nblock; 153 154 for (; bidx < end_block; bidx++) { 155 /* no need to allocate new dentry pages to all the indices */ 156 dentry_page = find_data_page(dir, bidx, true); 157 if (IS_ERR(dentry_page)) { 158 room = true; 159 continue; --- 304 unchanged lines hidden (view full) --- 464start: 465 if (unlikely(current_depth == MAX_DIR_HASH_DEPTH)) 466 return -ENOSPC; 467 468 /* Increase the depth, if required */ 469 if (level == current_depth) 470 ++current_depth; 471 |
470 nbucket = dir_buckets(level); | 472 nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level); |
471 nblock = bucket_blocks(level); 472 | 473 nblock = bucket_blocks(level); 474 |
473 bidx = dir_block_index(level, (le32_to_cpu(dentry_hash) % nbucket)); | 475 bidx = dir_block_index(level, F2FS_I(dir)->i_dir_level, 476 (le32_to_cpu(dentry_hash) % nbucket)); |
474 475 for (block = bidx; block <= (bidx + nblock - 1); block++) { 476 dentry_page = get_new_data_page(dir, NULL, block, true); 477 if (IS_ERR(dentry_page)) 478 return PTR_ERR(dentry_page); 479 480 dentry_blk = kmap(dentry_page); 481 bit_pos = room_for_filename(dentry_blk, slots); --- 205 unchanged lines hidden --- | 477 478 for (block = bidx; block <= (bidx + nblock - 1); block++) { 479 dentry_page = get_new_data_page(dir, NULL, block, true); 480 if (IS_ERR(dentry_page)) 481 return PTR_ERR(dentry_page); 482 483 dentry_blk = kmap(dentry_page); 484 bit_pos = room_for_filename(dentry_blk, slots); --- 205 unchanged lines hidden --- |