Merge tag 'ext4_for_linus-6.6-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-rpi.git] / fs / ext4 / namei.c
index 41a6411..bbda587 100644 (file)
@@ -343,17 +343,17 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
                                                   struct buffer_head *bh)
 {
        struct ext4_dir_entry_tail *t;
+       int blocksize = EXT4_BLOCK_SIZE(inode->i_sb);
 
 #ifdef PARANOID
        struct ext4_dir_entry *d, *top;
 
        d = (struct ext4_dir_entry *)bh->b_data;
        top = (struct ext4_dir_entry *)(bh->b_data +
-               (EXT4_BLOCK_SIZE(inode->i_sb) -
-                sizeof(struct ext4_dir_entry_tail)));
-       while (d < top && d->rec_len)
+               (blocksize - sizeof(struct ext4_dir_entry_tail)));
+       while (d < top && ext4_rec_len_from_disk(d->rec_len, blocksize))
                d = (struct ext4_dir_entry *)(((void *)d) +
-                   le16_to_cpu(d->rec_len));
+                   ext4_rec_len_from_disk(d->rec_len, blocksize));
 
        if (d != top)
                return NULL;
@@ -364,7 +364,8 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
 #endif
 
        if (t->det_reserved_zero1 ||
-           le16_to_cpu(t->det_rec_len) != sizeof(struct ext4_dir_entry_tail) ||
+           (ext4_rec_len_from_disk(t->det_rec_len, blocksize) !=
+            sizeof(struct ext4_dir_entry_tail)) ||
            t->det_reserved_zero2 ||
            t->det_reserved_ft != EXT4_FT_DIR_CSUM)
                return NULL;
@@ -445,13 +446,14 @@ static struct dx_countlimit *get_dx_countlimit(struct inode *inode,
        struct ext4_dir_entry *dp;
        struct dx_root_info *root;
        int count_offset;
+       int blocksize = EXT4_BLOCK_SIZE(inode->i_sb);
+       unsigned int rlen = ext4_rec_len_from_disk(dirent->rec_len, blocksize);
 
-       if (le16_to_cpu(dirent->rec_len) == EXT4_BLOCK_SIZE(inode->i_sb))
+       if (rlen == blocksize)
                count_offset = 8;
-       else if (le16_to_cpu(dirent->rec_len) == 12) {
+       else if (rlen == 12) {
                dp = (struct ext4_dir_entry *)(((void *)dirent) + 12);
-               if (le16_to_cpu(dp->rec_len) !=
-                   EXT4_BLOCK_SIZE(inode->i_sb) - 12)
+               if (ext4_rec_len_from_disk(dp->rec_len, blocksize) != blocksize - 12)
                        return NULL;
                root = (struct dx_root_info *)(((void *)dp + 12));
                if (root->reserved_zero ||
@@ -1315,6 +1317,7 @@ static int dx_make_map(struct inode *dir, struct buffer_head *bh,
        unsigned int buflen = bh->b_size;
        char *base = bh->b_data;
        struct dx_hash_info h = *hinfo;
+       int blocksize = EXT4_BLOCK_SIZE(dir->i_sb);
 
        if (ext4_has_metadata_csum(dir->i_sb))
                buflen -= sizeof(struct ext4_dir_entry_tail);
@@ -1335,11 +1338,12 @@ static int dx_make_map(struct inode *dir, struct buffer_head *bh,
                        map_tail--;
                        map_tail->hash = h.hash;
                        map_tail->offs = ((char *) de - base)>>2;
-                       map_tail->size = le16_to_cpu(de->rec_len);
+                       map_tail->size = ext4_rec_len_from_disk(de->rec_len,
+                                                               blocksize);
                        count++;
                        cond_resched();
                }
-               de = ext4_next_entry(de, dir->i_sb->s_blocksize);
+               de = ext4_next_entry(de, blocksize);
        }
        return count;
 }