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 = page->mapping; in ext2_commit_chunk()
87 struct inode *dir = mapping->host; in ext2_commit_chunk()
93 if (pos+len > dir->i_size) { in ext2_commit_chunk()
111 struct inode *dir = page->mapping->host; in ext2_check_page()
112 struct super_block *sb = dir->i_sb; in ext2_check_page()
114 u32 max_inumber = le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count); in ext2_check_page()
120 if ((dir->i_size >> PAGE_SHIFT) == page->index) { in ext2_check_page()
121 limit = dir->i_size & ~PAGE_MASK; in ext2_check_page()
122 if (limit & (chunk_size - 1)) in ext2_check_page()
127 for (offs = 0; offs <= limit - EXT2_DIR_REC_LEN(1); offs += rec_len) { in ext2_check_page()
129 rec_len = ext2_rec_len_from_disk(p->rec_len); in ext2_check_page()
135 if (unlikely(rec_len < EXT2_DIR_REC_LEN(p->name_len))) in ext2_check_page()
137 if (unlikely(((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))) in ext2_check_page()
139 if (unlikely(le32_to_cpu(p->inode) > max_inumber)) in ext2_check_page()
154 "of chunk size", dir->i_ino); in ext2_check_page()
172 ext2_error(sb, __func__, "bad entry in directory #%lu: : %s - " in ext2_check_page()
174 dir->i_ino, error, (page->index<<PAGE_SHIFT)+offs, in ext2_check_page()
175 (unsigned long) le32_to_cpu(p->inode), in ext2_check_page()
176 rec_len, p->name_len); in ext2_check_page()
184 dir->i_ino, (page->index<<PAGE_SHIFT)+offs, in ext2_check_page()
185 (unsigned long) le32_to_cpu(p->inode)); in ext2_check_page()
193 * Calls to ext2_get_page()/ext2_put_page() must be nested according to the
197 * and should be treated as a call to ext2_get_page() for nesting purposes.
202 struct address_space *mapping = dir->i_mapping; in ext2_get_page()
206 return &folio->page; in ext2_get_page()
207 *page_addr = kmap_local_folio(folio, n & (folio_nr_pages(folio) - 1)); in ext2_get_page()
209 if (!ext2_check_page(&folio->page, quiet, *page_addr)) in ext2_get_page()
212 return &folio->page; in ext2_get_page()
215 ext2_put_page(&folio->page, *page_addr); in ext2_get_page()
216 return ERR_PTR(-EIO); in ext2_get_page()
222 * len <= EXT2_NAME_LEN and de != NULL are guaranteed by caller.
225 struct ext2_dir_entry_2 * de) in ext2_match() argument
227 if (len != de->name_len) in ext2_match()
229 if (!de->inode) in ext2_match()
231 return !memcmp(name, de->name, len); in ext2_match()
240 ext2_rec_len_from_disk(p->rec_len)); in ext2_next_entry()
246 ext2_dirent *de = (ext2_dirent*)(base + offset); in ext2_validate_entry() local
248 while ((char*)p < (char*)de) { in ext2_validate_entry()
249 if (p->rec_len == 0) in ext2_validate_entry()
253 return (char *)p - base; in ext2_validate_entry()
256 static inline void ext2_set_de_type(ext2_dirent *de, struct inode *inode) in ext2_set_de_type() argument
258 if (EXT2_HAS_INCOMPAT_FEATURE(inode->i_sb, EXT2_FEATURE_INCOMPAT_FILETYPE)) in ext2_set_de_type()
259 de->file_type = fs_umode_to_ftype(inode->i_mode); in ext2_set_de_type()
261 de->file_type = 0; in ext2_set_de_type()
267 loff_t pos = ctx->pos; in ext2_readdir()
269 struct super_block *sb = inode->i_sb; in ext2_readdir()
273 unsigned chunk_mask = ~(ext2_chunk_size(inode)-1); in ext2_readdir()
274 bool need_revalidate = !inode_eq_iversion(inode, file->f_version); in ext2_readdir()
277 if (pos > inode->i_size - EXT2_DIR_REC_LEN(1)) in ext2_readdir()
285 ext2_dirent *de; in ext2_readdir() local
291 inode->i_ino); in ext2_readdir()
292 ctx->pos += PAGE_SIZE - offset; in ext2_readdir()
298 ctx->pos = (n<<PAGE_SHIFT) + offset; in ext2_readdir()
300 file->f_version = inode_query_iversion(inode); in ext2_readdir()
303 de = (ext2_dirent *)(kaddr+offset); in ext2_readdir()
304 limit = kaddr + ext2_last_byte(inode, n) - EXT2_DIR_REC_LEN(1); in ext2_readdir()
305 for ( ;(char*)de <= limit; de = ext2_next_entry(de)) { in ext2_readdir()
306 if (de->rec_len == 0) { in ext2_readdir()
308 "zero-length directory entry"); in ext2_readdir()
310 return -EIO; in ext2_readdir()
312 if (de->inode) { in ext2_readdir()
316 d_type = fs_ftype_to_dtype(de->file_type); in ext2_readdir()
318 if (!dir_emit(ctx, de->name, de->name_len, in ext2_readdir()
319 le32_to_cpu(de->inode), in ext2_readdir()
325 ctx->pos += ext2_rec_len_from_disk(de->rec_len); in ext2_readdir()
336 * returns the page in which the entry was found (as a parameter - res_page),
338 * Entry is guaranteed to be valid.
340 * On Success ext2_put_page() should be called on *res_page.
342 * NOTE: Calls to ext2_get_page()/ext2_put_page() must be nested according to
346 * should be treated as a call to ext2_get_page() for nesting purposes.
352 const char *name = child->name; in ext2_find_entry()
353 int namelen = child->len; in ext2_find_entry()
359 ext2_dirent * de; in ext2_find_entry() local
369 start = ei->i_dir_start_lookup; in ext2_find_entry()
380 de = (ext2_dirent *) kaddr; in ext2_find_entry()
381 kaddr += ext2_last_byte(dir, n) - reclen; in ext2_find_entry()
382 while ((char *) de <= kaddr) { in ext2_find_entry()
383 if (de->rec_len == 0) { in ext2_find_entry()
384 ext2_error(dir->i_sb, __func__, in ext2_find_entry()
385 "zero-length directory entry"); in ext2_find_entry()
389 if (ext2_match(namelen, name, de)) in ext2_find_entry()
391 de = ext2_next_entry(de); in ext2_find_entry()
398 if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) { in ext2_find_entry()
399 ext2_error(dir->i_sb, __func__, in ext2_find_entry()
401 dir->i_ino, dir->i_size, in ext2_find_entry()
402 (unsigned long long)dir->i_blocks); in ext2_find_entry()
407 return ERR_PTR(-ENOENT); in ext2_find_entry()
412 ei->i_dir_start_lookup = n; in ext2_find_entry()
413 return de; in ext2_find_entry()
418 * (as a parameter - p).
420 * On Success ext2_put_page() should be called on *p.
422 * NOTE: Calls to ext2_get_page()/ext2_put_page() must be nested according to
426 * should be treated as a call to ext2_get_page() for nesting purposes.
433 ext2_dirent *de = NULL; in ext2_dotdot() local
436 de = ext2_next_entry((ext2_dirent *) page_addr); in ext2_dotdot()
440 return de; in ext2_dotdot()
445 struct ext2_dir_entry_2 *de; in ext2_inode_by_name() local
449 de = ext2_find_entry(dir, child, &page, &page_addr); in ext2_inode_by_name()
450 if (IS_ERR(de)) in ext2_inode_by_name()
451 return PTR_ERR(de); in ext2_inode_by_name()
453 *ino = le32_to_cpu(de->inode); in ext2_inode_by_name()
463 void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, in ext2_set_link() argument
468 (char *) de - (char *) page_addr; in ext2_set_link()
469 unsigned len = ext2_rec_len_from_disk(de->rec_len); in ext2_set_link()
475 de->inode = cpu_to_le32(inode->i_ino); in ext2_set_link()
476 ext2_set_de_type(de, inode); in ext2_set_link()
479 dir->i_mtime = dir->i_ctime = current_time(dir); in ext2_set_link()
480 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; in ext2_set_link()
489 struct inode *dir = d_inode(dentry->d_parent); in ext2_add_link()
490 const char *name = dentry->d_name.name; in ext2_add_link()
491 int namelen = dentry->d_name.len; in ext2_add_link()
497 ext2_dirent * de; in ext2_add_link() local
519 de = (ext2_dirent *)kaddr; in ext2_add_link()
520 kaddr += PAGE_SIZE - reclen; in ext2_add_link()
521 while ((char *)de <= kaddr) { in ext2_add_link()
522 if ((char *)de == dir_end) { in ext2_add_link()
526 de->rec_len = ext2_rec_len_to_disk(chunk_size); in ext2_add_link()
527 de->inode = 0; in ext2_add_link()
530 if (de->rec_len == 0) { in ext2_add_link()
531 ext2_error(dir->i_sb, __func__, in ext2_add_link()
532 "zero-length directory entry"); in ext2_add_link()
533 err = -EIO; in ext2_add_link()
536 err = -EEXIST; in ext2_add_link()
537 if (ext2_match (namelen, name, de)) in ext2_add_link()
539 name_len = EXT2_DIR_REC_LEN(de->name_len); in ext2_add_link()
540 rec_len = ext2_rec_len_from_disk(de->rec_len); in ext2_add_link()
541 if (!de->inode && rec_len >= reclen) in ext2_add_link()
545 de = (ext2_dirent *) ((char *) de + rec_len); in ext2_add_link()
551 return -EINVAL; in ext2_add_link()
555 (char *)de - (char *)page_addr; in ext2_add_link()
559 if (de->inode) { in ext2_add_link()
560 ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len); in ext2_add_link()
561 de1->rec_len = ext2_rec_len_to_disk(rec_len - name_len); in ext2_add_link()
562 de->rec_len = ext2_rec_len_to_disk(name_len); in ext2_add_link()
563 de = de1; in ext2_add_link()
565 de->name_len = namelen; in ext2_add_link()
566 memcpy(de->name, name, namelen); in ext2_add_link()
567 de->inode = cpu_to_le32(inode->i_ino); in ext2_add_link()
568 ext2_set_de_type (de, inode); in ext2_add_link()
570 dir->i_mtime = dir->i_ctime = current_time(dir); in ext2_add_link()
571 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; in ext2_add_link()
585 * previous entry. Page is up-to-date.
590 struct inode *inode = page->mapping->host; in ext2_delete_entry()
591 unsigned from = ((char*)dir - kaddr) & ~(ext2_chunk_size(inode)-1); in ext2_delete_entry()
592 unsigned to = ((char *)dir - kaddr) + in ext2_delete_entry()
593 ext2_rec_len_from_disk(dir->rec_len); in ext2_delete_entry()
596 ext2_dirent * de = (ext2_dirent *) (kaddr + from); in ext2_delete_entry() local
599 while ((char*)de < (char*)dir) { in ext2_delete_entry()
600 if (de->rec_len == 0) { in ext2_delete_entry()
601 ext2_error(inode->i_sb, __func__, in ext2_delete_entry()
602 "zero-length directory entry"); in ext2_delete_entry()
603 err = -EIO; in ext2_delete_entry()
606 pde = de; in ext2_delete_entry()
607 de = ext2_next_entry(de); in ext2_delete_entry()
610 from = (char *)pde - kaddr; in ext2_delete_entry()
613 err = ext2_prepare_chunk(page, pos, to - from); in ext2_delete_entry()
616 pde->rec_len = ext2_rec_len_to_disk(to - from); in ext2_delete_entry()
617 dir->inode = 0; in ext2_delete_entry()
618 err = ext2_commit_chunk(page, pos, to - from); in ext2_delete_entry()
619 inode->i_ctime = inode->i_mtime = current_time(inode); in ext2_delete_entry()
620 EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL; in ext2_delete_entry()
631 struct page *page = grab_cache_page(inode->i_mapping, 0); in ext2_make_empty()
633 struct ext2_dir_entry_2 * de; in ext2_make_empty() local
638 return -ENOMEM; in ext2_make_empty()
647 de = (struct ext2_dir_entry_2 *)kaddr; in ext2_make_empty()
648 de->name_len = 1; in ext2_make_empty()
649 de->rec_len = ext2_rec_len_to_disk(EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
650 memcpy (de->name, ".\0\0", 4); in ext2_make_empty()
651 de->inode = cpu_to_le32(inode->i_ino); in ext2_make_empty()
652 ext2_set_de_type (de, inode); in ext2_make_empty()
654 de = (struct ext2_dir_entry_2 *)(kaddr + EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
655 de->name_len = 2; in ext2_make_empty()
656 de->rec_len = ext2_rec_len_to_disk(chunk_size - EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
657 de->inode = cpu_to_le32(parent->i_ino); in ext2_make_empty()
658 memcpy (de->name, "..\0", 4); in ext2_make_empty()
659 ext2_set_de_type (de, inode); in ext2_make_empty()
678 ext2_dirent * de; in ext2_empty_dir() local
685 de = (ext2_dirent *)kaddr; in ext2_empty_dir()
686 kaddr += ext2_last_byte(inode, i) - EXT2_DIR_REC_LEN(1); in ext2_empty_dir()
688 while ((char *)de <= kaddr) { in ext2_empty_dir()
689 if (de->rec_len == 0) { in ext2_empty_dir()
690 ext2_error(inode->i_sb, __func__, in ext2_empty_dir()
691 "zero-length directory entry"); in ext2_empty_dir()
692 printk("kaddr=%p, de=%p\n", kaddr, de); in ext2_empty_dir()
695 if (de->inode != 0) { in ext2_empty_dir()
697 if (de->name[0] != '.') in ext2_empty_dir()
699 if (de->name_len > 2) in ext2_empty_dir()
701 if (de->name_len < 2) { in ext2_empty_dir()
702 if (de->inode != in ext2_empty_dir()
703 cpu_to_le32(inode->i_ino)) in ext2_empty_dir()
705 } else if (de->name[1] != '.') in ext2_empty_dir()
708 de = ext2_next_entry(de); in ext2_empty_dir()