This source file includes following definitions.
- ext4_append
- __ext4_read_dirblock
- ext4_initialize_dirent_tail
- get_dirent_tail
- ext4_dirblock_csum
- __warn_no_space_for_csum
- ext4_dirblock_csum_verify
- ext4_dirblock_csum_set
- ext4_handle_dirty_dirblock
- get_dx_countlimit
- ext4_dx_csum
- ext4_dx_csum_verify
- ext4_dx_csum_set
- ext4_handle_dirty_dx_node
- ext4_next_entry
- dx_get_block
- dx_set_block
- dx_get_hash
- dx_set_hash
- dx_get_count
- dx_get_limit
- dx_set_count
- dx_set_limit
- dx_root_limit
- dx_node_limit
- dx_show_index
- dx_show_leaf
- dx_show_entries
- dx_probe
- dx_release
- ext4_htree_next_block
- htree_dirblock_to_tree
- ext4_htree_fill_tree
- search_dirblock
- dx_make_map
- dx_sort_map
- dx_insert_block
- ext4_ci_compare
- ext4_fname_setup_ci_filename
- ext4_match
- ext4_search_dir
- is_dx_internal_node
- __ext4_find_entry
- ext4_find_entry
- ext4_lookup_entry
- ext4_dx_find_entry
- ext4_lookup
- ext4_get_parent
- dx_move_dirents
- dx_pack_dirents
- do_split
- ext4_find_dest_de
- ext4_insert_dentry
- add_dirent_to_buf
- make_indexed_dir
- ext4_add_entry
- ext4_dx_add_entry
- ext4_generic_delete_entry
- ext4_delete_entry
- ext4_inc_count
- ext4_dec_count
- ext4_add_nondir
- ext4_create
- ext4_mknod
- ext4_tmpfile
- ext4_init_dot_dotdot
- ext4_init_new_dir
- ext4_mkdir
- ext4_empty_dir
- ext4_orphan_add
- ext4_orphan_del
- ext4_rmdir
- ext4_unlink
- ext4_symlink
- ext4_link
- ext4_get_first_dir_block
- ext4_rename_dir_prepare
- ext4_rename_dir_finish
- ext4_setent
- ext4_find_delete_entry
- ext4_rename_delete
- ext4_update_dir_count
- ext4_whiteout_for_rename
- ext4_rename
- ext4_cross_rename
- ext4_rename2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <linux/fs.h>
29 #include <linux/pagemap.h>
30 #include <linux/time.h>
31 #include <linux/fcntl.h>
32 #include <linux/stat.h>
33 #include <linux/string.h>
34 #include <linux/quotaops.h>
35 #include <linux/buffer_head.h>
36 #include <linux/bio.h>
37 #include <linux/iversion.h>
38 #include <linux/unicode.h>
39 #include "ext4.h"
40 #include "ext4_jbd2.h"
41
42 #include "xattr.h"
43 #include "acl.h"
44
45 #include <trace/events/ext4.h>
46
47
48
49 #define NAMEI_RA_CHUNKS 2
50 #define NAMEI_RA_BLOCKS 4
51 #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
52
53 static struct buffer_head *ext4_append(handle_t *handle,
54 struct inode *inode,
55 ext4_lblk_t *block)
56 {
57 struct buffer_head *bh;
58 int err;
59
60 if (unlikely(EXT4_SB(inode->i_sb)->s_max_dir_size_kb &&
61 ((inode->i_size >> 10) >=
62 EXT4_SB(inode->i_sb)->s_max_dir_size_kb)))
63 return ERR_PTR(-ENOSPC);
64
65 *block = inode->i_size >> inode->i_sb->s_blocksize_bits;
66
67 bh = ext4_bread(handle, inode, *block, EXT4_GET_BLOCKS_CREATE);
68 if (IS_ERR(bh))
69 return bh;
70 inode->i_size += inode->i_sb->s_blocksize;
71 EXT4_I(inode)->i_disksize = inode->i_size;
72 BUFFER_TRACE(bh, "get_write_access");
73 err = ext4_journal_get_write_access(handle, bh);
74 if (err) {
75 brelse(bh);
76 ext4_std_error(inode->i_sb, err);
77 return ERR_PTR(err);
78 }
79 return bh;
80 }
81
82 static int ext4_dx_csum_verify(struct inode *inode,
83 struct ext4_dir_entry *dirent);
84
85
86
87
88
89
90
91
92
93
94
95 typedef enum {
96 EITHER, INDEX, DIRENT, DIRENT_HTREE
97 } dirblock_type_t;
98
99 #define ext4_read_dirblock(inode, block, type) \
100 __ext4_read_dirblock((inode), (block), (type), __func__, __LINE__)
101
102 static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
103 ext4_lblk_t block,
104 dirblock_type_t type,
105 const char *func,
106 unsigned int line)
107 {
108 struct buffer_head *bh;
109 struct ext4_dir_entry *dirent;
110 int is_dx_block = 0;
111
112 bh = ext4_bread(NULL, inode, block, 0);
113 if (IS_ERR(bh)) {
114 __ext4_warning(inode->i_sb, func, line,
115 "inode #%lu: lblock %lu: comm %s: "
116 "error %ld reading directory block",
117 inode->i_ino, (unsigned long)block,
118 current->comm, PTR_ERR(bh));
119
120 return bh;
121 }
122 if (!bh && (type == INDEX || type == DIRENT_HTREE)) {
123 ext4_error_inode(inode, func, line, block,
124 "Directory hole found for htree %s block",
125 (type == INDEX) ? "index" : "leaf");
126 return ERR_PTR(-EFSCORRUPTED);
127 }
128 if (!bh)
129 return NULL;
130 dirent = (struct ext4_dir_entry *) bh->b_data;
131
132 if (is_dx(inode)) {
133 if (block == 0)
134 is_dx_block = 1;
135 else if (ext4_rec_len_from_disk(dirent->rec_len,
136 inode->i_sb->s_blocksize) ==
137 inode->i_sb->s_blocksize)
138 is_dx_block = 1;
139 }
140 if (!is_dx_block && type == INDEX) {
141 ext4_error_inode(inode, func, line, block,
142 "directory leaf block found instead of index block");
143 brelse(bh);
144 return ERR_PTR(-EFSCORRUPTED);
145 }
146 if (!ext4_has_metadata_csum(inode->i_sb) ||
147 buffer_verified(bh))
148 return bh;
149
150
151
152
153
154
155 if (is_dx_block && type == INDEX) {
156 if (ext4_dx_csum_verify(inode, dirent))
157 set_buffer_verified(bh);
158 else {
159 ext4_error_inode(inode, func, line, block,
160 "Directory index failed checksum");
161 brelse(bh);
162 return ERR_PTR(-EFSBADCRC);
163 }
164 }
165 if (!is_dx_block) {
166 if (ext4_dirblock_csum_verify(inode, bh))
167 set_buffer_verified(bh);
168 else {
169 ext4_error_inode(inode, func, line, block,
170 "Directory block failed checksum");
171 brelse(bh);
172 return ERR_PTR(-EFSBADCRC);
173 }
174 }
175 return bh;
176 }
177
178 #ifndef assert
179 #define assert(test) J_ASSERT(test)
180 #endif
181
182 #ifdef DX_DEBUG
183 #define dxtrace(command) command
184 #else
185 #define dxtrace(command)
186 #endif
187
188 struct fake_dirent
189 {
190 __le32 inode;
191 __le16 rec_len;
192 u8 name_len;
193 u8 file_type;
194 };
195
196 struct dx_countlimit
197 {
198 __le16 limit;
199 __le16 count;
200 };
201
202 struct dx_entry
203 {
204 __le32 hash;
205 __le32 block;
206 };
207
208
209
210
211
212
213
214 struct dx_root
215 {
216 struct fake_dirent dot;
217 char dot_name[4];
218 struct fake_dirent dotdot;
219 char dotdot_name[4];
220 struct dx_root_info
221 {
222 __le32 reserved_zero;
223 u8 hash_version;
224 u8 info_length;
225 u8 indirect_levels;
226 u8 unused_flags;
227 }
228 info;
229 struct dx_entry entries[0];
230 };
231
232 struct dx_node
233 {
234 struct fake_dirent fake;
235 struct dx_entry entries[0];
236 };
237
238
239 struct dx_frame
240 {
241 struct buffer_head *bh;
242 struct dx_entry *entries;
243 struct dx_entry *at;
244 };
245
246 struct dx_map_entry
247 {
248 u32 hash;
249 u16 offs;
250 u16 size;
251 };
252
253
254
255
256 struct dx_tail {
257 u32 dt_reserved;
258 __le32 dt_checksum;
259 };
260
261 static inline ext4_lblk_t dx_get_block(struct dx_entry *entry);
262 static void dx_set_block(struct dx_entry *entry, ext4_lblk_t value);
263 static inline unsigned dx_get_hash(struct dx_entry *entry);
264 static void dx_set_hash(struct dx_entry *entry, unsigned value);
265 static unsigned dx_get_count(struct dx_entry *entries);
266 static unsigned dx_get_limit(struct dx_entry *entries);
267 static void dx_set_count(struct dx_entry *entries, unsigned value);
268 static void dx_set_limit(struct dx_entry *entries, unsigned value);
269 static unsigned dx_root_limit(struct inode *dir, unsigned infosize);
270 static unsigned dx_node_limit(struct inode *dir);
271 static struct dx_frame *dx_probe(struct ext4_filename *fname,
272 struct inode *dir,
273 struct dx_hash_info *hinfo,
274 struct dx_frame *frame);
275 static void dx_release(struct dx_frame *frames);
276 static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de,
277 unsigned blocksize, struct dx_hash_info *hinfo,
278 struct dx_map_entry map[]);
279 static void dx_sort_map(struct dx_map_entry *map, unsigned count);
280 static struct ext4_dir_entry_2 *dx_move_dirents(char *from, char *to,
281 struct dx_map_entry *offsets, int count, unsigned blocksize);
282 static struct ext4_dir_entry_2* dx_pack_dirents(char *base, unsigned blocksize);
283 static void dx_insert_block(struct dx_frame *frame,
284 u32 hash, ext4_lblk_t block);
285 static int ext4_htree_next_block(struct inode *dir, __u32 hash,
286 struct dx_frame *frame,
287 struct dx_frame *frames,
288 __u32 *start_hash);
289 static struct buffer_head * ext4_dx_find_entry(struct inode *dir,
290 struct ext4_filename *fname,
291 struct ext4_dir_entry_2 **res_dir);
292 static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname,
293 struct inode *dir, struct inode *inode);
294
295
296 void ext4_initialize_dirent_tail(struct buffer_head *bh,
297 unsigned int blocksize)
298 {
299 struct ext4_dir_entry_tail *t = EXT4_DIRENT_TAIL(bh->b_data, blocksize);
300
301 memset(t, 0, sizeof(struct ext4_dir_entry_tail));
302 t->det_rec_len = ext4_rec_len_to_disk(
303 sizeof(struct ext4_dir_entry_tail), blocksize);
304 t->det_reserved_ft = EXT4_FT_DIR_CSUM;
305 }
306
307
308 static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
309 struct buffer_head *bh)
310 {
311 struct ext4_dir_entry_tail *t;
312
313 #ifdef PARANOID
314 struct ext4_dir_entry *d, *top;
315
316 d = (struct ext4_dir_entry *)bh->b_data;
317 top = (struct ext4_dir_entry *)(bh->b_data +
318 (EXT4_BLOCK_SIZE(inode->i_sb) -
319 sizeof(struct ext4_dir_entry_tail)));
320 while (d < top && d->rec_len)
321 d = (struct ext4_dir_entry *)(((void *)d) +
322 le16_to_cpu(d->rec_len));
323
324 if (d != top)
325 return NULL;
326
327 t = (struct ext4_dir_entry_tail *)d;
328 #else
329 t = EXT4_DIRENT_TAIL(bh->b_data, EXT4_BLOCK_SIZE(inode->i_sb));
330 #endif
331
332 if (t->det_reserved_zero1 ||
333 le16_to_cpu(t->det_rec_len) != sizeof(struct ext4_dir_entry_tail) ||
334 t->det_reserved_zero2 ||
335 t->det_reserved_ft != EXT4_FT_DIR_CSUM)
336 return NULL;
337
338 return t;
339 }
340
341 static __le32 ext4_dirblock_csum(struct inode *inode, void *dirent, int size)
342 {
343 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
344 struct ext4_inode_info *ei = EXT4_I(inode);
345 __u32 csum;
346
347 csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)dirent, size);
348 return cpu_to_le32(csum);
349 }
350
351 #define warn_no_space_for_csum(inode) \
352 __warn_no_space_for_csum((inode), __func__, __LINE__)
353
354 static void __warn_no_space_for_csum(struct inode *inode, const char *func,
355 unsigned int line)
356 {
357 __ext4_warning_inode(inode, func, line,
358 "No space for directory leaf checksum. Please run e2fsck -D.");
359 }
360
361 int ext4_dirblock_csum_verify(struct inode *inode, struct buffer_head *bh)
362 {
363 struct ext4_dir_entry_tail *t;
364
365 if (!ext4_has_metadata_csum(inode->i_sb))
366 return 1;
367
368 t = get_dirent_tail(inode, bh);
369 if (!t) {
370 warn_no_space_for_csum(inode);
371 return 0;
372 }
373
374 if (t->det_checksum != ext4_dirblock_csum(inode, bh->b_data,
375 (char *)t - bh->b_data))
376 return 0;
377
378 return 1;
379 }
380
381 static void ext4_dirblock_csum_set(struct inode *inode,
382 struct buffer_head *bh)
383 {
384 struct ext4_dir_entry_tail *t;
385
386 if (!ext4_has_metadata_csum(inode->i_sb))
387 return;
388
389 t = get_dirent_tail(inode, bh);
390 if (!t) {
391 warn_no_space_for_csum(inode);
392 return;
393 }
394
395 t->det_checksum = ext4_dirblock_csum(inode, bh->b_data,
396 (char *)t - bh->b_data);
397 }
398
399 int ext4_handle_dirty_dirblock(handle_t *handle,
400 struct inode *inode,
401 struct buffer_head *bh)
402 {
403 ext4_dirblock_csum_set(inode, bh);
404 return ext4_handle_dirty_metadata(handle, inode, bh);
405 }
406
407 static struct dx_countlimit *get_dx_countlimit(struct inode *inode,
408 struct ext4_dir_entry *dirent,
409 int *offset)
410 {
411 struct ext4_dir_entry *dp;
412 struct dx_root_info *root;
413 int count_offset;
414
415 if (le16_to_cpu(dirent->rec_len) == EXT4_BLOCK_SIZE(inode->i_sb))
416 count_offset = 8;
417 else if (le16_to_cpu(dirent->rec_len) == 12) {
418 dp = (struct ext4_dir_entry *)(((void *)dirent) + 12);
419 if (le16_to_cpu(dp->rec_len) !=
420 EXT4_BLOCK_SIZE(inode->i_sb) - 12)
421 return NULL;
422 root = (struct dx_root_info *)(((void *)dp + 12));
423 if (root->reserved_zero ||
424 root->info_length != sizeof(struct dx_root_info))
425 return NULL;
426 count_offset = 32;
427 } else
428 return NULL;
429
430 if (offset)
431 *offset = count_offset;
432 return (struct dx_countlimit *)(((void *)dirent) + count_offset);
433 }
434
435 static __le32 ext4_dx_csum(struct inode *inode, struct ext4_dir_entry *dirent,
436 int count_offset, int count, struct dx_tail *t)
437 {
438 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
439 struct ext4_inode_info *ei = EXT4_I(inode);
440 __u32 csum;
441 int size;
442 __u32 dummy_csum = 0;
443 int offset = offsetof(struct dx_tail, dt_checksum);
444
445 size = count_offset + (count * sizeof(struct dx_entry));
446 csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)dirent, size);
447 csum = ext4_chksum(sbi, csum, (__u8 *)t, offset);
448 csum = ext4_chksum(sbi, csum, (__u8 *)&dummy_csum, sizeof(dummy_csum));
449
450 return cpu_to_le32(csum);
451 }
452
453 static int ext4_dx_csum_verify(struct inode *inode,
454 struct ext4_dir_entry *dirent)
455 {
456 struct dx_countlimit *c;
457 struct dx_tail *t;
458 int count_offset, limit, count;
459
460 if (!ext4_has_metadata_csum(inode->i_sb))
461 return 1;
462
463 c = get_dx_countlimit(inode, dirent, &count_offset);
464 if (!c) {
465 EXT4_ERROR_INODE(inode, "dir seems corrupt? Run e2fsck -D.");
466 return 0;
467 }
468 limit = le16_to_cpu(c->limit);
469 count = le16_to_cpu(c->count);
470 if (count_offset + (limit * sizeof(struct dx_entry)) >
471 EXT4_BLOCK_SIZE(inode->i_sb) - sizeof(struct dx_tail)) {
472 warn_no_space_for_csum(inode);
473 return 0;
474 }
475 t = (struct dx_tail *)(((struct dx_entry *)c) + limit);
476
477 if (t->dt_checksum != ext4_dx_csum(inode, dirent, count_offset,
478 count, t))
479 return 0;
480 return 1;
481 }
482
483 static void ext4_dx_csum_set(struct inode *inode, struct ext4_dir_entry *dirent)
484 {
485 struct dx_countlimit *c;
486 struct dx_tail *t;
487 int count_offset, limit, count;
488
489 if (!ext4_has_metadata_csum(inode->i_sb))
490 return;
491
492 c = get_dx_countlimit(inode, dirent, &count_offset);
493 if (!c) {
494 EXT4_ERROR_INODE(inode, "dir seems corrupt? Run e2fsck -D.");
495 return;
496 }
497 limit = le16_to_cpu(c->limit);
498 count = le16_to_cpu(c->count);
499 if (count_offset + (limit * sizeof(struct dx_entry)) >
500 EXT4_BLOCK_SIZE(inode->i_sb) - sizeof(struct dx_tail)) {
501 warn_no_space_for_csum(inode);
502 return;
503 }
504 t = (struct dx_tail *)(((struct dx_entry *)c) + limit);
505
506 t->dt_checksum = ext4_dx_csum(inode, dirent, count_offset, count, t);
507 }
508
509 static inline int ext4_handle_dirty_dx_node(handle_t *handle,
510 struct inode *inode,
511 struct buffer_head *bh)
512 {
513 ext4_dx_csum_set(inode, (struct ext4_dir_entry *)bh->b_data);
514 return ext4_handle_dirty_metadata(handle, inode, bh);
515 }
516
517
518
519
520 static inline struct ext4_dir_entry_2 *
521 ext4_next_entry(struct ext4_dir_entry_2 *p, unsigned long blocksize)
522 {
523 return (struct ext4_dir_entry_2 *)((char *)p +
524 ext4_rec_len_from_disk(p->rec_len, blocksize));
525 }
526
527
528
529
530
531
532 static inline ext4_lblk_t dx_get_block(struct dx_entry *entry)
533 {
534 return le32_to_cpu(entry->block) & 0x0fffffff;
535 }
536
537 static inline void dx_set_block(struct dx_entry *entry, ext4_lblk_t value)
538 {
539 entry->block = cpu_to_le32(value);
540 }
541
542 static inline unsigned dx_get_hash(struct dx_entry *entry)
543 {
544 return le32_to_cpu(entry->hash);
545 }
546
547 static inline void dx_set_hash(struct dx_entry *entry, unsigned value)
548 {
549 entry->hash = cpu_to_le32(value);
550 }
551
552 static inline unsigned dx_get_count(struct dx_entry *entries)
553 {
554 return le16_to_cpu(((struct dx_countlimit *) entries)->count);
555 }
556
557 static inline unsigned dx_get_limit(struct dx_entry *entries)
558 {
559 return le16_to_cpu(((struct dx_countlimit *) entries)->limit);
560 }
561
562 static inline void dx_set_count(struct dx_entry *entries, unsigned value)
563 {
564 ((struct dx_countlimit *) entries)->count = cpu_to_le16(value);
565 }
566
567 static inline void dx_set_limit(struct dx_entry *entries, unsigned value)
568 {
569 ((struct dx_countlimit *) entries)->limit = cpu_to_le16(value);
570 }
571
572 static inline unsigned dx_root_limit(struct inode *dir, unsigned infosize)
573 {
574 unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(1) -
575 EXT4_DIR_REC_LEN(2) - infosize;
576
577 if (ext4_has_metadata_csum(dir->i_sb))
578 entry_space -= sizeof(struct dx_tail);
579 return entry_space / sizeof(struct dx_entry);
580 }
581
582 static inline unsigned dx_node_limit(struct inode *dir)
583 {
584 unsigned entry_space = dir->i_sb->s_blocksize - EXT4_DIR_REC_LEN(0);
585
586 if (ext4_has_metadata_csum(dir->i_sb))
587 entry_space -= sizeof(struct dx_tail);
588 return entry_space / sizeof(struct dx_entry);
589 }
590
591
592
593
594 #ifdef DX_DEBUG
595 static void dx_show_index(char * label, struct dx_entry *entries)
596 {
597 int i, n = dx_get_count (entries);
598 printk(KERN_DEBUG "%s index", label);
599 for (i = 0; i < n; i++) {
600 printk(KERN_CONT " %x->%lu",
601 i ? dx_get_hash(entries + i) : 0,
602 (unsigned long)dx_get_block(entries + i));
603 }
604 printk(KERN_CONT "\n");
605 }
606
607 struct stats
608 {
609 unsigned names;
610 unsigned space;
611 unsigned bcount;
612 };
613
614 static struct stats dx_show_leaf(struct inode *dir,
615 struct dx_hash_info *hinfo,
616 struct ext4_dir_entry_2 *de,
617 int size, int show_names)
618 {
619 unsigned names = 0, space = 0;
620 char *base = (char *) de;
621 struct dx_hash_info h = *hinfo;
622
623 printk("names: ");
624 while ((char *) de < base + size)
625 {
626 if (de->inode)
627 {
628 if (show_names)
629 {
630 #ifdef CONFIG_FS_ENCRYPTION
631 int len;
632 char *name;
633 struct fscrypt_str fname_crypto_str =
634 FSTR_INIT(NULL, 0);
635 int res = 0;
636
637 name = de->name;
638 len = de->name_len;
639 if (IS_ENCRYPTED(dir))
640 res = fscrypt_get_encryption_info(dir);
641 if (res) {
642 printk(KERN_WARNING "Error setting up"
643 " fname crypto: %d\n", res);
644 }
645 if (!fscrypt_has_encryption_key(dir)) {
646
647 ext4fs_dirhash(dir, de->name,
648 de->name_len, &h);
649 printk("%*.s:(U)%x.%u ", len,
650 name, h.hash,
651 (unsigned) ((char *) de
652 - base));
653 } else {
654 struct fscrypt_str de_name =
655 FSTR_INIT(name, len);
656
657
658 res = fscrypt_fname_alloc_buffer(
659 dir, len,
660 &fname_crypto_str);
661 if (res)
662 printk(KERN_WARNING "Error "
663 "allocating crypto "
664 "buffer--skipping "
665 "crypto\n");
666 res = fscrypt_fname_disk_to_usr(dir,
667 0, 0, &de_name,
668 &fname_crypto_str);
669 if (res) {
670 printk(KERN_WARNING "Error "
671 "converting filename "
672 "from disk to usr"
673 "\n");
674 name = "??";
675 len = 2;
676 } else {
677 name = fname_crypto_str.name;
678 len = fname_crypto_str.len;
679 }
680 ext4fs_dirhash(dir, de->name,
681 de->name_len, &h);
682 printk("%*.s:(E)%x.%u ", len, name,
683 h.hash, (unsigned) ((char *) de
684 - base));
685 fscrypt_fname_free_buffer(
686 &fname_crypto_str);
687 }
688 #else
689 int len = de->name_len;
690 char *name = de->name;
691 ext4fs_dirhash(dir, de->name, de->name_len, &h);
692 printk("%*.s:%x.%u ", len, name, h.hash,
693 (unsigned) ((char *) de - base));
694 #endif
695 }
696 space += EXT4_DIR_REC_LEN(de->name_len);
697 names++;
698 }
699 de = ext4_next_entry(de, size);
700 }
701 printk(KERN_CONT "(%i)\n", names);
702 return (struct stats) { names, space, 1 };
703 }
704
705 struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir,
706 struct dx_entry *entries, int levels)
707 {
708 unsigned blocksize = dir->i_sb->s_blocksize;
709 unsigned count = dx_get_count(entries), names = 0, space = 0, i;
710 unsigned bcount = 0;
711 struct buffer_head *bh;
712 printk("%i indexed blocks...\n", count);
713 for (i = 0; i < count; i++, entries++)
714 {
715 ext4_lblk_t block = dx_get_block(entries);
716 ext4_lblk_t hash = i ? dx_get_hash(entries): 0;
717 u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;
718 struct stats stats;
719 printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range);
720 bh = ext4_bread(NULL,dir, block, 0);
721 if (!bh || IS_ERR(bh))
722 continue;
723 stats = levels?
724 dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1):
725 dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *)
726 bh->b_data, blocksize, 0);
727 names += stats.names;
728 space += stats.space;
729 bcount += stats.bcount;
730 brelse(bh);
731 }
732 if (bcount)
733 printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n",
734 levels ? "" : " ", names, space/bcount,
735 (space/bcount)*100/blocksize);
736 return (struct stats) { names, space, bcount};
737 }
738 #endif
739
740
741
742
743
744
745
746
747
748
749 static struct dx_frame *
750 dx_probe(struct ext4_filename *fname, struct inode *dir,
751 struct dx_hash_info *hinfo, struct dx_frame *frame_in)
752 {
753 unsigned count, indirect;
754 struct dx_entry *at, *entries, *p, *q, *m;
755 struct dx_root *root;
756 struct dx_frame *frame = frame_in;
757 struct dx_frame *ret_err = ERR_PTR(ERR_BAD_DX_DIR);
758 u32 hash;
759
760 memset(frame_in, 0, EXT4_HTREE_LEVEL * sizeof(frame_in[0]));
761 frame->bh = ext4_read_dirblock(dir, 0, INDEX);
762 if (IS_ERR(frame->bh))
763 return (struct dx_frame *) frame->bh;
764
765 root = (struct dx_root *) frame->bh->b_data;
766 if (root->info.hash_version != DX_HASH_TEA &&
767 root->info.hash_version != DX_HASH_HALF_MD4 &&
768 root->info.hash_version != DX_HASH_LEGACY) {
769 ext4_warning_inode(dir, "Unrecognised inode hash code %u",
770 root->info.hash_version);
771 goto fail;
772 }
773 if (fname)
774 hinfo = &fname->hinfo;
775 hinfo->hash_version = root->info.hash_version;
776 if (hinfo->hash_version <= DX_HASH_TEA)
777 hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
778 hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;
779 if (fname && fname_name(fname))
780 ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), hinfo);
781 hash = hinfo->hash;
782
783 if (root->info.unused_flags & 1) {
784 ext4_warning_inode(dir, "Unimplemented hash flags: %#06x",
785 root->info.unused_flags);
786 goto fail;
787 }
788
789 indirect = root->info.indirect_levels;
790 if (indirect >= ext4_dir_htree_level(dir->i_sb)) {
791 ext4_warning(dir->i_sb,
792 "Directory (ino: %lu) htree depth %#06x exceed"
793 "supported value", dir->i_ino,
794 ext4_dir_htree_level(dir->i_sb));
795 if (ext4_dir_htree_level(dir->i_sb) < EXT4_HTREE_LEVEL) {
796 ext4_warning(dir->i_sb, "Enable large directory "
797 "feature to access it");
798 }
799 goto fail;
800 }
801
802 entries = (struct dx_entry *)(((char *)&root->info) +
803 root->info.info_length);
804
805 if (dx_get_limit(entries) != dx_root_limit(dir,
806 root->info.info_length)) {
807 ext4_warning_inode(dir, "dx entry: limit %u != root limit %u",
808 dx_get_limit(entries),
809 dx_root_limit(dir, root->info.info_length));
810 goto fail;
811 }
812
813 dxtrace(printk("Look up %x", hash));
814 while (1) {
815 count = dx_get_count(entries);
816 if (!count || count > dx_get_limit(entries)) {
817 ext4_warning_inode(dir,
818 "dx entry: count %u beyond limit %u",
819 count, dx_get_limit(entries));
820 goto fail;
821 }
822
823 p = entries + 1;
824 q = entries + count - 1;
825 while (p <= q) {
826 m = p + (q - p) / 2;
827 dxtrace(printk(KERN_CONT "."));
828 if (dx_get_hash(m) > hash)
829 q = m - 1;
830 else
831 p = m + 1;
832 }
833
834 if (0) {
835 unsigned n = count - 1;
836 at = entries;
837 while (n--)
838 {
839 dxtrace(printk(KERN_CONT ","));
840 if (dx_get_hash(++at) > hash)
841 {
842 at--;
843 break;
844 }
845 }
846 assert (at == p - 1);
847 }
848
849 at = p - 1;
850 dxtrace(printk(KERN_CONT " %x->%u\n",
851 at == entries ? 0 : dx_get_hash(at),
852 dx_get_block(at)));
853 frame->entries = entries;
854 frame->at = at;
855 if (!indirect--)
856 return frame;
857 frame++;
858 frame->bh = ext4_read_dirblock(dir, dx_get_block(at), INDEX);
859 if (IS_ERR(frame->bh)) {
860 ret_err = (struct dx_frame *) frame->bh;
861 frame->bh = NULL;
862 goto fail;
863 }
864 entries = ((struct dx_node *) frame->bh->b_data)->entries;
865
866 if (dx_get_limit(entries) != dx_node_limit(dir)) {
867 ext4_warning_inode(dir,
868 "dx entry: limit %u != node limit %u",
869 dx_get_limit(entries), dx_node_limit(dir));
870 goto fail;
871 }
872 }
873 fail:
874 while (frame >= frame_in) {
875 brelse(frame->bh);
876 frame--;
877 }
878
879 if (ret_err == ERR_PTR(ERR_BAD_DX_DIR))
880 ext4_warning_inode(dir,
881 "Corrupt directory, running e2fsck is recommended");
882 return ret_err;
883 }
884
885 static void dx_release(struct dx_frame *frames)
886 {
887 struct dx_root_info *info;
888 int i;
889 unsigned int indirect_levels;
890
891 if (frames[0].bh == NULL)
892 return;
893
894 info = &((struct dx_root *)frames[0].bh->b_data)->info;
895
896 indirect_levels = info->indirect_levels;
897 for (i = 0; i <= indirect_levels; i++) {
898 if (frames[i].bh == NULL)
899 break;
900 brelse(frames[i].bh);
901 frames[i].bh = NULL;
902 }
903 }
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922 static int ext4_htree_next_block(struct inode *dir, __u32 hash,
923 struct dx_frame *frame,
924 struct dx_frame *frames,
925 __u32 *start_hash)
926 {
927 struct dx_frame *p;
928 struct buffer_head *bh;
929 int num_frames = 0;
930 __u32 bhash;
931
932 p = frame;
933
934
935
936
937
938
939
940 while (1) {
941 if (++(p->at) < p->entries + dx_get_count(p->entries))
942 break;
943 if (p == frames)
944 return 0;
945 num_frames++;
946 p--;
947 }
948
949
950
951
952
953
954
955
956 bhash = dx_get_hash(p->at);
957 if (start_hash)
958 *start_hash = bhash;
959 if ((hash & 1) == 0) {
960 if ((bhash & ~1) != hash)
961 return 0;
962 }
963
964
965
966
967 while (num_frames--) {
968 bh = ext4_read_dirblock(dir, dx_get_block(p->at), INDEX);
969 if (IS_ERR(bh))
970 return PTR_ERR(bh);
971 p++;
972 brelse(p->bh);
973 p->bh = bh;
974 p->at = p->entries = ((struct dx_node *) bh->b_data)->entries;
975 }
976 return 1;
977 }
978
979
980
981
982
983
984
985 static int htree_dirblock_to_tree(struct file *dir_file,
986 struct inode *dir, ext4_lblk_t block,
987 struct dx_hash_info *hinfo,
988 __u32 start_hash, __u32 start_minor_hash)
989 {
990 struct buffer_head *bh;
991 struct ext4_dir_entry_2 *de, *top;
992 int err = 0, count = 0;
993 struct fscrypt_str fname_crypto_str = FSTR_INIT(NULL, 0), tmp_str;
994
995 dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n",
996 (unsigned long)block));
997 bh = ext4_read_dirblock(dir, block, DIRENT_HTREE);
998 if (IS_ERR(bh))
999 return PTR_ERR(bh);
1000
1001 de = (struct ext4_dir_entry_2 *) bh->b_data;
1002 top = (struct ext4_dir_entry_2 *) ((char *) de +
1003 dir->i_sb->s_blocksize -
1004 EXT4_DIR_REC_LEN(0));
1005 #ifdef CONFIG_FS_ENCRYPTION
1006
1007 if (IS_ENCRYPTED(dir)) {
1008 err = fscrypt_get_encryption_info(dir);
1009 if (err < 0) {
1010 brelse(bh);
1011 return err;
1012 }
1013 err = fscrypt_fname_alloc_buffer(dir, EXT4_NAME_LEN,
1014 &fname_crypto_str);
1015 if (err < 0) {
1016 brelse(bh);
1017 return err;
1018 }
1019 }
1020 #endif
1021 for (; de < top; de = ext4_next_entry(de, dir->i_sb->s_blocksize)) {
1022 if (ext4_check_dir_entry(dir, NULL, de, bh,
1023 bh->b_data, bh->b_size,
1024 (block<<EXT4_BLOCK_SIZE_BITS(dir->i_sb))
1025 + ((char *)de - bh->b_data))) {
1026
1027 break;
1028 }
1029 ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
1030 if ((hinfo->hash < start_hash) ||
1031 ((hinfo->hash == start_hash) &&
1032 (hinfo->minor_hash < start_minor_hash)))
1033 continue;
1034 if (de->inode == 0)
1035 continue;
1036 if (!IS_ENCRYPTED(dir)) {
1037 tmp_str.name = de->name;
1038 tmp_str.len = de->name_len;
1039 err = ext4_htree_store_dirent(dir_file,
1040 hinfo->hash, hinfo->minor_hash, de,
1041 &tmp_str);
1042 } else {
1043 int save_len = fname_crypto_str.len;
1044 struct fscrypt_str de_name = FSTR_INIT(de->name,
1045 de->name_len);
1046
1047
1048 err = fscrypt_fname_disk_to_usr(dir, hinfo->hash,
1049 hinfo->minor_hash, &de_name,
1050 &fname_crypto_str);
1051 if (err) {
1052 count = err;
1053 goto errout;
1054 }
1055 err = ext4_htree_store_dirent(dir_file,
1056 hinfo->hash, hinfo->minor_hash, de,
1057 &fname_crypto_str);
1058 fname_crypto_str.len = save_len;
1059 }
1060 if (err != 0) {
1061 count = err;
1062 goto errout;
1063 }
1064 count++;
1065 }
1066 errout:
1067 brelse(bh);
1068 #ifdef CONFIG_FS_ENCRYPTION
1069 fscrypt_fname_free_buffer(&fname_crypto_str);
1070 #endif
1071 return count;
1072 }
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083 int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
1084 __u32 start_minor_hash, __u32 *next_hash)
1085 {
1086 struct dx_hash_info hinfo;
1087 struct ext4_dir_entry_2 *de;
1088 struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;
1089 struct inode *dir;
1090 ext4_lblk_t block;
1091 int count = 0;
1092 int ret, err;
1093 __u32 hashval;
1094 struct fscrypt_str tmp_str;
1095
1096 dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n",
1097 start_hash, start_minor_hash));
1098 dir = file_inode(dir_file);
1099 if (!(ext4_test_inode_flag(dir, EXT4_INODE_INDEX))) {
1100 hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version;
1101 if (hinfo.hash_version <= DX_HASH_TEA)
1102 hinfo.hash_version +=
1103 EXT4_SB(dir->i_sb)->s_hash_unsigned;
1104 hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
1105 if (ext4_has_inline_data(dir)) {
1106 int has_inline_data = 1;
1107 count = ext4_inlinedir_to_tree(dir_file, dir, 0,
1108 &hinfo, start_hash,
1109 start_minor_hash,
1110 &has_inline_data);
1111 if (has_inline_data) {
1112 *next_hash = ~0;
1113 return count;
1114 }
1115 }
1116 count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo,
1117 start_hash, start_minor_hash);
1118 *next_hash = ~0;
1119 return count;
1120 }
1121 hinfo.hash = start_hash;
1122 hinfo.minor_hash = 0;
1123 frame = dx_probe(NULL, dir, &hinfo, frames);
1124 if (IS_ERR(frame))
1125 return PTR_ERR(frame);
1126
1127
1128 if (!start_hash && !start_minor_hash) {
1129 de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data;
1130 tmp_str.name = de->name;
1131 tmp_str.len = de->name_len;
1132 err = ext4_htree_store_dirent(dir_file, 0, 0,
1133 de, &tmp_str);
1134 if (err != 0)
1135 goto errout;
1136 count++;
1137 }
1138 if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) {
1139 de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data;
1140 de = ext4_next_entry(de, dir->i_sb->s_blocksize);
1141 tmp_str.name = de->name;
1142 tmp_str.len = de->name_len;
1143 err = ext4_htree_store_dirent(dir_file, 2, 0,
1144 de, &tmp_str);
1145 if (err != 0)
1146 goto errout;
1147 count++;
1148 }
1149
1150 while (1) {
1151 if (fatal_signal_pending(current)) {
1152 err = -ERESTARTSYS;
1153 goto errout;
1154 }
1155 cond_resched();
1156 block = dx_get_block(frame->at);
1157 ret = htree_dirblock_to_tree(dir_file, dir, block, &hinfo,
1158 start_hash, start_minor_hash);
1159 if (ret < 0) {
1160 err = ret;
1161 goto errout;
1162 }
1163 count += ret;
1164 hashval = ~0;
1165 ret = ext4_htree_next_block(dir, HASH_NB_ALWAYS,
1166 frame, frames, &hashval);
1167 *next_hash = hashval;
1168 if (ret < 0) {
1169 err = ret;
1170 goto errout;
1171 }
1172
1173
1174
1175
1176
1177 if ((ret == 0) ||
1178 (count && ((hashval & 1) == 0)))
1179 break;
1180 }
1181 dx_release(frames);
1182 dxtrace(printk(KERN_DEBUG "Fill tree: returned %d entries, "
1183 "next hash: %x\n", count, *next_hash));
1184 return count;
1185 errout:
1186 dx_release(frames);
1187 return (err);
1188 }
1189
1190 static inline int search_dirblock(struct buffer_head *bh,
1191 struct inode *dir,
1192 struct ext4_filename *fname,
1193 unsigned int offset,
1194 struct ext4_dir_entry_2 **res_dir)
1195 {
1196 return ext4_search_dir(bh, bh->b_data, dir->i_sb->s_blocksize, dir,
1197 fname, offset, res_dir);
1198 }
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208 static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de,
1209 unsigned blocksize, struct dx_hash_info *hinfo,
1210 struct dx_map_entry *map_tail)
1211 {
1212 int count = 0;
1213 char *base = (char *) de;
1214 struct dx_hash_info h = *hinfo;
1215
1216 while ((char *) de < base + blocksize) {
1217 if (de->name_len && de->inode) {
1218 ext4fs_dirhash(dir, de->name, de->name_len, &h);
1219 map_tail--;
1220 map_tail->hash = h.hash;
1221 map_tail->offs = ((char *) de - base)>>2;
1222 map_tail->size = le16_to_cpu(de->rec_len);
1223 count++;
1224 cond_resched();
1225 }
1226
1227 de = ext4_next_entry(de, blocksize);
1228 }
1229 return count;
1230 }
1231
1232
1233 static void dx_sort_map (struct dx_map_entry *map, unsigned count)
1234 {
1235 struct dx_map_entry *p, *q, *top = map + count - 1;
1236 int more;
1237
1238 while (count > 2) {
1239 count = count*10/13;
1240 if (count - 9 < 2)
1241 count = 11;
1242 for (p = top, q = p - count; q >= map; p--, q--)
1243 if (p->hash < q->hash)
1244 swap(*p, *q);
1245 }
1246
1247 do {
1248 more = 0;
1249 q = top;
1250 while (q-- > map) {
1251 if (q[1].hash >= q[0].hash)
1252 continue;
1253 swap(*(q+1), *q);
1254 more = 1;
1255 }
1256 } while(more);
1257 }
1258
1259 static void dx_insert_block(struct dx_frame *frame, u32 hash, ext4_lblk_t block)
1260 {
1261 struct dx_entry *entries = frame->entries;
1262 struct dx_entry *old = frame->at, *new = old + 1;
1263 int count = dx_get_count(entries);
1264
1265 assert(count < dx_get_limit(entries));
1266 assert(old < entries + count);
1267 memmove(new + 1, new, (char *)(entries + count) - (char *)(new));
1268 dx_set_hash(new, hash);
1269 dx_set_block(new, block);
1270 dx_set_count(entries, count + 1);
1271 }
1272
1273 #ifdef CONFIG_UNICODE
1274
1275
1276
1277
1278
1279
1280
1281
1282 int ext4_ci_compare(const struct inode *parent, const struct qstr *name,
1283 const struct qstr *entry, bool quick)
1284 {
1285 const struct ext4_sb_info *sbi = EXT4_SB(parent->i_sb);
1286 const struct unicode_map *um = sbi->s_encoding;
1287 int ret;
1288
1289 if (quick)
1290 ret = utf8_strncasecmp_folded(um, name, entry);
1291 else
1292 ret = utf8_strncasecmp(um, name, entry);
1293
1294 if (ret < 0) {
1295
1296
1297
1298 if (ext4_has_strict_mode(sbi))
1299 return -EINVAL;
1300
1301 if (name->len != entry->len)
1302 return 1;
1303
1304 return !!memcmp(name->name, entry->name, name->len);
1305 }
1306
1307 return ret;
1308 }
1309
1310 void ext4_fname_setup_ci_filename(struct inode *dir, const struct qstr *iname,
1311 struct fscrypt_str *cf_name)
1312 {
1313 int len;
1314
1315 if (!IS_CASEFOLDED(dir) || !EXT4_SB(dir->i_sb)->s_encoding) {
1316 cf_name->name = NULL;
1317 return;
1318 }
1319
1320 cf_name->name = kmalloc(EXT4_NAME_LEN, GFP_NOFS);
1321 if (!cf_name->name)
1322 return;
1323
1324 len = utf8_casefold(EXT4_SB(dir->i_sb)->s_encoding,
1325 iname, cf_name->name,
1326 EXT4_NAME_LEN);
1327 if (len <= 0) {
1328 kfree(cf_name->name);
1329 cf_name->name = NULL;
1330 return;
1331 }
1332 cf_name->len = (unsigned) len;
1333
1334 }
1335 #endif
1336
1337
1338
1339
1340
1341
1342 static inline bool ext4_match(const struct inode *parent,
1343 const struct ext4_filename *fname,
1344 const struct ext4_dir_entry_2 *de)
1345 {
1346 struct fscrypt_name f;
1347 #ifdef CONFIG_UNICODE
1348 const struct qstr entry = {.name = de->name, .len = de->name_len};
1349 #endif
1350
1351 if (!de->inode)
1352 return false;
1353
1354 f.usr_fname = fname->usr_fname;
1355 f.disk_name = fname->disk_name;
1356 #ifdef CONFIG_FS_ENCRYPTION
1357 f.crypto_buf = fname->crypto_buf;
1358 #endif
1359
1360 #ifdef CONFIG_UNICODE
1361 if (EXT4_SB(parent->i_sb)->s_encoding && IS_CASEFOLDED(parent)) {
1362 if (fname->cf_name.name) {
1363 struct qstr cf = {.name = fname->cf_name.name,
1364 .len = fname->cf_name.len};
1365 return !ext4_ci_compare(parent, &cf, &entry, true);
1366 }
1367 return !ext4_ci_compare(parent, fname->usr_fname, &entry,
1368 false);
1369 }
1370 #endif
1371
1372 return fscrypt_match_name(&f, de->name, de->name_len);
1373 }
1374
1375
1376
1377
1378 int ext4_search_dir(struct buffer_head *bh, char *search_buf, int buf_size,
1379 struct inode *dir, struct ext4_filename *fname,
1380 unsigned int offset, struct ext4_dir_entry_2 **res_dir)
1381 {
1382 struct ext4_dir_entry_2 * de;
1383 char * dlimit;
1384 int de_len;
1385
1386 de = (struct ext4_dir_entry_2 *)search_buf;
1387 dlimit = search_buf + buf_size;
1388 while ((char *) de < dlimit) {
1389
1390
1391 if ((char *) de + de->name_len <= dlimit &&
1392 ext4_match(dir, fname, de)) {
1393
1394
1395 if (ext4_check_dir_entry(dir, NULL, de, bh, bh->b_data,
1396 bh->b_size, offset))
1397 return -1;
1398 *res_dir = de;
1399 return 1;
1400 }
1401
1402 de_len = ext4_rec_len_from_disk(de->rec_len,
1403 dir->i_sb->s_blocksize);
1404 if (de_len <= 0)
1405 return -1;
1406 offset += de_len;
1407 de = (struct ext4_dir_entry_2 *) ((char *) de + de_len);
1408 }
1409 return 0;
1410 }
1411
1412 static int is_dx_internal_node(struct inode *dir, ext4_lblk_t block,
1413 struct ext4_dir_entry *de)
1414 {
1415 struct super_block *sb = dir->i_sb;
1416
1417 if (!is_dx(dir))
1418 return 0;
1419 if (block == 0)
1420 return 1;
1421 if (de->inode == 0 &&
1422 ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize) ==
1423 sb->s_blocksize)
1424 return 1;
1425 return 0;
1426 }
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439 static struct buffer_head *__ext4_find_entry(struct inode *dir,
1440 struct ext4_filename *fname,
1441 struct ext4_dir_entry_2 **res_dir,
1442 int *inlined)
1443 {
1444 struct super_block *sb;
1445 struct buffer_head *bh_use[NAMEI_RA_SIZE];
1446 struct buffer_head *bh, *ret = NULL;
1447 ext4_lblk_t start, block;
1448 const u8 *name = fname->usr_fname->name;
1449 size_t ra_max = 0;
1450
1451 size_t ra_ptr = 0;
1452
1453 ext4_lblk_t nblocks;
1454 int i, namelen, retval;
1455
1456 *res_dir = NULL;
1457 sb = dir->i_sb;
1458 namelen = fname->usr_fname->len;
1459 if (namelen > EXT4_NAME_LEN)
1460 return NULL;
1461
1462 if (ext4_has_inline_data(dir)) {
1463 int has_inline_data = 1;
1464 ret = ext4_find_inline_entry(dir, fname, res_dir,
1465 &has_inline_data);
1466 if (has_inline_data) {
1467 if (inlined)
1468 *inlined = 1;
1469 goto cleanup_and_exit;
1470 }
1471 }
1472
1473 if ((namelen <= 2) && (name[0] == '.') &&
1474 (name[1] == '.' || name[1] == '\0')) {
1475
1476
1477
1478
1479 block = start = 0;
1480 nblocks = 1;
1481 goto restart;
1482 }
1483 if (is_dx(dir)) {
1484 ret = ext4_dx_find_entry(dir, fname, res_dir);
1485
1486
1487
1488
1489
1490 if (!IS_ERR(ret) || PTR_ERR(ret) != ERR_BAD_DX_DIR)
1491 goto cleanup_and_exit;
1492 dxtrace(printk(KERN_DEBUG "ext4_find_entry: dx failed, "
1493 "falling back\n"));
1494 ret = NULL;
1495 }
1496 nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);
1497 if (!nblocks) {
1498 ret = NULL;
1499 goto cleanup_and_exit;
1500 }
1501 start = EXT4_I(dir)->i_dir_start_lookup;
1502 if (start >= nblocks)
1503 start = 0;
1504 block = start;
1505 restart:
1506 do {
1507
1508
1509
1510 cond_resched();
1511 if (ra_ptr >= ra_max) {
1512
1513 ra_ptr = 0;
1514 if (block < start)
1515 ra_max = start - block;
1516 else
1517 ra_max = nblocks - block;
1518 ra_max = min(ra_max, ARRAY_SIZE(bh_use));
1519 retval = ext4_bread_batch(dir, block, ra_max,
1520 false , bh_use);
1521 if (retval) {
1522 ret = ERR_PTR(retval);
1523 ra_max = 0;
1524 goto cleanup_and_exit;
1525 }
1526 }
1527 if ((bh = bh_use[ra_ptr++]) == NULL)
1528 goto next;
1529 wait_on_buffer(bh);
1530 if (!buffer_uptodate(bh)) {
1531 EXT4_ERROR_INODE(dir, "reading directory lblock %lu",
1532 (unsigned long) block);
1533 brelse(bh);
1534 ret = ERR_PTR(-EIO);
1535 goto cleanup_and_exit;
1536 }
1537 if (!buffer_verified(bh) &&
1538 !is_dx_internal_node(dir, block,
1539 (struct ext4_dir_entry *)bh->b_data) &&
1540 !ext4_dirblock_csum_verify(dir, bh)) {
1541 EXT4_ERROR_INODE(dir, "checksumming directory "
1542 "block %lu", (unsigned long)block);
1543 brelse(bh);
1544 ret = ERR_PTR(-EFSBADCRC);
1545 goto cleanup_and_exit;
1546 }
1547 set_buffer_verified(bh);
1548 i = search_dirblock(bh, dir, fname,
1549 block << EXT4_BLOCK_SIZE_BITS(sb), res_dir);
1550 if (i == 1) {
1551 EXT4_I(dir)->i_dir_start_lookup = block;
1552 ret = bh;
1553 goto cleanup_and_exit;
1554 } else {
1555 brelse(bh);
1556 if (i < 0)
1557 goto cleanup_and_exit;
1558 }
1559 next:
1560 if (++block >= nblocks)
1561 block = 0;
1562 } while (block != start);
1563
1564
1565
1566
1567
1568 block = nblocks;
1569 nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb);
1570 if (block < nblocks) {
1571 start = 0;
1572 goto restart;
1573 }
1574
1575 cleanup_and_exit:
1576
1577 for (; ra_ptr < ra_max; ra_ptr++)
1578 brelse(bh_use[ra_ptr]);
1579 return ret;
1580 }
1581
1582 static struct buffer_head *ext4_find_entry(struct inode *dir,
1583 const struct qstr *d_name,
1584 struct ext4_dir_entry_2 **res_dir,
1585 int *inlined)
1586 {
1587 int err;
1588 struct ext4_filename fname;
1589 struct buffer_head *bh;
1590
1591 err = ext4_fname_setup_filename(dir, d_name, 1, &fname);
1592 if (err == -ENOENT)
1593 return NULL;
1594 if (err)
1595 return ERR_PTR(err);
1596
1597 bh = __ext4_find_entry(dir, &fname, res_dir, inlined);
1598
1599 ext4_fname_free_filename(&fname);
1600 return bh;
1601 }
1602
1603 static struct buffer_head *ext4_lookup_entry(struct inode *dir,
1604 struct dentry *dentry,
1605 struct ext4_dir_entry_2 **res_dir)
1606 {
1607 int err;
1608 struct ext4_filename fname;
1609 struct buffer_head *bh;
1610
1611 err = ext4_fname_prepare_lookup(dir, dentry, &fname);
1612 if (err == -ENOENT)
1613 return NULL;
1614 if (err)
1615 return ERR_PTR(err);
1616
1617 bh = __ext4_find_entry(dir, &fname, res_dir, NULL);
1618
1619 ext4_fname_free_filename(&fname);
1620 return bh;
1621 }
1622
1623 static struct buffer_head * ext4_dx_find_entry(struct inode *dir,
1624 struct ext4_filename *fname,
1625 struct ext4_dir_entry_2 **res_dir)
1626 {
1627 struct super_block * sb = dir->i_sb;
1628 struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;
1629 struct buffer_head *bh;
1630 ext4_lblk_t block;
1631 int retval;
1632
1633 #ifdef CONFIG_FS_ENCRYPTION
1634 *res_dir = NULL;
1635 #endif
1636 frame = dx_probe(fname, dir, NULL, frames);
1637 if (IS_ERR(frame))
1638 return (struct buffer_head *) frame;
1639 do {
1640 block = dx_get_block(frame->at);
1641 bh = ext4_read_dirblock(dir, block, DIRENT_HTREE);
1642 if (IS_ERR(bh))
1643 goto errout;
1644
1645 retval = search_dirblock(bh, dir, fname,
1646 block << EXT4_BLOCK_SIZE_BITS(sb),
1647 res_dir);
1648 if (retval == 1)
1649 goto success;
1650 brelse(bh);
1651 if (retval == -1) {
1652 bh = ERR_PTR(ERR_BAD_DX_DIR);
1653 goto errout;
1654 }
1655
1656
1657 retval = ext4_htree_next_block(dir, fname->hinfo.hash, frame,
1658 frames, NULL);
1659 if (retval < 0) {
1660 ext4_warning_inode(dir,
1661 "error %d reading directory index block",
1662 retval);
1663 bh = ERR_PTR(retval);
1664 goto errout;
1665 }
1666 } while (retval == 1);
1667
1668 bh = NULL;
1669 errout:
1670 dxtrace(printk(KERN_DEBUG "%s not found\n", fname->usr_fname->name));
1671 success:
1672 dx_release(frames);
1673 return bh;
1674 }
1675
1676 static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
1677 {
1678 struct inode *inode;
1679 struct ext4_dir_entry_2 *de;
1680 struct buffer_head *bh;
1681
1682 if (dentry->d_name.len > EXT4_NAME_LEN)
1683 return ERR_PTR(-ENAMETOOLONG);
1684
1685 bh = ext4_lookup_entry(dir, dentry, &de);
1686 if (IS_ERR(bh))
1687 return ERR_CAST(bh);
1688 inode = NULL;
1689 if (bh) {
1690 __u32 ino = le32_to_cpu(de->inode);
1691 brelse(bh);
1692 if (!ext4_valid_inum(dir->i_sb, ino)) {
1693 EXT4_ERROR_INODE(dir, "bad inode number: %u", ino);
1694 return ERR_PTR(-EFSCORRUPTED);
1695 }
1696 if (unlikely(ino == dir->i_ino)) {
1697 EXT4_ERROR_INODE(dir, "'%pd' linked to parent dir",
1698 dentry);
1699 return ERR_PTR(-EFSCORRUPTED);
1700 }
1701 inode = ext4_iget(dir->i_sb, ino, EXT4_IGET_NORMAL);
1702 if (inode == ERR_PTR(-ESTALE)) {
1703 EXT4_ERROR_INODE(dir,
1704 "deleted inode referenced: %u",
1705 ino);
1706 return ERR_PTR(-EFSCORRUPTED);
1707 }
1708 if (!IS_ERR(inode) && IS_ENCRYPTED(dir) &&
1709 (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) &&
1710 !fscrypt_has_permitted_context(dir, inode)) {
1711 ext4_warning(inode->i_sb,
1712 "Inconsistent encryption contexts: %lu/%lu",
1713 dir->i_ino, inode->i_ino);
1714 iput(inode);
1715 return ERR_PTR(-EPERM);
1716 }
1717 }
1718
1719 #ifdef CONFIG_UNICODE
1720 if (!inode && IS_CASEFOLDED(dir)) {
1721
1722
1723
1724
1725
1726 return NULL;
1727 }
1728 #endif
1729 return d_splice_alias(inode, dentry);
1730 }
1731
1732
1733 struct dentry *ext4_get_parent(struct dentry *child)
1734 {
1735 __u32 ino;
1736 static const struct qstr dotdot = QSTR_INIT("..", 2);
1737 struct ext4_dir_entry_2 * de;
1738 struct buffer_head *bh;
1739
1740 bh = ext4_find_entry(d_inode(child), &dotdot, &de, NULL);
1741 if (IS_ERR(bh))
1742 return ERR_CAST(bh);
1743 if (!bh)
1744 return ERR_PTR(-ENOENT);
1745 ino = le32_to_cpu(de->inode);
1746 brelse(bh);
1747
1748 if (!ext4_valid_inum(child->d_sb, ino)) {
1749 EXT4_ERROR_INODE(d_inode(child),
1750 "bad parent inode number: %u", ino);
1751 return ERR_PTR(-EFSCORRUPTED);
1752 }
1753
1754 return d_obtain_alias(ext4_iget(child->d_sb, ino, EXT4_IGET_NORMAL));
1755 }
1756
1757
1758
1759
1760
1761 static struct ext4_dir_entry_2 *
1762 dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count,
1763 unsigned blocksize)
1764 {
1765 unsigned rec_len = 0;
1766
1767 while (count--) {
1768 struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *)
1769 (from + (map->offs<<2));
1770 rec_len = EXT4_DIR_REC_LEN(de->name_len);
1771 memcpy (to, de, rec_len);
1772 ((struct ext4_dir_entry_2 *) to)->rec_len =
1773 ext4_rec_len_to_disk(rec_len, blocksize);
1774 de->inode = 0;
1775 map++;
1776 to += rec_len;
1777 }
1778 return (struct ext4_dir_entry_2 *) (to - rec_len);
1779 }
1780
1781
1782
1783
1784
1785 static struct ext4_dir_entry_2* dx_pack_dirents(char *base, unsigned blocksize)
1786 {
1787 struct ext4_dir_entry_2 *next, *to, *prev, *de = (struct ext4_dir_entry_2 *) base;
1788 unsigned rec_len = 0;
1789
1790 prev = to = de;
1791 while ((char*)de < base + blocksize) {
1792 next = ext4_next_entry(de, blocksize);
1793 if (de->inode && de->name_len) {
1794 rec_len = EXT4_DIR_REC_LEN(de->name_len);
1795 if (de > to)
1796 memmove(to, de, rec_len);
1797 to->rec_len = ext4_rec_len_to_disk(rec_len, blocksize);
1798 prev = to;
1799 to = (struct ext4_dir_entry_2 *) (((char *) to) + rec_len);
1800 }
1801 de = next;
1802 }
1803 return prev;
1804 }
1805
1806
1807
1808
1809
1810
1811 static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1812 struct buffer_head **bh,struct dx_frame *frame,
1813 struct dx_hash_info *hinfo)
1814 {
1815 unsigned blocksize = dir->i_sb->s_blocksize;
1816 unsigned count, continued;
1817 struct buffer_head *bh2;
1818 ext4_lblk_t newblock;
1819 u32 hash2;
1820 struct dx_map_entry *map;
1821 char *data1 = (*bh)->b_data, *data2;
1822 unsigned split, move, size;
1823 struct ext4_dir_entry_2 *de = NULL, *de2;
1824 int csum_size = 0;
1825 int err = 0, i;
1826
1827 if (ext4_has_metadata_csum(dir->i_sb))
1828 csum_size = sizeof(struct ext4_dir_entry_tail);
1829
1830 bh2 = ext4_append(handle, dir, &newblock);
1831 if (IS_ERR(bh2)) {
1832 brelse(*bh);
1833 *bh = NULL;
1834 return (struct ext4_dir_entry_2 *) bh2;
1835 }
1836
1837 BUFFER_TRACE(*bh, "get_write_access");
1838 err = ext4_journal_get_write_access(handle, *bh);
1839 if (err)
1840 goto journal_error;
1841
1842 BUFFER_TRACE(frame->bh, "get_write_access");
1843 err = ext4_journal_get_write_access(handle, frame->bh);
1844 if (err)
1845 goto journal_error;
1846
1847 data2 = bh2->b_data;
1848
1849
1850 map = (struct dx_map_entry *) (data2 + blocksize);
1851 count = dx_make_map(dir, (struct ext4_dir_entry_2 *) data1,
1852 blocksize, hinfo, map);
1853 map -= count;
1854 dx_sort_map(map, count);
1855
1856 size = 0;
1857 move = 0;
1858 for (i = count-1; i >= 0; i--) {
1859
1860 if (size + map[i].size/2 > blocksize/2)
1861 break;
1862 size += map[i].size;
1863 move++;
1864 }
1865
1866 split = count - move;
1867 hash2 = map[split].hash;
1868 continued = hash2 == map[split - 1].hash;
1869 dxtrace(printk(KERN_INFO "Split block %lu at %x, %i/%i\n",
1870 (unsigned long)dx_get_block(frame->at),
1871 hash2, split, count-split));
1872
1873
1874 de2 = dx_move_dirents(data1, data2, map + split, count - split,
1875 blocksize);
1876 de = dx_pack_dirents(data1, blocksize);
1877 de->rec_len = ext4_rec_len_to_disk(data1 + (blocksize - csum_size) -
1878 (char *) de,
1879 blocksize);
1880 de2->rec_len = ext4_rec_len_to_disk(data2 + (blocksize - csum_size) -
1881 (char *) de2,
1882 blocksize);
1883 if (csum_size) {
1884 ext4_initialize_dirent_tail(*bh, blocksize);
1885 ext4_initialize_dirent_tail(bh2, blocksize);
1886 }
1887
1888 dxtrace(dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) data1,
1889 blocksize, 1));
1890 dxtrace(dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) data2,
1891 blocksize, 1));
1892
1893
1894 if (hinfo->hash >= hash2) {
1895 swap(*bh, bh2);
1896 de = de2;
1897 }
1898 dx_insert_block(frame, hash2 + continued, newblock);
1899 err = ext4_handle_dirty_dirblock(handle, dir, bh2);
1900 if (err)
1901 goto journal_error;
1902 err = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
1903 if (err)
1904 goto journal_error;
1905 brelse(bh2);
1906 dxtrace(dx_show_index("frame", frame->entries));
1907 return de;
1908
1909 journal_error:
1910 brelse(*bh);
1911 brelse(bh2);
1912 *bh = NULL;
1913 ext4_std_error(dir->i_sb, err);
1914 return ERR_PTR(err);
1915 }
1916
1917 int ext4_find_dest_de(struct inode *dir, struct inode *inode,
1918 struct buffer_head *bh,
1919 void *buf, int buf_size,
1920 struct ext4_filename *fname,
1921 struct ext4_dir_entry_2 **dest_de)
1922 {
1923 struct ext4_dir_entry_2 *de;
1924 unsigned short reclen = EXT4_DIR_REC_LEN(fname_len(fname));
1925 int nlen, rlen;
1926 unsigned int offset = 0;
1927 char *top;
1928
1929 de = (struct ext4_dir_entry_2 *)buf;
1930 top = buf + buf_size - reclen;
1931 while ((char *) de <= top) {
1932 if (ext4_check_dir_entry(dir, NULL, de, bh,
1933 buf, buf_size, offset))
1934 return -EFSCORRUPTED;
1935 if (ext4_match(dir, fname, de))
1936 return -EEXIST;
1937 nlen = EXT4_DIR_REC_LEN(de->name_len);
1938 rlen = ext4_rec_len_from_disk(de->rec_len, buf_size);
1939 if ((de->inode ? rlen - nlen : rlen) >= reclen)
1940 break;
1941 de = (struct ext4_dir_entry_2 *)((char *)de + rlen);
1942 offset += rlen;
1943 }
1944 if ((char *) de > top)
1945 return -ENOSPC;
1946
1947 *dest_de = de;
1948 return 0;
1949 }
1950
1951 void ext4_insert_dentry(struct inode *inode,
1952 struct ext4_dir_entry_2 *de,
1953 int buf_size,
1954 struct ext4_filename *fname)
1955 {
1956
1957 int nlen, rlen;
1958
1959 nlen = EXT4_DIR_REC_LEN(de->name_len);
1960 rlen = ext4_rec_len_from_disk(de->rec_len, buf_size);
1961 if (de->inode) {
1962 struct ext4_dir_entry_2 *de1 =
1963 (struct ext4_dir_entry_2 *)((char *)de + nlen);
1964 de1->rec_len = ext4_rec_len_to_disk(rlen - nlen, buf_size);
1965 de->rec_len = ext4_rec_len_to_disk(nlen, buf_size);
1966 de = de1;
1967 }
1968 de->file_type = EXT4_FT_UNKNOWN;
1969 de->inode = cpu_to_le32(inode->i_ino);
1970 ext4_set_de_type(inode->i_sb, de, inode->i_mode);
1971 de->name_len = fname_len(fname);
1972 memcpy(de->name, fname_name(fname), fname_len(fname));
1973 }
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983 static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,
1984 struct inode *dir,
1985 struct inode *inode, struct ext4_dir_entry_2 *de,
1986 struct buffer_head *bh)
1987 {
1988 unsigned int blocksize = dir->i_sb->s_blocksize;
1989 int csum_size = 0;
1990 int err;
1991
1992 if (ext4_has_metadata_csum(inode->i_sb))
1993 csum_size = sizeof(struct ext4_dir_entry_tail);
1994
1995 if (!de) {
1996 err = ext4_find_dest_de(dir, inode, bh, bh->b_data,
1997 blocksize - csum_size, fname, &de);
1998 if (err)
1999 return err;
2000 }
2001 BUFFER_TRACE(bh, "get_write_access");
2002 err = ext4_journal_get_write_access(handle, bh);
2003 if (err) {
2004 ext4_std_error(dir->i_sb, err);
2005 return err;
2006 }
2007
2008
2009 ext4_insert_dentry(inode, de, blocksize, fname);
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022 dir->i_mtime = dir->i_ctime = current_time(dir);
2023 ext4_update_dx_flag(dir);
2024 inode_inc_iversion(dir);
2025 ext4_mark_inode_dirty(handle, dir);
2026 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
2027 err = ext4_handle_dirty_dirblock(handle, dir, bh);
2028 if (err)
2029 ext4_std_error(dir->i_sb, err);
2030 return 0;
2031 }
2032
2033
2034
2035
2036
2037 static int make_indexed_dir(handle_t *handle, struct ext4_filename *fname,
2038 struct inode *dir,
2039 struct inode *inode, struct buffer_head *bh)
2040 {
2041 struct buffer_head *bh2;
2042 struct dx_root *root;
2043 struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;
2044 struct dx_entry *entries;
2045 struct ext4_dir_entry_2 *de, *de2;
2046 char *data2, *top;
2047 unsigned len;
2048 int retval;
2049 unsigned blocksize;
2050 ext4_lblk_t block;
2051 struct fake_dirent *fde;
2052 int csum_size = 0;
2053
2054 if (ext4_has_metadata_csum(inode->i_sb))
2055 csum_size = sizeof(struct ext4_dir_entry_tail);
2056
2057 blocksize = dir->i_sb->s_blocksize;
2058 dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
2059 BUFFER_TRACE(bh, "get_write_access");
2060 retval = ext4_journal_get_write_access(handle, bh);
2061 if (retval) {
2062 ext4_std_error(dir->i_sb, retval);
2063 brelse(bh);
2064 return retval;
2065 }
2066 root = (struct dx_root *) bh->b_data;
2067
2068
2069 fde = &root->dotdot;
2070 de = (struct ext4_dir_entry_2 *)((char *)fde +
2071 ext4_rec_len_from_disk(fde->rec_len, blocksize));
2072 if ((char *) de >= (((char *) root) + blocksize)) {
2073 EXT4_ERROR_INODE(dir, "invalid rec_len for '..'");
2074 brelse(bh);
2075 return -EFSCORRUPTED;
2076 }
2077 len = ((char *) root) + (blocksize - csum_size) - (char *) de;
2078
2079
2080 bh2 = ext4_append(handle, dir, &block);
2081 if (IS_ERR(bh2)) {
2082 brelse(bh);
2083 return PTR_ERR(bh2);
2084 }
2085 ext4_set_inode_flag(dir, EXT4_INODE_INDEX);
2086 data2 = bh2->b_data;
2087
2088 memcpy(data2, de, len);
2089 de = (struct ext4_dir_entry_2 *) data2;
2090 top = data2 + len;
2091 while ((char *)(de2 = ext4_next_entry(de, blocksize)) < top)
2092 de = de2;
2093 de->rec_len = ext4_rec_len_to_disk(data2 + (blocksize - csum_size) -
2094 (char *) de, blocksize);
2095
2096 if (csum_size)
2097 ext4_initialize_dirent_tail(bh2, blocksize);
2098
2099
2100 de = (struct ext4_dir_entry_2 *) (&root->dotdot);
2101 de->rec_len = ext4_rec_len_to_disk(blocksize - EXT4_DIR_REC_LEN(2),
2102 blocksize);
2103 memset (&root->info, 0, sizeof(root->info));
2104 root->info.info_length = sizeof(root->info);
2105 root->info.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version;
2106 entries = root->entries;
2107 dx_set_block(entries, 1);
2108 dx_set_count(entries, 1);
2109 dx_set_limit(entries, dx_root_limit(dir, sizeof(root->info)));
2110
2111
2112 fname->hinfo.hash_version = root->info.hash_version;
2113 if (fname->hinfo.hash_version <= DX_HASH_TEA)
2114 fname->hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
2115 fname->hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
2116 ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), &fname->hinfo);
2117
2118 memset(frames, 0, sizeof(frames));
2119 frame = frames;
2120 frame->entries = entries;
2121 frame->at = entries;
2122 frame->bh = bh;
2123
2124 retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
2125 if (retval)
2126 goto out_frames;
2127 retval = ext4_handle_dirty_dirblock(handle, dir, bh2);
2128 if (retval)
2129 goto out_frames;
2130
2131 de = do_split(handle,dir, &bh2, frame, &fname->hinfo);
2132 if (IS_ERR(de)) {
2133 retval = PTR_ERR(de);
2134 goto out_frames;
2135 }
2136
2137 retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh2);
2138 out_frames:
2139
2140
2141
2142
2143
2144 if (retval)
2145 ext4_mark_inode_dirty(handle, dir);
2146 dx_release(frames);
2147 brelse(bh2);
2148 return retval;
2149 }
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161 static int ext4_add_entry(handle_t *handle, struct dentry *dentry,
2162 struct inode *inode)
2163 {
2164 struct inode *dir = d_inode(dentry->d_parent);
2165 struct buffer_head *bh = NULL;
2166 struct ext4_dir_entry_2 *de;
2167 struct super_block *sb;
2168 struct ext4_sb_info *sbi;
2169 struct ext4_filename fname;
2170 int retval;
2171 int dx_fallback=0;
2172 unsigned blocksize;
2173 ext4_lblk_t block, blocks;
2174 int csum_size = 0;
2175
2176 if (ext4_has_metadata_csum(inode->i_sb))
2177 csum_size = sizeof(struct ext4_dir_entry_tail);
2178
2179 sb = dir->i_sb;
2180 sbi = EXT4_SB(sb);
2181 blocksize = sb->s_blocksize;
2182 if (!dentry->d_name.len)
2183 return -EINVAL;
2184
2185 #ifdef CONFIG_UNICODE
2186 if (ext4_has_strict_mode(sbi) && IS_CASEFOLDED(dir) &&
2187 sbi->s_encoding && utf8_validate(sbi->s_encoding, &dentry->d_name))
2188 return -EINVAL;
2189 #endif
2190
2191 retval = ext4_fname_setup_filename(dir, &dentry->d_name, 0, &fname);
2192 if (retval)
2193 return retval;
2194
2195 if (ext4_has_inline_data(dir)) {
2196 retval = ext4_try_add_inline_entry(handle, &fname, dir, inode);
2197 if (retval < 0)
2198 goto out;
2199 if (retval == 1) {
2200 retval = 0;
2201 goto out;
2202 }
2203 }
2204
2205 if (is_dx(dir)) {
2206 retval = ext4_dx_add_entry(handle, &fname, dir, inode);
2207 if (!retval || (retval != ERR_BAD_DX_DIR))
2208 goto out;
2209
2210 if (ext4_has_metadata_csum(sb)) {
2211 EXT4_ERROR_INODE(dir,
2212 "Directory has corrupted htree index.");
2213 retval = -EFSCORRUPTED;
2214 goto out;
2215 }
2216 ext4_clear_inode_flag(dir, EXT4_INODE_INDEX);
2217 dx_fallback++;
2218 ext4_mark_inode_dirty(handle, dir);
2219 }
2220 blocks = dir->i_size >> sb->s_blocksize_bits;
2221 for (block = 0; block < blocks; block++) {
2222 bh = ext4_read_dirblock(dir, block, DIRENT);
2223 if (bh == NULL) {
2224 bh = ext4_bread(handle, dir, block,
2225 EXT4_GET_BLOCKS_CREATE);
2226 goto add_to_new_block;
2227 }
2228 if (IS_ERR(bh)) {
2229 retval = PTR_ERR(bh);
2230 bh = NULL;
2231 goto out;
2232 }
2233 retval = add_dirent_to_buf(handle, &fname, dir, inode,
2234 NULL, bh);
2235 if (retval != -ENOSPC)
2236 goto out;
2237
2238 if (blocks == 1 && !dx_fallback &&
2239 ext4_has_feature_dir_index(sb)) {
2240 retval = make_indexed_dir(handle, &fname, dir,
2241 inode, bh);
2242 bh = NULL;
2243 goto out;
2244 }
2245 brelse(bh);
2246 }
2247 bh = ext4_append(handle, dir, &block);
2248 add_to_new_block:
2249 if (IS_ERR(bh)) {
2250 retval = PTR_ERR(bh);
2251 bh = NULL;
2252 goto out;
2253 }
2254 de = (struct ext4_dir_entry_2 *) bh->b_data;
2255 de->inode = 0;
2256 de->rec_len = ext4_rec_len_to_disk(blocksize - csum_size, blocksize);
2257
2258 if (csum_size)
2259 ext4_initialize_dirent_tail(bh, blocksize);
2260
2261 retval = add_dirent_to_buf(handle, &fname, dir, inode, de, bh);
2262 out:
2263 ext4_fname_free_filename(&fname);
2264 brelse(bh);
2265 if (retval == 0)
2266 ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY);
2267 return retval;
2268 }
2269
2270
2271
2272
2273 static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname,
2274 struct inode *dir, struct inode *inode)
2275 {
2276 struct dx_frame frames[EXT4_HTREE_LEVEL], *frame;
2277 struct dx_entry *entries, *at;
2278 struct buffer_head *bh;
2279 struct super_block *sb = dir->i_sb;
2280 struct ext4_dir_entry_2 *de;
2281 int restart;
2282 int err;
2283
2284 again:
2285 restart = 0;
2286 frame = dx_probe(fname, dir, NULL, frames);
2287 if (IS_ERR(frame))
2288 return PTR_ERR(frame);
2289 entries = frame->entries;
2290 at = frame->at;
2291 bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT_HTREE);
2292 if (IS_ERR(bh)) {
2293 err = PTR_ERR(bh);
2294 bh = NULL;
2295 goto cleanup;
2296 }
2297
2298 BUFFER_TRACE(bh, "get_write_access");
2299 err = ext4_journal_get_write_access(handle, bh);
2300 if (err)
2301 goto journal_error;
2302
2303 err = add_dirent_to_buf(handle, fname, dir, inode, NULL, bh);
2304 if (err != -ENOSPC)
2305 goto cleanup;
2306
2307 err = 0;
2308
2309 dxtrace(printk(KERN_DEBUG "using %u of %u node entries\n",
2310 dx_get_count(entries), dx_get_limit(entries)));
2311
2312 if (dx_get_count(entries) == dx_get_limit(entries)) {
2313 ext4_lblk_t newblock;
2314 int levels = frame - frames + 1;
2315 unsigned int icount;
2316 int add_level = 1;
2317 struct dx_entry *entries2;
2318 struct dx_node *node2;
2319 struct buffer_head *bh2;
2320
2321 while (frame > frames) {
2322 if (dx_get_count((frame - 1)->entries) <
2323 dx_get_limit((frame - 1)->entries)) {
2324 add_level = 0;
2325 break;
2326 }
2327 frame--;
2328 at = frame->at;
2329 entries = frame->entries;
2330 restart = 1;
2331 }
2332 if (add_level && levels == ext4_dir_htree_level(sb)) {
2333 ext4_warning(sb, "Directory (ino: %lu) index full, "
2334 "reach max htree level :%d",
2335 dir->i_ino, levels);
2336 if (ext4_dir_htree_level(sb) < EXT4_HTREE_LEVEL) {
2337 ext4_warning(sb, "Large directory feature is "
2338 "not enabled on this "
2339 "filesystem");
2340 }
2341 err = -ENOSPC;
2342 goto cleanup;
2343 }
2344 icount = dx_get_count(entries);
2345 bh2 = ext4_append(handle, dir, &newblock);
2346 if (IS_ERR(bh2)) {
2347 err = PTR_ERR(bh2);
2348 goto cleanup;
2349 }
2350 node2 = (struct dx_node *)(bh2->b_data);
2351 entries2 = node2->entries;
2352 memset(&node2->fake, 0, sizeof(struct fake_dirent));
2353 node2->fake.rec_len = ext4_rec_len_to_disk(sb->s_blocksize,
2354 sb->s_blocksize);
2355 BUFFER_TRACE(frame->bh, "get_write_access");
2356 err = ext4_journal_get_write_access(handle, frame->bh);
2357 if (err)
2358 goto journal_error;
2359 if (!add_level) {
2360 unsigned icount1 = icount/2, icount2 = icount - icount1;
2361 unsigned hash2 = dx_get_hash(entries + icount1);
2362 dxtrace(printk(KERN_DEBUG "Split index %i/%i\n",
2363 icount1, icount2));
2364
2365 BUFFER_TRACE(frame->bh, "get_write_access");
2366 err = ext4_journal_get_write_access(handle,
2367 (frame - 1)->bh);
2368 if (err)
2369 goto journal_error;
2370
2371 memcpy((char *) entries2, (char *) (entries + icount1),
2372 icount2 * sizeof(struct dx_entry));
2373 dx_set_count(entries, icount1);
2374 dx_set_count(entries2, icount2);
2375 dx_set_limit(entries2, dx_node_limit(dir));
2376
2377
2378 if (at - entries >= icount1) {
2379 frame->at = at = at - entries - icount1 + entries2;
2380 frame->entries = entries = entries2;
2381 swap(frame->bh, bh2);
2382 }
2383 dx_insert_block((frame - 1), hash2, newblock);
2384 dxtrace(dx_show_index("node", frame->entries));
2385 dxtrace(dx_show_index("node",
2386 ((struct dx_node *) bh2->b_data)->entries));
2387 err = ext4_handle_dirty_dx_node(handle, dir, bh2);
2388 if (err)
2389 goto journal_error;
2390 brelse (bh2);
2391 err = ext4_handle_dirty_dx_node(handle, dir,
2392 (frame - 1)->bh);
2393 if (err)
2394 goto journal_error;
2395 if (restart) {
2396 err = ext4_handle_dirty_dx_node(handle, dir,
2397 frame->bh);
2398 goto journal_error;
2399 }
2400 } else {
2401 struct dx_root *dxroot;
2402 memcpy((char *) entries2, (char *) entries,
2403 icount * sizeof(struct dx_entry));
2404 dx_set_limit(entries2, dx_node_limit(dir));
2405
2406
2407 dx_set_count(entries, 1);
2408 dx_set_block(entries + 0, newblock);
2409 dxroot = (struct dx_root *)frames[0].bh->b_data;
2410 dxroot->info.indirect_levels += 1;
2411 dxtrace(printk(KERN_DEBUG
2412 "Creating %d level index...\n",
2413 dxroot->info.indirect_levels));
2414 err = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
2415 if (err)
2416 goto journal_error;
2417 err = ext4_handle_dirty_dx_node(handle, dir, bh2);
2418 brelse(bh2);
2419 restart = 1;
2420 goto journal_error;
2421 }
2422 }
2423 de = do_split(handle, dir, &bh, frame, &fname->hinfo);
2424 if (IS_ERR(de)) {
2425 err = PTR_ERR(de);
2426 goto cleanup;
2427 }
2428 err = add_dirent_to_buf(handle, fname, dir, inode, de, bh);
2429 goto cleanup;
2430
2431 journal_error:
2432 ext4_std_error(dir->i_sb, err);
2433 cleanup:
2434 brelse(bh);
2435 dx_release(frames);
2436
2437
2438
2439 if (restart && err == 0)
2440 goto again;
2441 return err;
2442 }
2443
2444
2445
2446
2447
2448 int ext4_generic_delete_entry(handle_t *handle,
2449 struct inode *dir,
2450 struct ext4_dir_entry_2 *de_del,
2451 struct buffer_head *bh,
2452 void *entry_buf,
2453 int buf_size,
2454 int csum_size)
2455 {
2456 struct ext4_dir_entry_2 *de, *pde;
2457 unsigned int blocksize = dir->i_sb->s_blocksize;
2458 int i;
2459
2460 i = 0;
2461 pde = NULL;
2462 de = (struct ext4_dir_entry_2 *)entry_buf;
2463 while (i < buf_size - csum_size) {
2464 if (ext4_check_dir_entry(dir, NULL, de, bh,
2465 bh->b_data, bh->b_size, i))
2466 return -EFSCORRUPTED;
2467 if (de == de_del) {
2468 if (pde)
2469 pde->rec_len = ext4_rec_len_to_disk(
2470 ext4_rec_len_from_disk(pde->rec_len,
2471 blocksize) +
2472 ext4_rec_len_from_disk(de->rec_len,
2473 blocksize),
2474 blocksize);
2475 else
2476 de->inode = 0;
2477 inode_inc_iversion(dir);
2478 return 0;
2479 }
2480 i += ext4_rec_len_from_disk(de->rec_len, blocksize);
2481 pde = de;
2482 de = ext4_next_entry(de, blocksize);
2483 }
2484 return -ENOENT;
2485 }
2486
2487 static int ext4_delete_entry(handle_t *handle,
2488 struct inode *dir,
2489 struct ext4_dir_entry_2 *de_del,
2490 struct buffer_head *bh)
2491 {
2492 int err, csum_size = 0;
2493
2494 if (ext4_has_inline_data(dir)) {
2495 int has_inline_data = 1;
2496 err = ext4_delete_inline_entry(handle, dir, de_del, bh,
2497 &has_inline_data);
2498 if (has_inline_data)
2499 return err;
2500 }
2501
2502 if (ext4_has_metadata_csum(dir->i_sb))
2503 csum_size = sizeof(struct ext4_dir_entry_tail);
2504
2505 BUFFER_TRACE(bh, "get_write_access");
2506 err = ext4_journal_get_write_access(handle, bh);
2507 if (unlikely(err))
2508 goto out;
2509
2510 err = ext4_generic_delete_entry(handle, dir, de_del,
2511 bh, bh->b_data,
2512 dir->i_sb->s_blocksize, csum_size);
2513 if (err)
2514 goto out;
2515
2516 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
2517 err = ext4_handle_dirty_dirblock(handle, dir, bh);
2518 if (unlikely(err))
2519 goto out;
2520
2521 return 0;
2522 out:
2523 if (err != -ENOENT)
2524 ext4_std_error(dir->i_sb, err);
2525 return err;
2526 }
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539 static void ext4_inc_count(handle_t *handle, struct inode *inode)
2540 {
2541 inc_nlink(inode);
2542 if (is_dx(inode) &&
2543 (inode->i_nlink > EXT4_LINK_MAX || inode->i_nlink == 2))
2544 set_nlink(inode, 1);
2545 }
2546
2547
2548
2549
2550
2551 static void ext4_dec_count(handle_t *handle, struct inode *inode)
2552 {
2553 if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2)
2554 drop_nlink(inode);
2555 }
2556
2557
2558 static int ext4_add_nondir(handle_t *handle,
2559 struct dentry *dentry, struct inode *inode)
2560 {
2561 int err = ext4_add_entry(handle, dentry, inode);
2562 if (!err) {
2563 ext4_mark_inode_dirty(handle, inode);
2564 d_instantiate_new(dentry, inode);
2565 return 0;
2566 }
2567 drop_nlink(inode);
2568 unlock_new_inode(inode);
2569 iput(inode);
2570 return err;
2571 }
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581 static int ext4_create(struct inode *dir, struct dentry *dentry, umode_t mode,
2582 bool excl)
2583 {
2584 handle_t *handle;
2585 struct inode *inode;
2586 int err, credits, retries = 0;
2587
2588 err = dquot_initialize(dir);
2589 if (err)
2590 return err;
2591
2592 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
2593 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);
2594 retry:
2595 inode = ext4_new_inode_start_handle(dir, mode, &dentry->d_name, 0,
2596 NULL, EXT4_HT_DIR, credits);
2597 handle = ext4_journal_current_handle();
2598 err = PTR_ERR(inode);
2599 if (!IS_ERR(inode)) {
2600 inode->i_op = &ext4_file_inode_operations;
2601 inode->i_fop = &ext4_file_operations;
2602 ext4_set_aops(inode);
2603 err = ext4_add_nondir(handle, dentry, inode);
2604 if (!err && IS_DIRSYNC(dir))
2605 ext4_handle_sync(handle);
2606 }
2607 if (handle)
2608 ext4_journal_stop(handle);
2609 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
2610 goto retry;
2611 return err;
2612 }
2613
2614 static int ext4_mknod(struct inode *dir, struct dentry *dentry,
2615 umode_t mode, dev_t rdev)
2616 {
2617 handle_t *handle;
2618 struct inode *inode;
2619 int err, credits, retries = 0;
2620
2621 err = dquot_initialize(dir);
2622 if (err)
2623 return err;
2624
2625 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
2626 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);
2627 retry:
2628 inode = ext4_new_inode_start_handle(dir, mode, &dentry->d_name, 0,
2629 NULL, EXT4_HT_DIR, credits);
2630 handle = ext4_journal_current_handle();
2631 err = PTR_ERR(inode);
2632 if (!IS_ERR(inode)) {
2633 init_special_inode(inode, inode->i_mode, rdev);
2634 inode->i_op = &ext4_special_inode_operations;
2635 err = ext4_add_nondir(handle, dentry, inode);
2636 if (!err && IS_DIRSYNC(dir))
2637 ext4_handle_sync(handle);
2638 }
2639 if (handle)
2640 ext4_journal_stop(handle);
2641 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
2642 goto retry;
2643 return err;
2644 }
2645
2646 static int ext4_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
2647 {
2648 handle_t *handle;
2649 struct inode *inode;
2650 int err, retries = 0;
2651
2652 err = dquot_initialize(dir);
2653 if (err)
2654 return err;
2655
2656 retry:
2657 inode = ext4_new_inode_start_handle(dir, mode,
2658 NULL, 0, NULL,
2659 EXT4_HT_DIR,
2660 EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) +
2661 4 + EXT4_XATTR_TRANS_BLOCKS);
2662 handle = ext4_journal_current_handle();
2663 err = PTR_ERR(inode);
2664 if (!IS_ERR(inode)) {
2665 inode->i_op = &ext4_file_inode_operations;
2666 inode->i_fop = &ext4_file_operations;
2667 ext4_set_aops(inode);
2668 d_tmpfile(dentry, inode);
2669 err = ext4_orphan_add(handle, inode);
2670 if (err)
2671 goto err_unlock_inode;
2672 mark_inode_dirty(inode);
2673 unlock_new_inode(inode);
2674 }
2675 if (handle)
2676 ext4_journal_stop(handle);
2677 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
2678 goto retry;
2679 return err;
2680 err_unlock_inode:
2681 ext4_journal_stop(handle);
2682 unlock_new_inode(inode);
2683 return err;
2684 }
2685
2686 struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
2687 struct ext4_dir_entry_2 *de,
2688 int blocksize, int csum_size,
2689 unsigned int parent_ino, int dotdot_real_len)
2690 {
2691 de->inode = cpu_to_le32(inode->i_ino);
2692 de->name_len = 1;
2693 de->rec_len = ext4_rec_len_to_disk(EXT4_DIR_REC_LEN(de->name_len),
2694 blocksize);
2695 strcpy(de->name, ".");
2696 ext4_set_de_type(inode->i_sb, de, S_IFDIR);
2697
2698 de = ext4_next_entry(de, blocksize);
2699 de->inode = cpu_to_le32(parent_ino);
2700 de->name_len = 2;
2701 if (!dotdot_real_len)
2702 de->rec_len = ext4_rec_len_to_disk(blocksize -
2703 (csum_size + EXT4_DIR_REC_LEN(1)),
2704 blocksize);
2705 else
2706 de->rec_len = ext4_rec_len_to_disk(
2707 EXT4_DIR_REC_LEN(de->name_len), blocksize);
2708 strcpy(de->name, "..");
2709 ext4_set_de_type(inode->i_sb, de, S_IFDIR);
2710
2711 return ext4_next_entry(de, blocksize);
2712 }
2713
2714 static int ext4_init_new_dir(handle_t *handle, struct inode *dir,
2715 struct inode *inode)
2716 {
2717 struct buffer_head *dir_block = NULL;
2718 struct ext4_dir_entry_2 *de;
2719 ext4_lblk_t block = 0;
2720 unsigned int blocksize = dir->i_sb->s_blocksize;
2721 int csum_size = 0;
2722 int err;
2723
2724 if (ext4_has_metadata_csum(dir->i_sb))
2725 csum_size = sizeof(struct ext4_dir_entry_tail);
2726
2727 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
2728 err = ext4_try_create_inline_dir(handle, dir, inode);
2729 if (err < 0 && err != -ENOSPC)
2730 goto out;
2731 if (!err)
2732 goto out;
2733 }
2734
2735 inode->i_size = 0;
2736 dir_block = ext4_append(handle, inode, &block);
2737 if (IS_ERR(dir_block))
2738 return PTR_ERR(dir_block);
2739 de = (struct ext4_dir_entry_2 *)dir_block->b_data;
2740 ext4_init_dot_dotdot(inode, de, blocksize, csum_size, dir->i_ino, 0);
2741 set_nlink(inode, 2);
2742 if (csum_size)
2743 ext4_initialize_dirent_tail(dir_block, blocksize);
2744
2745 BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");
2746 err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
2747 if (err)
2748 goto out;
2749 set_buffer_verified(dir_block);
2750 out:
2751 brelse(dir_block);
2752 return err;
2753 }
2754
2755 static int ext4_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
2756 {
2757 handle_t *handle;
2758 struct inode *inode;
2759 int err, credits, retries = 0;
2760
2761 if (EXT4_DIR_LINK_MAX(dir))
2762 return -EMLINK;
2763
2764 err = dquot_initialize(dir);
2765 if (err)
2766 return err;
2767
2768 credits = (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
2769 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3);
2770 retry:
2771 inode = ext4_new_inode_start_handle(dir, S_IFDIR | mode,
2772 &dentry->d_name,
2773 0, NULL, EXT4_HT_DIR, credits);
2774 handle = ext4_journal_current_handle();
2775 err = PTR_ERR(inode);
2776 if (IS_ERR(inode))
2777 goto out_stop;
2778
2779 inode->i_op = &ext4_dir_inode_operations;
2780 inode->i_fop = &ext4_dir_operations;
2781 err = ext4_init_new_dir(handle, dir, inode);
2782 if (err)
2783 goto out_clear_inode;
2784 err = ext4_mark_inode_dirty(handle, inode);
2785 if (!err)
2786 err = ext4_add_entry(handle, dentry, inode);
2787 if (err) {
2788 out_clear_inode:
2789 clear_nlink(inode);
2790 unlock_new_inode(inode);
2791 ext4_mark_inode_dirty(handle, inode);
2792 iput(inode);
2793 goto out_stop;
2794 }
2795 ext4_inc_count(handle, dir);
2796 ext4_update_dx_flag(dir);
2797 err = ext4_mark_inode_dirty(handle, dir);
2798 if (err)
2799 goto out_clear_inode;
2800 d_instantiate_new(dentry, inode);
2801 if (IS_DIRSYNC(dir))
2802 ext4_handle_sync(handle);
2803
2804 out_stop:
2805 if (handle)
2806 ext4_journal_stop(handle);
2807 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
2808 goto retry;
2809 return err;
2810 }
2811
2812
2813
2814
2815 bool ext4_empty_dir(struct inode *inode)
2816 {
2817 unsigned int offset;
2818 struct buffer_head *bh;
2819 struct ext4_dir_entry_2 *de;
2820 struct super_block *sb;
2821
2822 if (ext4_has_inline_data(inode)) {
2823 int has_inline_data = 1;
2824 int ret;
2825
2826 ret = empty_inline_dir(inode, &has_inline_data);
2827 if (has_inline_data)
2828 return ret;
2829 }
2830
2831 sb = inode->i_sb;
2832 if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2)) {
2833 EXT4_ERROR_INODE(inode, "invalid size");
2834 return true;
2835 }
2836
2837
2838
2839 bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE);
2840 if (IS_ERR(bh))
2841 return true;
2842
2843 de = (struct ext4_dir_entry_2 *) bh->b_data;
2844 if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size,
2845 0) ||
2846 le32_to_cpu(de->inode) != inode->i_ino || strcmp(".", de->name)) {
2847 ext4_warning_inode(inode, "directory missing '.'");
2848 brelse(bh);
2849 return true;
2850 }
2851 offset = ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize);
2852 de = ext4_next_entry(de, sb->s_blocksize);
2853 if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size,
2854 offset) ||
2855 le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) {
2856 ext4_warning_inode(inode, "directory missing '..'");
2857 brelse(bh);
2858 return true;
2859 }
2860 offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize);
2861 while (offset < inode->i_size) {
2862 if (!(offset & (sb->s_blocksize - 1))) {
2863 unsigned int lblock;
2864 brelse(bh);
2865 lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb);
2866 bh = ext4_read_dirblock(inode, lblock, EITHER);
2867 if (bh == NULL) {
2868 offset += sb->s_blocksize;
2869 continue;
2870 }
2871 if (IS_ERR(bh))
2872 return true;
2873 }
2874 de = (struct ext4_dir_entry_2 *) (bh->b_data +
2875 (offset & (sb->s_blocksize - 1)));
2876 if (ext4_check_dir_entry(inode, NULL, de, bh,
2877 bh->b_data, bh->b_size, offset)) {
2878 offset = (offset | (sb->s_blocksize - 1)) + 1;
2879 continue;
2880 }
2881 if (le32_to_cpu(de->inode)) {
2882 brelse(bh);
2883 return false;
2884 }
2885 offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize);
2886 }
2887 brelse(bh);
2888 return true;
2889 }
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903 int ext4_orphan_add(handle_t *handle, struct inode *inode)
2904 {
2905 struct super_block *sb = inode->i_sb;
2906 struct ext4_sb_info *sbi = EXT4_SB(sb);
2907 struct ext4_iloc iloc;
2908 int err = 0, rc;
2909 bool dirty = false;
2910
2911 if (!sbi->s_journal || is_bad_inode(inode))
2912 return 0;
2913
2914 WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) &&
2915 !inode_is_locked(inode));
2916
2917
2918
2919
2920 if (!list_empty(&EXT4_I(inode)->i_orphan))
2921 return 0;
2922
2923
2924
2925
2926
2927
2928
2929 J_ASSERT((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
2930 S_ISLNK(inode->i_mode)) || inode->i_nlink == 0);
2931
2932 BUFFER_TRACE(sbi->s_sbh, "get_write_access");
2933 err = ext4_journal_get_write_access(handle, sbi->s_sbh);
2934 if (err)
2935 goto out;
2936
2937 err = ext4_reserve_inode_write(handle, inode, &iloc);
2938 if (err)
2939 goto out;
2940
2941 mutex_lock(&sbi->s_orphan_lock);
2942
2943
2944
2945
2946 if (!NEXT_ORPHAN(inode) || NEXT_ORPHAN(inode) >
2947 (le32_to_cpu(sbi->s_es->s_inodes_count))) {
2948
2949 NEXT_ORPHAN(inode) = le32_to_cpu(sbi->s_es->s_last_orphan);
2950 sbi->s_es->s_last_orphan = cpu_to_le32(inode->i_ino);
2951 dirty = true;
2952 }
2953 list_add(&EXT4_I(inode)->i_orphan, &sbi->s_orphan);
2954 mutex_unlock(&sbi->s_orphan_lock);
2955
2956 if (dirty) {
2957 err = ext4_handle_dirty_super(handle, sb);
2958 rc = ext4_mark_iloc_dirty(handle, inode, &iloc);
2959 if (!err)
2960 err = rc;
2961 if (err) {
2962
2963
2964
2965
2966
2967 mutex_lock(&sbi->s_orphan_lock);
2968 list_del_init(&EXT4_I(inode)->i_orphan);
2969 mutex_unlock(&sbi->s_orphan_lock);
2970 }
2971 } else
2972 brelse(iloc.bh);
2973
2974 jbd_debug(4, "superblock will point to %lu\n", inode->i_ino);
2975 jbd_debug(4, "orphan inode %lu will point to %d\n",
2976 inode->i_ino, NEXT_ORPHAN(inode));
2977 out:
2978 ext4_std_error(sb, err);
2979 return err;
2980 }
2981
2982
2983
2984
2985
2986 int ext4_orphan_del(handle_t *handle, struct inode *inode)
2987 {
2988 struct list_head *prev;
2989 struct ext4_inode_info *ei = EXT4_I(inode);
2990 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
2991 __u32 ino_next;
2992 struct ext4_iloc iloc;
2993 int err = 0;
2994
2995 if (!sbi->s_journal && !(sbi->s_mount_state & EXT4_ORPHAN_FS))
2996 return 0;
2997
2998 WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) &&
2999 !inode_is_locked(inode));
3000
3001 if (list_empty(&ei->i_orphan))
3002 return 0;
3003
3004 if (handle) {
3005
3006 err = ext4_reserve_inode_write(handle, inode, &iloc);
3007 }
3008
3009 mutex_lock(&sbi->s_orphan_lock);
3010 jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino);
3011
3012 prev = ei->i_orphan.prev;
3013 list_del_init(&ei->i_orphan);
3014
3015
3016
3017
3018
3019 if (!handle || err) {
3020 mutex_unlock(&sbi->s_orphan_lock);
3021 goto out_err;
3022 }
3023
3024 ino_next = NEXT_ORPHAN(inode);
3025 if (prev == &sbi->s_orphan) {
3026 jbd_debug(4, "superblock will point to %u\n", ino_next);
3027 BUFFER_TRACE(sbi->s_sbh, "get_write_access");
3028 err = ext4_journal_get_write_access(handle, sbi->s_sbh);
3029 if (err) {
3030 mutex_unlock(&sbi->s_orphan_lock);
3031 goto out_brelse;
3032 }
3033 sbi->s_es->s_last_orphan = cpu_to_le32(ino_next);
3034 mutex_unlock(&sbi->s_orphan_lock);
3035 err = ext4_handle_dirty_super(handle, inode->i_sb);
3036 } else {
3037 struct ext4_iloc iloc2;
3038 struct inode *i_prev =
3039 &list_entry(prev, struct ext4_inode_info, i_orphan)->vfs_inode;
3040
3041 jbd_debug(4, "orphan inode %lu will point to %u\n",
3042 i_prev->i_ino, ino_next);
3043 err = ext4_reserve_inode_write(handle, i_prev, &iloc2);
3044 if (err) {
3045 mutex_unlock(&sbi->s_orphan_lock);
3046 goto out_brelse;
3047 }
3048 NEXT_ORPHAN(i_prev) = ino_next;
3049 err = ext4_mark_iloc_dirty(handle, i_prev, &iloc2);
3050 mutex_unlock(&sbi->s_orphan_lock);
3051 }
3052 if (err)
3053 goto out_brelse;
3054 NEXT_ORPHAN(inode) = 0;
3055 err = ext4_mark_iloc_dirty(handle, inode, &iloc);
3056 out_err:
3057 ext4_std_error(inode->i_sb, err);
3058 return err;
3059
3060 out_brelse:
3061 brelse(iloc.bh);
3062 goto out_err;
3063 }
3064
3065 static int ext4_rmdir(struct inode *dir, struct dentry *dentry)
3066 {
3067 int retval;
3068 struct inode *inode;
3069 struct buffer_head *bh;
3070 struct ext4_dir_entry_2 *de;
3071 handle_t *handle = NULL;
3072
3073 if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb))))
3074 return -EIO;
3075
3076
3077
3078 retval = dquot_initialize(dir);
3079 if (retval)
3080 return retval;
3081 retval = dquot_initialize(d_inode(dentry));
3082 if (retval)
3083 return retval;
3084
3085 retval = -ENOENT;
3086 bh = ext4_find_entry(dir, &dentry->d_name, &de, NULL);
3087 if (IS_ERR(bh))
3088 return PTR_ERR(bh);
3089 if (!bh)
3090 goto end_rmdir;
3091
3092 inode = d_inode(dentry);
3093
3094 retval = -EFSCORRUPTED;
3095 if (le32_to_cpu(de->inode) != inode->i_ino)
3096 goto end_rmdir;
3097
3098 retval = -ENOTEMPTY;
3099 if (!ext4_empty_dir(inode))
3100 goto end_rmdir;
3101
3102 handle = ext4_journal_start(dir, EXT4_HT_DIR,
3103 EXT4_DATA_TRANS_BLOCKS(dir->i_sb));
3104 if (IS_ERR(handle)) {
3105 retval = PTR_ERR(handle);
3106 handle = NULL;
3107 goto end_rmdir;
3108 }
3109
3110 if (IS_DIRSYNC(dir))
3111 ext4_handle_sync(handle);
3112
3113 retval = ext4_delete_entry(handle, dir, de, bh);
3114 if (retval)
3115 goto end_rmdir;
3116 if (!EXT4_DIR_LINK_EMPTY(inode))
3117 ext4_warning_inode(inode,
3118 "empty directory '%.*s' has too many links (%u)",
3119 dentry->d_name.len, dentry->d_name.name,
3120 inode->i_nlink);
3121 inode_inc_iversion(inode);
3122 clear_nlink(inode);
3123
3124
3125
3126 inode->i_size = 0;
3127 ext4_orphan_add(handle, inode);
3128 inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
3129 ext4_mark_inode_dirty(handle, inode);
3130 ext4_dec_count(handle, dir);
3131 ext4_update_dx_flag(dir);
3132 ext4_mark_inode_dirty(handle, dir);
3133
3134 #ifdef CONFIG_UNICODE
3135
3136
3137
3138
3139
3140
3141 if (IS_CASEFOLDED(dir))
3142 d_invalidate(dentry);
3143 #endif
3144
3145 end_rmdir:
3146 brelse(bh);
3147 if (handle)
3148 ext4_journal_stop(handle);
3149 return retval;
3150 }
3151
3152 static int ext4_unlink(struct inode *dir, struct dentry *dentry)
3153 {
3154 int retval;
3155 struct inode *inode;
3156 struct buffer_head *bh;
3157 struct ext4_dir_entry_2 *de;
3158 handle_t *handle = NULL;
3159
3160 if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb))))
3161 return -EIO;
3162
3163 trace_ext4_unlink_enter(dir, dentry);
3164
3165
3166 retval = dquot_initialize(dir);
3167 if (retval)
3168 return retval;
3169 retval = dquot_initialize(d_inode(dentry));
3170 if (retval)
3171 return retval;
3172
3173 retval = -ENOENT;
3174 bh = ext4_find_entry(dir, &dentry->d_name, &de, NULL);
3175 if (IS_ERR(bh))
3176 return PTR_ERR(bh);
3177 if (!bh)
3178 goto end_unlink;
3179
3180 inode = d_inode(dentry);
3181
3182 retval = -EFSCORRUPTED;
3183 if (le32_to_cpu(de->inode) != inode->i_ino)
3184 goto end_unlink;
3185
3186 handle = ext4_journal_start(dir, EXT4_HT_DIR,
3187 EXT4_DATA_TRANS_BLOCKS(dir->i_sb));
3188 if (IS_ERR(handle)) {
3189 retval = PTR_ERR(handle);
3190 handle = NULL;
3191 goto end_unlink;
3192 }
3193
3194 if (IS_DIRSYNC(dir))
3195 ext4_handle_sync(handle);
3196
3197 retval = ext4_delete_entry(handle, dir, de, bh);
3198 if (retval)
3199 goto end_unlink;
3200 dir->i_ctime = dir->i_mtime = current_time(dir);
3201 ext4_update_dx_flag(dir);
3202 ext4_mark_inode_dirty(handle, dir);
3203 if (inode->i_nlink == 0)
3204 ext4_warning_inode(inode, "Deleting file '%.*s' with no links",
3205 dentry->d_name.len, dentry->d_name.name);
3206 else
3207 drop_nlink(inode);
3208 if (!inode->i_nlink)
3209 ext4_orphan_add(handle, inode);
3210 inode->i_ctime = current_time(inode);
3211 ext4_mark_inode_dirty(handle, inode);
3212
3213 #ifdef CONFIG_UNICODE
3214
3215
3216
3217
3218
3219
3220 if (IS_CASEFOLDED(dir))
3221 d_invalidate(dentry);
3222 #endif
3223
3224 end_unlink:
3225 brelse(bh);
3226 if (handle)
3227 ext4_journal_stop(handle);
3228 trace_ext4_unlink_exit(dentry, retval);
3229 return retval;
3230 }
3231
3232 static int ext4_symlink(struct inode *dir,
3233 struct dentry *dentry, const char *symname)
3234 {
3235 handle_t *handle;
3236 struct inode *inode;
3237 int err, len = strlen(symname);
3238 int credits;
3239 struct fscrypt_str disk_link;
3240
3241 if (unlikely(ext4_forced_shutdown(EXT4_SB(dir->i_sb))))
3242 return -EIO;
3243
3244 err = fscrypt_prepare_symlink(dir, symname, len, dir->i_sb->s_blocksize,
3245 &disk_link);
3246 if (err)
3247 return err;
3248
3249 err = dquot_initialize(dir);
3250 if (err)
3251 return err;
3252
3253 if ((disk_link.len > EXT4_N_BLOCKS * 4)) {
3254
3255
3256
3257
3258
3259
3260 credits = 4 + EXT4_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) +
3261 EXT4_XATTR_TRANS_BLOCKS;
3262 } else {
3263
3264
3265
3266
3267
3268
3269 credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
3270 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3;
3271 }
3272
3273 inode = ext4_new_inode_start_handle(dir, S_IFLNK|S_IRWXUGO,
3274 &dentry->d_name, 0, NULL,
3275 EXT4_HT_DIR, credits);
3276 handle = ext4_journal_current_handle();
3277 if (IS_ERR(inode)) {
3278 if (handle)
3279 ext4_journal_stop(handle);
3280 return PTR_ERR(inode);
3281 }
3282
3283 if (IS_ENCRYPTED(inode)) {
3284 err = fscrypt_encrypt_symlink(inode, symname, len, &disk_link);
3285 if (err)
3286 goto err_drop_inode;
3287 inode->i_op = &ext4_encrypted_symlink_inode_operations;
3288 }
3289
3290 if ((disk_link.len > EXT4_N_BLOCKS * 4)) {
3291 if (!IS_ENCRYPTED(inode))
3292 inode->i_op = &ext4_symlink_inode_operations;
3293 inode_nohighmem(inode);
3294 ext4_set_aops(inode);
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305 drop_nlink(inode);
3306 err = ext4_orphan_add(handle, inode);
3307 ext4_journal_stop(handle);
3308 handle = NULL;
3309 if (err)
3310 goto err_drop_inode;
3311 err = __page_symlink(inode, disk_link.name, disk_link.len, 1);
3312 if (err)
3313 goto err_drop_inode;
3314
3315
3316
3317
3318 handle = ext4_journal_start(dir, EXT4_HT_DIR,
3319 EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
3320 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 1);
3321 if (IS_ERR(handle)) {
3322 err = PTR_ERR(handle);
3323 handle = NULL;
3324 goto err_drop_inode;
3325 }
3326 set_nlink(inode, 1);
3327 err = ext4_orphan_del(handle, inode);
3328 if (err)
3329 goto err_drop_inode;
3330 } else {
3331
3332 ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS);
3333 if (!IS_ENCRYPTED(inode)) {
3334 inode->i_op = &ext4_fast_symlink_inode_operations;
3335 inode->i_link = (char *)&EXT4_I(inode)->i_data;
3336 }
3337 memcpy((char *)&EXT4_I(inode)->i_data, disk_link.name,
3338 disk_link.len);
3339 inode->i_size = disk_link.len - 1;
3340 }
3341 EXT4_I(inode)->i_disksize = inode->i_size;
3342 err = ext4_add_nondir(handle, dentry, inode);
3343 if (!err && IS_DIRSYNC(dir))
3344 ext4_handle_sync(handle);
3345
3346 if (handle)
3347 ext4_journal_stop(handle);
3348 goto out_free_encrypted_link;
3349
3350 err_drop_inode:
3351 if (handle)
3352 ext4_journal_stop(handle);
3353 clear_nlink(inode);
3354 unlock_new_inode(inode);
3355 iput(inode);
3356 out_free_encrypted_link:
3357 if (disk_link.name != (unsigned char *)symname)
3358 kfree(disk_link.name);
3359 return err;
3360 }
3361
3362 static int ext4_link(struct dentry *old_dentry,
3363 struct inode *dir, struct dentry *dentry)
3364 {
3365 handle_t *handle;
3366 struct inode *inode = d_inode(old_dentry);
3367 int err, retries = 0;
3368
3369 if (inode->i_nlink >= EXT4_LINK_MAX)
3370 return -EMLINK;
3371
3372 err = fscrypt_prepare_link(old_dentry, dir, dentry);
3373 if (err)
3374 return err;
3375
3376 if ((ext4_test_inode_flag(dir, EXT4_INODE_PROJINHERIT)) &&
3377 (!projid_eq(EXT4_I(dir)->i_projid,
3378 EXT4_I(old_dentry->d_inode)->i_projid)))
3379 return -EXDEV;
3380
3381 err = dquot_initialize(dir);
3382 if (err)
3383 return err;
3384
3385 retry:
3386 handle = ext4_journal_start(dir, EXT4_HT_DIR,
3387 (EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
3388 EXT4_INDEX_EXTRA_TRANS_BLOCKS) + 1);
3389 if (IS_ERR(handle))
3390 return PTR_ERR(handle);
3391
3392 if (IS_DIRSYNC(dir))
3393 ext4_handle_sync(handle);
3394
3395 inode->i_ctime = current_time(inode);
3396 ext4_inc_count(handle, inode);
3397 ihold(inode);
3398
3399 err = ext4_add_entry(handle, dentry, inode);
3400 if (!err) {
3401 ext4_mark_inode_dirty(handle, inode);
3402
3403
3404
3405 if (inode->i_nlink == 1)
3406 ext4_orphan_del(handle, inode);
3407 d_instantiate(dentry, inode);
3408 } else {
3409 drop_nlink(inode);
3410 iput(inode);
3411 }
3412 ext4_journal_stop(handle);
3413 if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
3414 goto retry;
3415 return err;
3416 }
3417
3418
3419
3420
3421
3422
3423
3424 static struct buffer_head *ext4_get_first_dir_block(handle_t *handle,
3425 struct inode *inode,
3426 int *retval,
3427 struct ext4_dir_entry_2 **parent_de,
3428 int *inlined)
3429 {
3430 struct buffer_head *bh;
3431
3432 if (!ext4_has_inline_data(inode)) {
3433
3434
3435
3436 bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE);
3437 if (IS_ERR(bh)) {
3438 *retval = PTR_ERR(bh);
3439 return NULL;
3440 }
3441 *parent_de = ext4_next_entry(
3442 (struct ext4_dir_entry_2 *)bh->b_data,
3443 inode->i_sb->s_blocksize);
3444 return bh;
3445 }
3446
3447 *inlined = 1;
3448 return ext4_get_first_inline_block(inode, parent_de, retval);
3449 }
3450
3451 struct ext4_renament {
3452 struct inode *dir;
3453 struct dentry *dentry;
3454 struct inode *inode;
3455 bool is_dir;
3456 int dir_nlink_delta;
3457
3458
3459 struct buffer_head *bh;
3460 struct ext4_dir_entry_2 *de;
3461 int inlined;
3462
3463
3464 struct buffer_head *dir_bh;
3465 struct ext4_dir_entry_2 *parent_de;
3466 int dir_inlined;
3467 };
3468
3469 static int ext4_rename_dir_prepare(handle_t *handle, struct ext4_renament *ent)
3470 {
3471 int retval;
3472
3473 ent->dir_bh = ext4_get_first_dir_block(handle, ent->inode,
3474 &retval, &ent->parent_de,
3475 &ent->dir_inlined);
3476 if (!ent->dir_bh)
3477 return retval;
3478 if (le32_to_cpu(ent->parent_de->inode) != ent->dir->i_ino)
3479 return -EFSCORRUPTED;
3480 BUFFER_TRACE(ent->dir_bh, "get_write_access");
3481 return ext4_journal_get_write_access(handle, ent->dir_bh);
3482 }
3483
3484 static int ext4_rename_dir_finish(handle_t *handle, struct ext4_renament *ent,
3485 unsigned dir_ino)
3486 {
3487 int retval;
3488
3489 ent->parent_de->inode = cpu_to_le32(dir_ino);
3490 BUFFER_TRACE(ent->dir_bh, "call ext4_handle_dirty_metadata");
3491 if (!ent->dir_inlined) {
3492 if (is_dx(ent->inode)) {
3493 retval = ext4_handle_dirty_dx_node(handle,
3494 ent->inode,
3495 ent->dir_bh);
3496 } else {
3497 retval = ext4_handle_dirty_dirblock(handle, ent->inode,
3498 ent->dir_bh);
3499 }
3500 } else {
3501 retval = ext4_mark_inode_dirty(handle, ent->inode);
3502 }
3503 if (retval) {
3504 ext4_std_error(ent->dir->i_sb, retval);
3505 return retval;
3506 }
3507 return 0;
3508 }
3509
3510 static int ext4_setent(handle_t *handle, struct ext4_renament *ent,
3511 unsigned ino, unsigned file_type)
3512 {
3513 int retval;
3514
3515 BUFFER_TRACE(ent->bh, "get write access");
3516 retval = ext4_journal_get_write_access(handle, ent->bh);
3517 if (retval)
3518 return retval;
3519 ent->de->inode = cpu_to_le32(ino);
3520 if (ext4_has_feature_filetype(ent->dir->i_sb))
3521 ent->de->file_type = file_type;
3522 inode_inc_iversion(ent->dir);
3523 ent->dir->i_ctime = ent->dir->i_mtime =
3524 current_time(ent->dir);
3525 ext4_mark_inode_dirty(handle, ent->dir);
3526 BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata");
3527 if (!ent->inlined) {
3528 retval = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh);
3529 if (unlikely(retval)) {
3530 ext4_std_error(ent->dir->i_sb, retval);
3531 return retval;
3532 }
3533 }
3534 brelse(ent->bh);
3535 ent->bh = NULL;
3536
3537 return 0;
3538 }
3539
3540 static int ext4_find_delete_entry(handle_t *handle, struct inode *dir,
3541 const struct qstr *d_name)
3542 {
3543 int retval = -ENOENT;
3544 struct buffer_head *bh;
3545 struct ext4_dir_entry_2 *de;
3546
3547 bh = ext4_find_entry(dir, d_name, &de, NULL);
3548 if (IS_ERR(bh))
3549 return PTR_ERR(bh);
3550 if (bh) {
3551 retval = ext4_delete_entry(handle, dir, de, bh);
3552 brelse(bh);
3553 }
3554 return retval;
3555 }
3556
3557 static void ext4_rename_delete(handle_t *handle, struct ext4_renament *ent,
3558 int force_reread)
3559 {
3560 int retval;
3561
3562
3563
3564
3565
3566
3567 if (le32_to_cpu(ent->de->inode) != ent->inode->i_ino ||
3568 ent->de->name_len != ent->dentry->d_name.len ||
3569 strncmp(ent->de->name, ent->dentry->d_name.name,
3570 ent->de->name_len) ||
3571 force_reread) {
3572 retval = ext4_find_delete_entry(handle, ent->dir,
3573 &ent->dentry->d_name);
3574 } else {
3575 retval = ext4_delete_entry(handle, ent->dir, ent->de, ent->bh);
3576 if (retval == -ENOENT) {
3577 retval = ext4_find_delete_entry(handle, ent->dir,
3578 &ent->dentry->d_name);
3579 }
3580 }
3581
3582 if (retval) {
3583 ext4_warning_inode(ent->dir,
3584 "Deleting old file: nlink %d, error=%d",
3585 ent->dir->i_nlink, retval);
3586 }
3587 }
3588
3589 static void ext4_update_dir_count(handle_t *handle, struct ext4_renament *ent)
3590 {
3591 if (ent->dir_nlink_delta) {
3592 if (ent->dir_nlink_delta == -1)
3593 ext4_dec_count(handle, ent->dir);
3594 else
3595 ext4_inc_count(handle, ent->dir);
3596 ext4_mark_inode_dirty(handle, ent->dir);
3597 }
3598 }
3599
3600 static struct inode *ext4_whiteout_for_rename(struct ext4_renament *ent,
3601 int credits, handle_t **h)
3602 {
3603 struct inode *wh;
3604 handle_t *handle;
3605 int retries = 0;
3606
3607
3608
3609
3610
3611 credits += (EXT4_MAXQUOTAS_TRANS_BLOCKS(ent->dir->i_sb) +
3612 EXT4_XATTR_TRANS_BLOCKS + 4);
3613 retry:
3614 wh = ext4_new_inode_start_handle(ent->dir, S_IFCHR | WHITEOUT_MODE,
3615 &ent->dentry->d_name, 0, NULL,
3616 EXT4_HT_DIR, credits);
3617
3618 handle = ext4_journal_current_handle();
3619 if (IS_ERR(wh)) {
3620 if (handle)
3621 ext4_journal_stop(handle);
3622 if (PTR_ERR(wh) == -ENOSPC &&
3623 ext4_should_retry_alloc(ent->dir->i_sb, &retries))
3624 goto retry;
3625 } else {
3626 *h = handle;
3627 init_special_inode(wh, wh->i_mode, WHITEOUT_DEV);
3628 wh->i_op = &ext4_special_inode_operations;
3629 }
3630 return wh;
3631 }
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641 static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry,
3642 struct inode *new_dir, struct dentry *new_dentry,
3643 unsigned int flags)
3644 {
3645 handle_t *handle = NULL;
3646 struct ext4_renament old = {
3647 .dir = old_dir,
3648 .dentry = old_dentry,
3649 .inode = d_inode(old_dentry),
3650 };
3651 struct ext4_renament new = {
3652 .dir = new_dir,
3653 .dentry = new_dentry,
3654 .inode = d_inode(new_dentry),
3655 };
3656 int force_reread;
3657 int retval;
3658 struct inode *whiteout = NULL;
3659 int credits;
3660 u8 old_file_type;
3661
3662 if (new.inode && new.inode->i_nlink == 0) {
3663 EXT4_ERROR_INODE(new.inode,
3664 "target of rename is already freed");
3665 return -EFSCORRUPTED;
3666 }
3667
3668 if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT)) &&
3669 (!projid_eq(EXT4_I(new_dir)->i_projid,
3670 EXT4_I(old_dentry->d_inode)->i_projid)))
3671 return -EXDEV;
3672
3673 retval = dquot_initialize(old.dir);
3674 if (retval)
3675 return retval;
3676 retval = dquot_initialize(new.dir);
3677 if (retval)
3678 return retval;
3679
3680
3681
3682 if (new.inode) {
3683 retval = dquot_initialize(new.inode);
3684 if (retval)
3685 return retval;
3686 }
3687
3688 old.bh = ext4_find_entry(old.dir, &old.dentry->d_name, &old.de, NULL);
3689 if (IS_ERR(old.bh))
3690 return PTR_ERR(old.bh);
3691
3692
3693
3694
3695
3696
3697 retval = -ENOENT;
3698 if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)
3699 goto end_rename;
3700
3701 new.bh = ext4_find_entry(new.dir, &new.dentry->d_name,
3702 &new.de, &new.inlined);
3703 if (IS_ERR(new.bh)) {
3704 retval = PTR_ERR(new.bh);
3705 new.bh = NULL;
3706 goto end_rename;
3707 }
3708 if (new.bh) {
3709 if (!new.inode) {
3710 brelse(new.bh);
3711 new.bh = NULL;
3712 }
3713 }
3714 if (new.inode && !test_opt(new.dir->i_sb, NO_AUTO_DA_ALLOC))
3715 ext4_alloc_da_blocks(old.inode);
3716
3717 credits = (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) +
3718 EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2);
3719 if (!(flags & RENAME_WHITEOUT)) {
3720 handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits);
3721 if (IS_ERR(handle)) {
3722 retval = PTR_ERR(handle);
3723 handle = NULL;
3724 goto end_rename;
3725 }
3726 } else {
3727 whiteout = ext4_whiteout_for_rename(&old, credits, &handle);
3728 if (IS_ERR(whiteout)) {
3729 retval = PTR_ERR(whiteout);
3730 whiteout = NULL;
3731 goto end_rename;
3732 }
3733 }
3734
3735 if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir))
3736 ext4_handle_sync(handle);
3737
3738 if (S_ISDIR(old.inode->i_mode)) {
3739 if (new.inode) {
3740 retval = -ENOTEMPTY;
3741 if (!ext4_empty_dir(new.inode))
3742 goto end_rename;
3743 } else {
3744 retval = -EMLINK;
3745 if (new.dir != old.dir && EXT4_DIR_LINK_MAX(new.dir))
3746 goto end_rename;
3747 }
3748 retval = ext4_rename_dir_prepare(handle, &old);
3749 if (retval)
3750 goto end_rename;
3751 }
3752
3753
3754
3755
3756
3757
3758
3759 force_reread = (new.dir->i_ino == old.dir->i_ino &&
3760 ext4_test_inode_flag(new.dir, EXT4_INODE_INLINE_DATA));
3761
3762 old_file_type = old.de->file_type;
3763 if (whiteout) {
3764
3765
3766
3767
3768 retval = ext4_setent(handle, &old, whiteout->i_ino,
3769 EXT4_FT_CHRDEV);
3770 if (retval)
3771 goto end_rename;
3772 ext4_mark_inode_dirty(handle, whiteout);
3773 }
3774 if (!new.bh) {
3775 retval = ext4_add_entry(handle, new.dentry, old.inode);
3776 if (retval)
3777 goto end_rename;
3778 } else {
3779 retval = ext4_setent(handle, &new,
3780 old.inode->i_ino, old_file_type);
3781 if (retval)
3782 goto end_rename;
3783 }
3784 if (force_reread)
3785 force_reread = !ext4_test_inode_flag(new.dir,
3786 EXT4_INODE_INLINE_DATA);
3787
3788
3789
3790
3791
3792 old.inode->i_ctime = current_time(old.inode);
3793 ext4_mark_inode_dirty(handle, old.inode);
3794
3795 if (!whiteout) {
3796
3797
3798
3799 ext4_rename_delete(handle, &old, force_reread);
3800 }
3801
3802 if (new.inode) {
3803 ext4_dec_count(handle, new.inode);
3804 new.inode->i_ctime = current_time(new.inode);
3805 }
3806 old.dir->i_ctime = old.dir->i_mtime = current_time(old.dir);
3807 ext4_update_dx_flag(old.dir);
3808 if (old.dir_bh) {
3809 retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino);
3810 if (retval)
3811 goto end_rename;
3812
3813 ext4_dec_count(handle, old.dir);
3814 if (new.inode) {
3815
3816
3817
3818 clear_nlink(new.inode);
3819 } else {
3820 ext4_inc_count(handle, new.dir);
3821 ext4_update_dx_flag(new.dir);
3822 ext4_mark_inode_dirty(handle, new.dir);
3823 }
3824 }
3825 ext4_mark_inode_dirty(handle, old.dir);
3826 if (new.inode) {
3827 ext4_mark_inode_dirty(handle, new.inode);
3828 if (!new.inode->i_nlink)
3829 ext4_orphan_add(handle, new.inode);
3830 }
3831 retval = 0;
3832
3833 end_rename:
3834 brelse(old.dir_bh);
3835 brelse(old.bh);
3836 brelse(new.bh);
3837 if (whiteout) {
3838 if (retval)
3839 drop_nlink(whiteout);
3840 unlock_new_inode(whiteout);
3841 iput(whiteout);
3842 }
3843 if (handle)
3844 ext4_journal_stop(handle);
3845 return retval;
3846 }
3847
3848 static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
3849 struct inode *new_dir, struct dentry *new_dentry)
3850 {
3851 handle_t *handle = NULL;
3852 struct ext4_renament old = {
3853 .dir = old_dir,
3854 .dentry = old_dentry,
3855 .inode = d_inode(old_dentry),
3856 };
3857 struct ext4_renament new = {
3858 .dir = new_dir,
3859 .dentry = new_dentry,
3860 .inode = d_inode(new_dentry),
3861 };
3862 u8 new_file_type;
3863 int retval;
3864 struct timespec64 ctime;
3865
3866 if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) &&
3867 !projid_eq(EXT4_I(new_dir)->i_projid,
3868 EXT4_I(old_dentry->d_inode)->i_projid)) ||
3869 (ext4_test_inode_flag(old_dir, EXT4_INODE_PROJINHERIT) &&
3870 !projid_eq(EXT4_I(old_dir)->i_projid,
3871 EXT4_I(new_dentry->d_inode)->i_projid)))
3872 return -EXDEV;
3873
3874 retval = dquot_initialize(old.dir);
3875 if (retval)
3876 return retval;
3877 retval = dquot_initialize(new.dir);
3878 if (retval)
3879 return retval;
3880
3881 old.bh = ext4_find_entry(old.dir, &old.dentry->d_name,
3882 &old.de, &old.inlined);
3883 if (IS_ERR(old.bh))
3884 return PTR_ERR(old.bh);
3885
3886
3887
3888
3889
3890
3891 retval = -ENOENT;
3892 if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino)
3893 goto end_rename;
3894
3895 new.bh = ext4_find_entry(new.dir, &new.dentry->d_name,
3896 &new.de, &new.inlined);
3897 if (IS_ERR(new.bh)) {
3898 retval = PTR_ERR(new.bh);
3899 new.bh = NULL;
3900 goto end_rename;
3901 }
3902
3903
3904 if (!new.bh || le32_to_cpu(new.de->inode) != new.inode->i_ino)
3905 goto end_rename;
3906
3907 handle = ext4_journal_start(old.dir, EXT4_HT_DIR,
3908 (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) +
3909 2 * EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2));
3910 if (IS_ERR(handle)) {
3911 retval = PTR_ERR(handle);
3912 handle = NULL;
3913 goto end_rename;
3914 }
3915
3916 if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir))
3917 ext4_handle_sync(handle);
3918
3919 if (S_ISDIR(old.inode->i_mode)) {
3920 old.is_dir = true;
3921 retval = ext4_rename_dir_prepare(handle, &old);
3922 if (retval)
3923 goto end_rename;
3924 }
3925 if (S_ISDIR(new.inode->i_mode)) {
3926 new.is_dir = true;
3927 retval = ext4_rename_dir_prepare(handle, &new);
3928 if (retval)
3929 goto end_rename;
3930 }
3931
3932
3933
3934
3935
3936 if (old.dir != new.dir && old.is_dir != new.is_dir) {
3937 old.dir_nlink_delta = old.is_dir ? -1 : 1;
3938 new.dir_nlink_delta = -old.dir_nlink_delta;
3939 retval = -EMLINK;
3940 if ((old.dir_nlink_delta > 0 && EXT4_DIR_LINK_MAX(old.dir)) ||
3941 (new.dir_nlink_delta > 0 && EXT4_DIR_LINK_MAX(new.dir)))
3942 goto end_rename;
3943 }
3944
3945 new_file_type = new.de->file_type;
3946 retval = ext4_setent(handle, &new, old.inode->i_ino, old.de->file_type);
3947 if (retval)
3948 goto end_rename;
3949
3950 retval = ext4_setent(handle, &old, new.inode->i_ino, new_file_type);
3951 if (retval)
3952 goto end_rename;
3953
3954
3955
3956
3957
3958 ctime = current_time(old.inode);
3959 old.inode->i_ctime = ctime;
3960 new.inode->i_ctime = ctime;
3961 ext4_mark_inode_dirty(handle, old.inode);
3962 ext4_mark_inode_dirty(handle, new.inode);
3963
3964 if (old.dir_bh) {
3965 retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino);
3966 if (retval)
3967 goto end_rename;
3968 }
3969 if (new.dir_bh) {
3970 retval = ext4_rename_dir_finish(handle, &new, old.dir->i_ino);
3971 if (retval)
3972 goto end_rename;
3973 }
3974 ext4_update_dir_count(handle, &old);
3975 ext4_update_dir_count(handle, &new);
3976 retval = 0;
3977
3978 end_rename:
3979 brelse(old.dir_bh);
3980 brelse(new.dir_bh);
3981 brelse(old.bh);
3982 brelse(new.bh);
3983 if (handle)
3984 ext4_journal_stop(handle);
3985 return retval;
3986 }
3987
3988 static int ext4_rename2(struct inode *old_dir, struct dentry *old_dentry,
3989 struct inode *new_dir, struct dentry *new_dentry,
3990 unsigned int flags)
3991 {
3992 int err;
3993
3994 if (unlikely(ext4_forced_shutdown(EXT4_SB(old_dir->i_sb))))
3995 return -EIO;
3996
3997 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
3998 return -EINVAL;
3999
4000 err = fscrypt_prepare_rename(old_dir, old_dentry, new_dir, new_dentry,
4001 flags);
4002 if (err)
4003 return err;
4004
4005 if (flags & RENAME_EXCHANGE) {
4006 return ext4_cross_rename(old_dir, old_dentry,
4007 new_dir, new_dentry);
4008 }
4009
4010 return ext4_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
4011 }
4012
4013
4014
4015
4016 const struct inode_operations ext4_dir_inode_operations = {
4017 .create = ext4_create,
4018 .lookup = ext4_lookup,
4019 .link = ext4_link,
4020 .unlink = ext4_unlink,
4021 .symlink = ext4_symlink,
4022 .mkdir = ext4_mkdir,
4023 .rmdir = ext4_rmdir,
4024 .mknod = ext4_mknod,
4025 .tmpfile = ext4_tmpfile,
4026 .rename = ext4_rename2,
4027 .setattr = ext4_setattr,
4028 .getattr = ext4_getattr,
4029 .listxattr = ext4_listxattr,
4030 .get_acl = ext4_get_acl,
4031 .set_acl = ext4_set_acl,
4032 .fiemap = ext4_fiemap,
4033 };
4034
4035 const struct inode_operations ext4_special_inode_operations = {
4036 .setattr = ext4_setattr,
4037 .getattr = ext4_getattr,
4038 .listxattr = ext4_listxattr,
4039 .get_acl = ext4_get_acl,
4040 .set_acl = ext4_set_acl,
4041 };