Lines Matching +full:de +full:- +full:be

1 // SPDX-License-Identifier: GPL-2.0
7 * Laboratoire MASI - Institut Blaise Pascal
18 * Big-endian to little-endian byte-swapping/bitmaps by
61 * ext2 uses block-sized chunks. Arguably, sector-sized ones would be
66 return inode->i_sb->s_blocksize; in ext2_chunk_size()
76 unsigned last_byte = inode->i_size; in ext2_last_byte()
78 last_byte -= page_nr << PAGE_SHIFT; in ext2_last_byte()
86 struct address_space *mapping = folio->mapping; in ext2_commit_chunk()
87 struct inode *dir = mapping->host; in ext2_commit_chunk()
92 if (pos+len > dir->i_size) { in ext2_commit_chunk()
101 struct inode *dir = folio->mapping->host; in ext2_check_folio()
102 struct super_block *sb = dir->i_sb; in ext2_check_folio()
104 u32 max_inumber = le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count); in ext2_check_folio()
110 if (dir->i_size < folio_pos(folio) + limit) { in ext2_check_folio()
111 limit = offset_in_folio(folio, dir->i_size); in ext2_check_folio()
112 if (limit & (chunk_size - 1)) in ext2_check_folio()
117 for (offs = 0; offs <= limit - EXT2_DIR_REC_LEN(1); offs += rec_len) { in ext2_check_folio()
119 rec_len = ext2_rec_len_from_disk(p->rec_len); in ext2_check_folio()
125 if (unlikely(rec_len < EXT2_DIR_REC_LEN(p->name_len))) in ext2_check_folio()
127 if (unlikely(((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))) in ext2_check_folio()
129 if (unlikely(le32_to_cpu(p->inode) > max_inumber)) in ext2_check_folio()
144 "of chunk size", dir->i_ino); in ext2_check_folio()
162 ext2_error(sb, __func__, "bad entry in directory #%lu: : %s - " in ext2_check_folio()
164 dir->i_ino, error, folio_pos(folio) + offs, in ext2_check_folio()
165 (unsigned long) le32_to_cpu(p->inode), in ext2_check_folio()
166 rec_len, p->name_len); in ext2_check_folio()
174 dir->i_ino, folio_pos(folio) + offs, in ext2_check_folio()
175 (unsigned long) le32_to_cpu(p->inode)); in ext2_check_folio()
182 * Calls to ext2_get_folio()/folio_release_kmap() must be nested according
186 * to folio_release_kmap() and should be treated as a call to
192 struct address_space *mapping = dir->i_mapping; in ext2_get_folio()
208 return ERR_PTR(-EIO); in ext2_get_folio()
214 * len <= EXT2_NAME_LEN and de != NULL are guaranteed by caller.
217 struct ext2_dir_entry_2 * de) in ext2_match() argument
219 if (len != de->name_len) in ext2_match()
221 if (!de->inode) in ext2_match()
223 return !memcmp(name, de->name, len); in ext2_match()
232 ext2_rec_len_from_disk(p->rec_len)); in ext2_next_entry()
238 ext2_dirent *de = (ext2_dirent*)(base + offset); in ext2_validate_entry() local
240 while ((char*)p < (char*)de) { in ext2_validate_entry()
241 if (p->rec_len == 0) in ext2_validate_entry()
248 static inline void ext2_set_de_type(ext2_dirent *de, struct inode *inode) in ext2_set_de_type() argument
250 if (EXT2_HAS_INCOMPAT_FEATURE(inode->i_sb, EXT2_FEATURE_INCOMPAT_FILETYPE)) in ext2_set_de_type()
251 de->file_type = fs_umode_to_ftype(inode->i_mode); in ext2_set_de_type()
253 de->file_type = 0; in ext2_set_de_type()
259 loff_t pos = ctx->pos; in ext2_readdir()
261 struct super_block *sb = inode->i_sb; in ext2_readdir()
265 unsigned chunk_mask = ~(ext2_chunk_size(inode)-1); in ext2_readdir()
266 bool need_revalidate = !inode_eq_iversion(inode, *(u64 *)file->private_data); in ext2_readdir()
269 if (pos > inode->i_size - EXT2_DIR_REC_LEN(1)) in ext2_readdir()
276 ext2_dirent *de; in ext2_readdir() local
284 inode->i_ino); in ext2_readdir()
285 ctx->pos += PAGE_SIZE - offset; in ext2_readdir()
291 ctx->pos = (n<<PAGE_SHIFT) + offset; in ext2_readdir()
293 *(u64 *)file->private_data = inode_query_iversion(inode); in ext2_readdir()
296 de = (ext2_dirent *)(kaddr+offset); in ext2_readdir()
297 limit = kaddr + ext2_last_byte(inode, n) - EXT2_DIR_REC_LEN(1); in ext2_readdir()
298 for ( ;(char*)de <= limit; de = ext2_next_entry(de)) { in ext2_readdir()
299 if (de->rec_len == 0) { in ext2_readdir()
301 "zero-length directory entry"); in ext2_readdir()
302 folio_release_kmap(folio, de); in ext2_readdir()
303 return -EIO; in ext2_readdir()
305 if (de->inode) { in ext2_readdir()
309 d_type = fs_ftype_to_dtype(de->file_type); in ext2_readdir()
311 if (!dir_emit(ctx, de->name, de->name_len, in ext2_readdir()
312 le32_to_cpu(de->inode), in ext2_readdir()
314 folio_release_kmap(folio, de); in ext2_readdir()
318 ctx->pos += ext2_rec_len_from_disk(de->rec_len); in ext2_readdir()
329 * returns the page in which the entry was found (as a parameter - res_page),
331 * Entry is guaranteed to be valid.
333 * On Success folio_release_kmap() should be called on *foliop.
335 * NOTE: Calls to ext2_get_folio()/folio_release_kmap() must be nested
339 * and should be treated as a call to ext2_get_folio() for nesting
345 const char *name = child->name; in ext2_find_entry()
346 int namelen = child->len; in ext2_find_entry()
351 ext2_dirent * de; in ext2_find_entry() local
356 start = ei->i_dir_start_lookup; in ext2_find_entry()
365 de = (ext2_dirent *) kaddr; in ext2_find_entry()
366 kaddr += ext2_last_byte(dir, n) - reclen; in ext2_find_entry()
367 while ((char *) de <= kaddr) { in ext2_find_entry()
368 if (de->rec_len == 0) { in ext2_find_entry()
369 ext2_error(dir->i_sb, __func__, in ext2_find_entry()
370 "zero-length directory entry"); in ext2_find_entry()
371 folio_release_kmap(*foliop, de); in ext2_find_entry()
374 if (ext2_match(namelen, name, de)) in ext2_find_entry()
376 de = ext2_next_entry(de); in ext2_find_entry()
383 if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) { in ext2_find_entry()
384 ext2_error(dir->i_sb, __func__, in ext2_find_entry()
386 dir->i_ino, dir->i_size, in ext2_find_entry()
387 (unsigned long long)dir->i_blocks); in ext2_find_entry()
392 return ERR_PTR(-ENOENT); in ext2_find_entry()
395 ei->i_dir_start_lookup = n; in ext2_find_entry()
396 return de; in ext2_find_entry()
401 * (as a parameter - p).
403 * On Success folio_release_kmap() should be called on *foliop.
405 * NOTE: Calls to ext2_get_folio()/folio_release_kmap() must be nested
409 * and should be treated as a call to ext2_get_folio() for nesting
414 ext2_dirent *de = ext2_get_folio(dir, 0, 0, foliop); in ext2_dotdot() local
416 if (!IS_ERR(de)) in ext2_dotdot()
417 return ext2_next_entry(de); in ext2_dotdot()
423 struct ext2_dir_entry_2 *de; in ext2_inode_by_name() local
426 de = ext2_find_entry(dir, child, &folio); in ext2_inode_by_name()
427 if (IS_ERR(de)) in ext2_inode_by_name()
428 return PTR_ERR(de); in ext2_inode_by_name()
430 *ino = le32_to_cpu(de->inode); in ext2_inode_by_name()
431 folio_release_kmap(folio, de); in ext2_inode_by_name()
444 err = filemap_write_and_wait(dir->i_mapping); in ext2_handle_dirsync()
450 int ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, in ext2_set_link() argument
453 loff_t pos = folio_pos(folio) + offset_in_folio(folio, de); in ext2_set_link()
454 unsigned len = ext2_rec_len_from_disk(de->rec_len); in ext2_set_link()
463 de->inode = cpu_to_le32(inode->i_ino); in ext2_set_link()
464 ext2_set_de_type(de, inode); in ext2_set_link()
468 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; in ext2_set_link()
478 struct inode *dir = d_inode(dentry->d_parent); in ext2_add_link()
479 const char *name = dentry->d_name.name; in ext2_add_link()
480 int namelen = dentry->d_name.len; in ext2_add_link()
485 ext2_dirent * de; in ext2_add_link() local
504 de = (ext2_dirent *)kaddr; in ext2_add_link()
505 kaddr += folio_size(folio) - reclen; in ext2_add_link()
506 while ((char *)de <= kaddr) { in ext2_add_link()
507 if ((char *)de == dir_end) { in ext2_add_link()
511 de->rec_len = ext2_rec_len_to_disk(chunk_size); in ext2_add_link()
512 de->inode = 0; in ext2_add_link()
515 if (de->rec_len == 0) { in ext2_add_link()
516 ext2_error(dir->i_sb, __func__, in ext2_add_link()
517 "zero-length directory entry"); in ext2_add_link()
518 err = -EIO; in ext2_add_link()
521 err = -EEXIST; in ext2_add_link()
522 if (ext2_match (namelen, name, de)) in ext2_add_link()
524 name_len = EXT2_DIR_REC_LEN(de->name_len); in ext2_add_link()
525 rec_len = ext2_rec_len_from_disk(de->rec_len); in ext2_add_link()
526 if (!de->inode && rec_len >= reclen) in ext2_add_link()
530 de = (ext2_dirent *) ((char *) de + rec_len); in ext2_add_link()
536 return -EINVAL; in ext2_add_link()
539 pos = folio_pos(folio) + offset_in_folio(folio, de); in ext2_add_link()
543 if (de->inode) { in ext2_add_link()
544 ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len); in ext2_add_link()
545 de1->rec_len = ext2_rec_len_to_disk(rec_len - name_len); in ext2_add_link()
546 de->rec_len = ext2_rec_len_to_disk(name_len); in ext2_add_link()
547 de = de1; in ext2_add_link()
549 de->name_len = namelen; in ext2_add_link()
550 memcpy(de->name, name, namelen); in ext2_add_link()
551 de->inode = cpu_to_le32(inode->i_ino); in ext2_add_link()
552 ext2_set_de_type (de, inode); in ext2_add_link()
555 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; in ext2_add_link()
560 folio_release_kmap(folio, de); in ext2_add_link()
569 * previous entry. Page is up-to-date.
573 struct inode *inode = folio->mapping->host; in ext2_delete_entry()
577 ext2_dirent *de, *pde = NULL; in ext2_delete_entry() local
581 to = from + ext2_rec_len_from_disk(dir->rec_len); in ext2_delete_entry()
582 kaddr = (char *)dir - from; in ext2_delete_entry()
583 from &= ~(ext2_chunk_size(inode)-1); in ext2_delete_entry()
584 de = (ext2_dirent *)(kaddr + from); in ext2_delete_entry()
586 while ((char*)de < (char*)dir) { in ext2_delete_entry()
587 if (de->rec_len == 0) { in ext2_delete_entry()
588 ext2_error(inode->i_sb, __func__, in ext2_delete_entry()
589 "zero-length directory entry"); in ext2_delete_entry()
590 return -EIO; in ext2_delete_entry()
592 pde = de; in ext2_delete_entry()
593 de = ext2_next_entry(de); in ext2_delete_entry()
599 err = ext2_prepare_chunk(folio, pos, to - from); in ext2_delete_entry()
605 pde->rec_len = ext2_rec_len_to_disk(to - from); in ext2_delete_entry()
606 dir->inode = 0; in ext2_delete_entry()
607 ext2_commit_chunk(folio, pos, to - from); in ext2_delete_entry()
609 EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL; in ext2_delete_entry()
619 struct folio *folio = filemap_grab_folio(inode->i_mapping, 0); in ext2_make_empty()
621 struct ext2_dir_entry_2 * de; in ext2_make_empty() local
635 de = (struct ext2_dir_entry_2 *)kaddr; in ext2_make_empty()
636 de->name_len = 1; in ext2_make_empty()
637 de->rec_len = ext2_rec_len_to_disk(EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
638 memcpy (de->name, ".\0\0", 4); in ext2_make_empty()
639 de->inode = cpu_to_le32(inode->i_ino); in ext2_make_empty()
640 ext2_set_de_type (de, inode); in ext2_make_empty()
642 de = (struct ext2_dir_entry_2 *)(kaddr + EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
643 de->name_len = 2; in ext2_make_empty()
644 de->rec_len = ext2_rec_len_to_disk(chunk_size - EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
645 de->inode = cpu_to_le32(parent->i_ino); in ext2_make_empty()
646 memcpy (de->name, "..\0", 4); in ext2_make_empty()
647 ext2_set_de_type (de, inode); in ext2_make_empty()
666 ext2_dirent *de; in ext2_empty_dir() local
672 de = (ext2_dirent *)kaddr; in ext2_empty_dir()
673 kaddr += ext2_last_byte(inode, i) - EXT2_DIR_REC_LEN(1); in ext2_empty_dir()
675 while ((char *)de <= kaddr) { in ext2_empty_dir()
676 if (de->rec_len == 0) { in ext2_empty_dir()
677 ext2_error(inode->i_sb, __func__, in ext2_empty_dir()
678 "zero-length directory entry"); in ext2_empty_dir()
679 printk("kaddr=%p, de=%p\n", kaddr, de); in ext2_empty_dir()
682 if (de->inode != 0) { in ext2_empty_dir()
684 if (de->name[0] != '.') in ext2_empty_dir()
686 if (de->name_len > 2) in ext2_empty_dir()
688 if (de->name_len < 2) { in ext2_empty_dir()
689 if (de->inode != in ext2_empty_dir()
690 cpu_to_le32(inode->i_ino)) in ext2_empty_dir()
692 } else if (de->name[1] != '.') in ext2_empty_dir()
695 de = ext2_next_entry(de); in ext2_empty_dir()
708 file->private_data = kzalloc(sizeof(u64), GFP_KERNEL); in ext2_dir_open()
709 if (!file->private_data) in ext2_dir_open()
710 return -ENOMEM; in ext2_dir_open()
716 kfree(file->private_data); in ext2_dir_release()
723 (u64 *)file->private_data); in ext2_dir_llseek()