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 ---