diff options
author | David S. Miller <davem@davemloft.net> | 2008-07-18 05:39:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-18 05:39:39 -0400 |
commit | 49997d75152b3d23c53b0fa730599f2f74c92c65 (patch) | |
tree | 46e93126170d02cfec9505172e545732c1b69656 /fs/ext4/namei.c | |
parent | a0c80b80e0fb48129e4e9d6a9ede914f9ff1850d (diff) | |
parent | 5b664cb235e97afbf34db9c4d77f08ebd725335e (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
Documentation/powerpc/booting-without-of.txt
drivers/atm/Makefile
drivers/net/fs_enet/fs_enet-main.c
drivers/pci/pci-acpi.c
net/8021q/vlan.c
net/iucv/iucv.c
Diffstat (limited to 'fs/ext4/namei.c')
-rw-r--r-- | fs/ext4/namei.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index ab16beaa830d..387ad98350c3 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -183,6 +183,16 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | |||
183 | struct inode *inode); | 183 | struct inode *inode); |
184 | 184 | ||
185 | /* | 185 | /* |
186 | * p is at least 6 bytes before the end of page | ||
187 | */ | ||
188 | static inline struct ext4_dir_entry_2 * | ||
189 | ext4_next_entry(struct ext4_dir_entry_2 *p) | ||
190 | { | ||
191 | return (struct ext4_dir_entry_2 *)((char *)p + | ||
192 | ext4_rec_len_from_disk(p->rec_len)); | ||
193 | } | ||
194 | |||
195 | /* | ||
186 | * Future: use high four bits of block for coalesce-on-delete flags | 196 | * Future: use high four bits of block for coalesce-on-delete flags |
187 | * Mask them off for now. | 197 | * Mask them off for now. |
188 | */ | 198 | */ |
@@ -231,13 +241,13 @@ static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) | |||
231 | { | 241 | { |
232 | unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(1) - | 242 | unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(1) - |
233 | EXT4_DIR_REC_LEN(2) - infosize; | 243 | EXT4_DIR_REC_LEN(2) - infosize; |
234 | return 0? 20: entry_space / sizeof(struct dx_entry); | 244 | return entry_space / sizeof(struct dx_entry); |
235 | } | 245 | } |
236 | 246 | ||
237 | static inline unsigned dx_node_limit (struct inode *dir) | 247 | static inline unsigned dx_node_limit (struct inode *dir) |
238 | { | 248 | { |
239 | unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(0); | 249 | unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(0); |
240 | return 0? 22: entry_space / sizeof(struct dx_entry); | 250 | return entry_space / sizeof(struct dx_entry); |
241 | } | 251 | } |
242 | 252 | ||
243 | /* | 253 | /* |
@@ -554,15 +564,6 @@ static int ext4_htree_next_block(struct inode *dir, __u32 hash, | |||
554 | 564 | ||
555 | 565 | ||
556 | /* | 566 | /* |
557 | * p is at least 6 bytes before the end of page | ||
558 | */ | ||
559 | static inline struct ext4_dir_entry_2 *ext4_next_entry(struct ext4_dir_entry_2 *p) | ||
560 | { | ||
561 | return (struct ext4_dir_entry_2 *)((char *)p + | ||
562 | ext4_rec_len_from_disk(p->rec_len)); | ||
563 | } | ||
564 | |||
565 | /* | ||
566 | * This function fills a red-black tree with information from a | 567 | * This function fills a red-black tree with information from a |
567 | * directory block. It returns the number directory entries loaded | 568 | * directory block. It returns the number directory entries loaded |
568 | * into the tree. If there is an error it is returned in err. | 569 | * into the tree. If there is an error it is returned in err. |
@@ -993,19 +994,21 @@ static struct buffer_head * ext4_dx_find_entry(struct dentry *dentry, | |||
993 | de = (struct ext4_dir_entry_2 *) bh->b_data; | 994 | de = (struct ext4_dir_entry_2 *) bh->b_data; |
994 | top = (struct ext4_dir_entry_2 *) ((char *) de + sb->s_blocksize - | 995 | top = (struct ext4_dir_entry_2 *) ((char *) de + sb->s_blocksize - |
995 | EXT4_DIR_REC_LEN(0)); | 996 | EXT4_DIR_REC_LEN(0)); |
996 | for (; de < top; de = ext4_next_entry(de)) | 997 | for (; de < top; de = ext4_next_entry(de)) { |
997 | if (ext4_match (namelen, name, de)) { | 998 | int off = (block << EXT4_BLOCK_SIZE_BITS(sb)) |
998 | if (!ext4_check_dir_entry("ext4_find_entry", | 999 | + ((char *) de - bh->b_data); |
999 | dir, de, bh, | 1000 | |
1000 | (block<<EXT4_BLOCK_SIZE_BITS(sb)) | 1001 | if (!ext4_check_dir_entry(__func__, dir, de, bh, off)) { |
1001 | +((char *)de - bh->b_data))) { | 1002 | brelse(bh); |
1002 | brelse (bh); | ||
1003 | *err = ERR_BAD_DX_DIR; | 1003 | *err = ERR_BAD_DX_DIR; |
1004 | goto errout; | 1004 | goto errout; |
1005 | } | 1005 | } |
1006 | *res_dir = de; | 1006 | |
1007 | dx_release (frames); | 1007 | if (ext4_match(namelen, name, de)) { |
1008 | return bh; | 1008 | *res_dir = de; |
1009 | dx_release(frames); | ||
1010 | return bh; | ||
1011 | } | ||
1009 | } | 1012 | } |
1010 | brelse (bh); | 1013 | brelse (bh); |
1011 | /* Check to see if we should continue to search */ | 1014 | /* Check to see if we should continue to search */ |