hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/fs/ext4/dir.c
....@@ -35,6 +35,9 @@
3535 static int ext4_dx_readdir(struct file *, struct dir_context *);
3636
3737 /**
38
+ * is_dx_dir() - check if a directory is using htree indexing
39
+ * @inode: directory inode
40
+ *
3841 * Check if the given dir-inode refers to an htree-indexed directory
3942 * (or a directory which could potentially get converted to use htree
4043 * indexing).
....@@ -97,7 +100,7 @@
97100 else if (unlikely(rlen < ext4_dir_rec_len(de->name_len,
98101 fake ? NULL : dir)))
99102 error_msg = "rec_len is too small for name_len";
100
- else if (unlikely(((char *) de - buf) + rlen > size))
103
+ else if (unlikely(next_offset > size))
101104 error_msg = "directory entry overrun";
102105 else if (unlikely(next_offset > size - ext4_dir_rec_len(1,
103106 next_fake ? NULL : dir) &&
....@@ -136,11 +139,9 @@
136139 struct buffer_head *bh = NULL;
137140 struct fscrypt_str fstr = FSTR_INIT(NULL, 0);
138141
139
- if (IS_ENCRYPTED(inode)) {
140
- err = fscrypt_get_encryption_info(inode);
141
- if (err)
142
- return err;
143
- }
142
+ err = fscrypt_prepare_readdir(inode);
143
+ if (err)
144
+ return err;
144145
145146 if (is_dx_dir(inode)) {
146147 err = ext4_dx_readdir(file, ctx);
....@@ -166,7 +167,7 @@
166167 }
167168
168169 if (IS_ENCRYPTED(inode)) {
169
- err = fscrypt_fname_alloc_buffer(inode, EXT4_NAME_LEN, &fstr);
170
+ err = fscrypt_fname_alloc_buffer(EXT4_NAME_LEN, &fstr);
170171 if (err < 0)
171172 return err;
172173 }
....@@ -218,8 +219,7 @@
218219
219220 /* Check the checksum */
220221 if (!buffer_verified(bh) &&
221
- !ext4_dirent_csum_verify(inode,
222
- (struct ext4_dir_entry *)bh->b_data)) {
222
+ !ext4_dirblock_csum_verify(inode, bh)) {
223223 EXT4_ERROR_FILE(file, 0, "directory fails checksum "
224224 "at offset %llu",
225225 (unsigned long long)ctx->pos);
....@@ -414,7 +414,7 @@
414414 __u32 inode;
415415 __u8 name_len;
416416 __u8 file_type;
417
- char name[0];
417
+ char name[];
418418 };
419419
420420 /*
....@@ -486,7 +486,6 @@
486486 new_fn->name_len = ent_name->len;
487487 new_fn->file_type = dirent->file_type;
488488 memcpy(new_fn->name, ent_name->name, ent_name->len);
489
- new_fn->name[ent_name->len] = 0;
490489
491490 while (*p) {
492491 parent = *p;
....@@ -639,13 +638,6 @@
639638 return ret < 0 ? ret : 0;
640639 }
641640
642
-static int ext4_dir_open(struct inode * inode, struct file * filp)
643
-{
644
- if (IS_ENCRYPTED(inode))
645
- return fscrypt_get_encryption_info(inode) ? -EACCES : 0;
646
- return 0;
647
-}
648
-
649641 static int ext4_release_dir(struct inode *inode, struct file *filp)
650642 {
651643 if (filp->private_data)
....@@ -687,6 +679,5 @@
687679 .compat_ioctl = ext4_compat_ioctl,
688680 #endif
689681 .fsync = ext4_sync_file,
690
- .open = ext4_dir_open,
691682 .release = ext4_release_dir,
692683 };