diff options
Diffstat (limited to 'fs/ext4/namei.c')
-rw-r--r-- | fs/ext4/namei.c | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 0c070fabd108..a43e6617b351 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -187,7 +187,7 @@ unsigned int ext4_rec_len_from_disk(__le16 dlen, unsigned blocksize) | |||
187 | return blocksize; | 187 | return blocksize; |
188 | return (len & 65532) | ((len & 3) << 16); | 188 | return (len & 65532) | ((len & 3) << 16); |
189 | } | 189 | } |
190 | 190 | ||
191 | __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) | 191 | __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) |
192 | { | 192 | { |
193 | if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3)) | 193 | if ((len > blocksize) || (blocksize > (1 << 18)) || (len & 3)) |
@@ -197,7 +197,7 @@ __le16 ext4_rec_len_to_disk(unsigned len, unsigned blocksize) | |||
197 | if (len == blocksize) { | 197 | if (len == blocksize) { |
198 | if (blocksize == 65536) | 198 | if (blocksize == 65536) |
199 | return cpu_to_le16(EXT4_MAX_REC_LEN); | 199 | return cpu_to_le16(EXT4_MAX_REC_LEN); |
200 | else | 200 | else |
201 | return cpu_to_le16(0); | 201 | return cpu_to_le16(0); |
202 | } | 202 | } |
203 | return cpu_to_le16((len & 65532) | ((len >> 16) & 3)); | 203 | return cpu_to_le16((len & 65532) | ((len >> 16) & 3)); |
@@ -349,7 +349,7 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, | |||
349 | brelse(bh); | 349 | brelse(bh); |
350 | } | 350 | } |
351 | if (bcount) | 351 | if (bcount) |
352 | printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n", | 352 | printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n", |
353 | levels ? "" : " ", names, space/bcount, | 353 | levels ? "" : " ", names, space/bcount, |
354 | (space/bcount)*100/blocksize); | 354 | (space/bcount)*100/blocksize); |
355 | return (struct stats) { names, space, bcount}; | 355 | return (struct stats) { names, space, bcount}; |
@@ -653,10 +653,10 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, | |||
653 | int ret, err; | 653 | int ret, err; |
654 | __u32 hashval; | 654 | __u32 hashval; |
655 | 655 | ||
656 | dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", | 656 | dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", |
657 | start_hash, start_minor_hash)); | 657 | start_hash, start_minor_hash)); |
658 | dir = dir_file->f_path.dentry->d_inode; | 658 | dir = dir_file->f_path.dentry->d_inode; |
659 | if (!(EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) { | 659 | if (!(ext4_test_inode_flag(dir, EXT4_INODE_INDEX))) { |
660 | hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version; | 660 | hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version; |
661 | if (hinfo.hash_version <= DX_HASH_TEA) | 661 | if (hinfo.hash_version <= DX_HASH_TEA) |
662 | hinfo.hash_version += | 662 | hinfo.hash_version += |
@@ -801,7 +801,7 @@ static void ext4_update_dx_flag(struct inode *inode) | |||
801 | { | 801 | { |
802 | if (!EXT4_HAS_COMPAT_FEATURE(inode->i_sb, | 802 | if (!EXT4_HAS_COMPAT_FEATURE(inode->i_sb, |
803 | EXT4_FEATURE_COMPAT_DIR_INDEX)) | 803 | EXT4_FEATURE_COMPAT_DIR_INDEX)) |
804 | EXT4_I(inode)->i_flags &= ~EXT4_INDEX_FL; | 804 | ext4_clear_inode_flag(inode, EXT4_INODE_INDEX); |
805 | } | 805 | } |
806 | 806 | ||
807 | /* | 807 | /* |
@@ -943,8 +943,8 @@ restart: | |||
943 | wait_on_buffer(bh); | 943 | wait_on_buffer(bh); |
944 | if (!buffer_uptodate(bh)) { | 944 | if (!buffer_uptodate(bh)) { |
945 | /* read error, skip block & hope for the best */ | 945 | /* read error, skip block & hope for the best */ |
946 | ext4_error(sb, "reading directory #%lu offset %lu", | 946 | EXT4_ERROR_INODE(dir, "reading directory lblock %lu", |
947 | dir->i_ino, (unsigned long)block); | 947 | (unsigned long) block); |
948 | brelse(bh); | 948 | brelse(bh); |
949 | goto next; | 949 | goto next; |
950 | } | 950 | } |
@@ -1066,15 +1066,15 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru | |||
1066 | __u32 ino = le32_to_cpu(de->inode); | 1066 | __u32 ino = le32_to_cpu(de->inode); |
1067 | brelse(bh); | 1067 | brelse(bh); |
1068 | if (!ext4_valid_inum(dir->i_sb, ino)) { | 1068 | if (!ext4_valid_inum(dir->i_sb, ino)) { |
1069 | ext4_error(dir->i_sb, "bad inode number: %u", ino); | 1069 | EXT4_ERROR_INODE(dir, "bad inode number: %u", ino); |
1070 | return ERR_PTR(-EIO); | 1070 | return ERR_PTR(-EIO); |
1071 | } | 1071 | } |
1072 | inode = ext4_iget(dir->i_sb, ino); | 1072 | inode = ext4_iget(dir->i_sb, ino); |
1073 | if (unlikely(IS_ERR(inode))) { | 1073 | if (unlikely(IS_ERR(inode))) { |
1074 | if (PTR_ERR(inode) == -ESTALE) { | 1074 | if (PTR_ERR(inode) == -ESTALE) { |
1075 | ext4_error(dir->i_sb, | 1075 | EXT4_ERROR_INODE(dir, |
1076 | "deleted inode referenced: %u", | 1076 | "deleted inode referenced: %u", |
1077 | ino); | 1077 | ino); |
1078 | return ERR_PTR(-EIO); | 1078 | return ERR_PTR(-EIO); |
1079 | } else { | 1079 | } else { |
1080 | return ERR_CAST(inode); | 1080 | return ERR_CAST(inode); |
@@ -1104,8 +1104,8 @@ struct dentry *ext4_get_parent(struct dentry *child) | |||
1104 | brelse(bh); | 1104 | brelse(bh); |
1105 | 1105 | ||
1106 | if (!ext4_valid_inum(child->d_inode->i_sb, ino)) { | 1106 | if (!ext4_valid_inum(child->d_inode->i_sb, ino)) { |
1107 | ext4_error(child->d_inode->i_sb, | 1107 | EXT4_ERROR_INODE(child->d_inode, |
1108 | "bad inode number: %u", ino); | 1108 | "bad parent inode number: %u", ino); |
1109 | return ERR_PTR(-EIO); | 1109 | return ERR_PTR(-EIO); |
1110 | } | 1110 | } |
1111 | 1111 | ||
@@ -1141,7 +1141,7 @@ dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count, | |||
1141 | unsigned rec_len = 0; | 1141 | unsigned rec_len = 0; |
1142 | 1142 | ||
1143 | while (count--) { | 1143 | while (count--) { |
1144 | struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) | 1144 | struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) |
1145 | (from + (map->offs<<2)); | 1145 | (from + (map->offs<<2)); |
1146 | rec_len = EXT4_DIR_REC_LEN(de->name_len); | 1146 | rec_len = EXT4_DIR_REC_LEN(de->name_len); |
1147 | memcpy (to, de, rec_len); | 1147 | memcpy (to, de, rec_len); |
@@ -1404,9 +1404,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
1404 | de = (struct ext4_dir_entry_2 *)((char *)fde + | 1404 | de = (struct ext4_dir_entry_2 *)((char *)fde + |
1405 | ext4_rec_len_from_disk(fde->rec_len, blocksize)); | 1405 | ext4_rec_len_from_disk(fde->rec_len, blocksize)); |
1406 | if ((char *) de >= (((char *) root) + blocksize)) { | 1406 | if ((char *) de >= (((char *) root) + blocksize)) { |
1407 | ext4_error(dir->i_sb, | 1407 | EXT4_ERROR_INODE(dir, "invalid rec_len for '..'"); |
1408 | "invalid rec_len for '..' in inode %lu", | ||
1409 | dir->i_ino); | ||
1410 | brelse(bh); | 1408 | brelse(bh); |
1411 | return -EIO; | 1409 | return -EIO; |
1412 | } | 1410 | } |
@@ -1418,7 +1416,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
1418 | brelse(bh); | 1416 | brelse(bh); |
1419 | return retval; | 1417 | return retval; |
1420 | } | 1418 | } |
1421 | EXT4_I(dir)->i_flags |= EXT4_INDEX_FL; | 1419 | ext4_set_inode_flag(dir, EXT4_INODE_INDEX); |
1422 | data1 = bh2->b_data; | 1420 | data1 = bh2->b_data; |
1423 | 1421 | ||
1424 | memcpy (data1, de, len); | 1422 | memcpy (data1, de, len); |
@@ -1491,7 +1489,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
1491 | retval = ext4_dx_add_entry(handle, dentry, inode); | 1489 | retval = ext4_dx_add_entry(handle, dentry, inode); |
1492 | if (!retval || (retval != ERR_BAD_DX_DIR)) | 1490 | if (!retval || (retval != ERR_BAD_DX_DIR)) |
1493 | return retval; | 1491 | return retval; |
1494 | EXT4_I(dir)->i_flags &= ~EXT4_INDEX_FL; | 1492 | ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); |
1495 | dx_fallback++; | 1493 | dx_fallback++; |
1496 | ext4_mark_inode_dirty(handle, dir); | 1494 | ext4_mark_inode_dirty(handle, dir); |
1497 | } | 1495 | } |
@@ -1519,6 +1517,8 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
1519 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); | 1517 | de->rec_len = ext4_rec_len_to_disk(blocksize, blocksize); |
1520 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | 1518 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); |
1521 | brelse(bh); | 1519 | brelse(bh); |
1520 | if (retval == 0) | ||
1521 | ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); | ||
1522 | return retval; | 1522 | return retval; |
1523 | } | 1523 | } |
1524 | 1524 | ||
@@ -1915,9 +1915,8 @@ static int empty_dir(struct inode *inode) | |||
1915 | if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) || | 1915 | if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) || |
1916 | !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { | 1916 | !(bh = ext4_bread(NULL, inode, 0, 0, &err))) { |
1917 | if (err) | 1917 | if (err) |
1918 | ext4_error(inode->i_sb, | 1918 | EXT4_ERROR_INODE(inode, |
1919 | "error %d reading directory #%lu offset 0", | 1919 | "error %d reading directory lblock 0", err); |
1920 | err, inode->i_ino); | ||
1921 | else | 1920 | else |
1922 | ext4_warning(inode->i_sb, | 1921 | ext4_warning(inode->i_sb, |
1923 | "bad directory (dir #%lu) - no data block", | 1922 | "bad directory (dir #%lu) - no data block", |
@@ -1941,17 +1940,17 @@ static int empty_dir(struct inode *inode) | |||
1941 | de = ext4_next_entry(de1, sb->s_blocksize); | 1940 | de = ext4_next_entry(de1, sb->s_blocksize); |
1942 | while (offset < inode->i_size) { | 1941 | while (offset < inode->i_size) { |
1943 | if (!bh || | 1942 | if (!bh || |
1944 | (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) { | 1943 | (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) { |
1944 | unsigned int lblock; | ||
1945 | err = 0; | 1945 | err = 0; |
1946 | brelse(bh); | 1946 | brelse(bh); |
1947 | bh = ext4_bread(NULL, inode, | 1947 | lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb); |
1948 | offset >> EXT4_BLOCK_SIZE_BITS(sb), 0, &err); | 1948 | bh = ext4_bread(NULL, inode, lblock, 0, &err); |
1949 | if (!bh) { | 1949 | if (!bh) { |
1950 | if (err) | 1950 | if (err) |
1951 | ext4_error(sb, | 1951 | EXT4_ERROR_INODE(inode, |
1952 | "error %d reading directory" | 1952 | "error %d reading directory " |
1953 | " #%lu offset %u", | 1953 | "lblock %u", err, lblock); |
1954 | err, inode->i_ino, offset); | ||
1955 | offset += sb->s_blocksize; | 1954 | offset += sb->s_blocksize; |
1956 | continue; | 1955 | continue; |
1957 | } | 1956 | } |
@@ -2297,7 +2296,7 @@ retry: | |||
2297 | } | 2296 | } |
2298 | } else { | 2297 | } else { |
2299 | /* clear the extent format for fast symlink */ | 2298 | /* clear the extent format for fast symlink */ |
2300 | EXT4_I(inode)->i_flags &= ~EXT4_EXTENTS_FL; | 2299 | ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS); |
2301 | inode->i_op = &ext4_fast_symlink_inode_operations; | 2300 | inode->i_op = &ext4_fast_symlink_inode_operations; |
2302 | memcpy((char *)&EXT4_I(inode)->i_data, symname, l); | 2301 | memcpy((char *)&EXT4_I(inode)->i_data, symname, l); |
2303 | inode->i_size = l-1; | 2302 | inode->i_size = l-1; |