• Home
  • Raw
  • Download

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()
92 if (pos+len > dir->i_size) { in ext2_commit_chunk()
101 struct inode *dir = page->mapping->host; in ext2_check_page()
102 struct super_block *sb = dir->i_sb; in ext2_check_page()
104 u32 max_inumber = le32_to_cpu(EXT2_SB(sb)->s_es->s_inodes_count); in ext2_check_page()
110 if ((dir->i_size >> PAGE_SHIFT) == page->index) { in ext2_check_page()
111 limit = dir->i_size & ~PAGE_MASK; in ext2_check_page()
112 if (limit & (chunk_size - 1)) in ext2_check_page()
117 for (offs = 0; offs <= limit - EXT2_DIR_REC_LEN(1); offs += rec_len) { in ext2_check_page()
119 rec_len = ext2_rec_len_from_disk(p->rec_len); in ext2_check_page()
125 if (unlikely(rec_len < EXT2_DIR_REC_LEN(p->name_len))) in ext2_check_page()
127 if (unlikely(((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))) in ext2_check_page()
129 if (unlikely(le32_to_cpu(p->inode) > max_inumber)) in ext2_check_page()
144 "of chunk size", dir->i_ino); in ext2_check_page()
162 ext2_error(sb, __func__, "bad entry in directory #%lu: : %s - " in ext2_check_page()
164 dir->i_ino, error, (page->index<<PAGE_SHIFT)+offs, in ext2_check_page()
165 (unsigned long) le32_to_cpu(p->inode), in ext2_check_page()
166 rec_len, p->name_len); in ext2_check_page()
174 dir->i_ino, (page->index<<PAGE_SHIFT)+offs, in ext2_check_page()
175 (unsigned long) le32_to_cpu(p->inode)); in ext2_check_page()
183 * Calls to ext2_get_page()/ext2_put_page() must be nested according to the
187 * and should be treated as a call to ext2_get_page() for nesting purposes.
192 struct address_space *mapping = dir->i_mapping; in ext2_get_page()
198 page_addr = kmap_local_folio(folio, n & (folio_nr_pages(folio) - 1)); in ext2_get_page()
200 if (!ext2_check_page(&folio->page, quiet, page_addr)) in ext2_get_page()
203 *page = &folio->page; in ext2_get_page()
207 ext2_put_page(&folio->page, page_addr); in ext2_get_page()
208 return ERR_PTR(-EIO); in ext2_get_page()
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, file->f_version); 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 file->f_version = 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 ext2_put_page(page, 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 ext2_put_page(page, 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 ext2_put_page() should be called on *res_page.
335 * NOTE: Calls to ext2_get_page()/ext2_put_page() must be nested according to
339 * should be treated as a call to ext2_get_page() for nesting purposes.
344 const char *name = child->name; in ext2_find_entry()
345 int namelen = child->len; in ext2_find_entry()
351 ext2_dirent * de; in ext2_find_entry() local
359 start = ei->i_dir_start_lookup; in ext2_find_entry()
368 de = (ext2_dirent *) kaddr; in ext2_find_entry()
369 kaddr += ext2_last_byte(dir, n) - reclen; in ext2_find_entry()
370 while ((char *) de <= kaddr) { in ext2_find_entry()
371 if (de->rec_len == 0) { in ext2_find_entry()
372 ext2_error(dir->i_sb, __func__, in ext2_find_entry()
373 "zero-length directory entry"); in ext2_find_entry()
374 ext2_put_page(page, de); in ext2_find_entry()
377 if (ext2_match(namelen, name, de)) in ext2_find_entry()
379 de = ext2_next_entry(de); in ext2_find_entry()
386 if (unlikely(n > (dir->i_blocks >> (PAGE_SHIFT - 9)))) { in ext2_find_entry()
387 ext2_error(dir->i_sb, __func__, in ext2_find_entry()
389 dir->i_ino, dir->i_size, in ext2_find_entry()
390 (unsigned long long)dir->i_blocks); in ext2_find_entry()
395 return ERR_PTR(-ENOENT); in ext2_find_entry()
399 ei->i_dir_start_lookup = n; in ext2_find_entry()
400 return de; in ext2_find_entry()
405 * (as a parameter - p).
407 * On Success ext2_put_page() should be called on *p.
409 * NOTE: Calls to ext2_get_page()/ext2_put_page() must be nested according to
413 * should be treated as a call to ext2_get_page() for nesting purposes.
417 ext2_dirent *de = ext2_get_page(dir, 0, 0, p); in ext2_dotdot() local
419 if (!IS_ERR(de)) in ext2_dotdot()
420 return ext2_next_entry(de); in ext2_dotdot()
426 struct ext2_dir_entry_2 *de; in ext2_inode_by_name() local
429 de = ext2_find_entry(dir, child, &page); in ext2_inode_by_name()
430 if (IS_ERR(de)) in ext2_inode_by_name()
431 return PTR_ERR(de); in ext2_inode_by_name()
433 *ino = le32_to_cpu(de->inode); in ext2_inode_by_name()
434 ext2_put_page(page, de); in ext2_inode_by_name()
448 err = filemap_write_and_wait(dir->i_mapping); in ext2_handle_dirsync()
454 int ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, in ext2_set_link() argument
457 loff_t pos = page_offset(page) + offset_in_page(de); in ext2_set_link()
458 unsigned len = ext2_rec_len_from_disk(de->rec_len); in ext2_set_link()
467 de->inode = cpu_to_le32(inode->i_ino); in ext2_set_link()
468 ext2_set_de_type(de, inode); in ext2_set_link()
471 dir->i_mtime = inode_set_ctime_current(dir); in ext2_set_link()
472 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; in ext2_set_link()
482 struct inode *dir = d_inode(dentry->d_parent); in ext2_add_link()
483 const char *name = dentry->d_name.name; in ext2_add_link()
484 int namelen = dentry->d_name.len; in ext2_add_link()
489 ext2_dirent * de; in ext2_add_link() local
508 de = (ext2_dirent *)kaddr; in ext2_add_link()
509 kaddr += PAGE_SIZE - reclen; in ext2_add_link()
510 while ((char *)de <= kaddr) { in ext2_add_link()
511 if ((char *)de == dir_end) { in ext2_add_link()
515 de->rec_len = ext2_rec_len_to_disk(chunk_size); in ext2_add_link()
516 de->inode = 0; in ext2_add_link()
519 if (de->rec_len == 0) { in ext2_add_link()
520 ext2_error(dir->i_sb, __func__, in ext2_add_link()
521 "zero-length directory entry"); in ext2_add_link()
522 err = -EIO; in ext2_add_link()
525 err = -EEXIST; in ext2_add_link()
526 if (ext2_match (namelen, name, de)) in ext2_add_link()
528 name_len = EXT2_DIR_REC_LEN(de->name_len); in ext2_add_link()
529 rec_len = ext2_rec_len_from_disk(de->rec_len); in ext2_add_link()
530 if (!de->inode && rec_len >= reclen) in ext2_add_link()
534 de = (ext2_dirent *) ((char *) de + rec_len); in ext2_add_link()
540 return -EINVAL; in ext2_add_link()
543 pos = page_offset(page) + offset_in_page(de); in ext2_add_link()
547 if (de->inode) { in ext2_add_link()
548 ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len); in ext2_add_link()
549 de1->rec_len = ext2_rec_len_to_disk(rec_len - name_len); in ext2_add_link()
550 de->rec_len = ext2_rec_len_to_disk(name_len); in ext2_add_link()
551 de = de1; in ext2_add_link()
553 de->name_len = namelen; in ext2_add_link()
554 memcpy(de->name, name, namelen); in ext2_add_link()
555 de->inode = cpu_to_le32(inode->i_ino); in ext2_add_link()
556 ext2_set_de_type (de, inode); in ext2_add_link()
558 dir->i_mtime = inode_set_ctime_current(dir); in ext2_add_link()
559 EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL; in ext2_add_link()
564 ext2_put_page(page, de); in ext2_add_link()
573 * previous entry. Page is up-to-date.
577 struct inode *inode = page->mapping->host; in ext2_delete_entry()
579 unsigned from = offset_in_page(dir) & ~(ext2_chunk_size(inode)-1); in ext2_delete_entry()
581 ext2_rec_len_from_disk(dir->rec_len); in ext2_delete_entry()
584 ext2_dirent *de = (ext2_dirent *)(kaddr + from); in ext2_delete_entry() local
587 while ((char*)de < (char*)dir) { in ext2_delete_entry()
588 if (de->rec_len == 0) { in ext2_delete_entry()
589 ext2_error(inode->i_sb, __func__, in ext2_delete_entry()
590 "zero-length directory entry"); in ext2_delete_entry()
591 return -EIO; in ext2_delete_entry()
593 pde = de; in ext2_delete_entry()
594 de = ext2_next_entry(de); in ext2_delete_entry()
600 err = ext2_prepare_chunk(page, pos, to - from); in ext2_delete_entry()
606 pde->rec_len = ext2_rec_len_to_disk(to - from); in ext2_delete_entry()
607 dir->inode = 0; in ext2_delete_entry()
608 ext2_commit_chunk(page, pos, to - from); in ext2_delete_entry()
609 inode->i_mtime = inode_set_ctime_current(inode); in ext2_delete_entry()
610 EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL; in ext2_delete_entry()
620 struct page *page = grab_cache_page(inode->i_mapping, 0); in ext2_make_empty()
622 struct ext2_dir_entry_2 * de; in ext2_make_empty() local
627 return -ENOMEM; in ext2_make_empty()
636 de = (struct ext2_dir_entry_2 *)kaddr; in ext2_make_empty()
637 de->name_len = 1; in ext2_make_empty()
638 de->rec_len = ext2_rec_len_to_disk(EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
639 memcpy (de->name, ".\0\0", 4); in ext2_make_empty()
640 de->inode = cpu_to_le32(inode->i_ino); in ext2_make_empty()
641 ext2_set_de_type (de, inode); in ext2_make_empty()
643 de = (struct ext2_dir_entry_2 *)(kaddr + EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
644 de->name_len = 2; in ext2_make_empty()
645 de->rec_len = ext2_rec_len_to_disk(chunk_size - EXT2_DIR_REC_LEN(1)); in ext2_make_empty()
646 de->inode = cpu_to_le32(parent->i_ino); in ext2_make_empty()
647 memcpy (de->name, "..\0", 4); in ext2_make_empty()
648 ext2_set_de_type (de, inode); in ext2_make_empty()
667 ext2_dirent *de; in ext2_empty_dir() local
673 de = (ext2_dirent *)kaddr; in ext2_empty_dir()
674 kaddr += ext2_last_byte(inode, i) - EXT2_DIR_REC_LEN(1); in ext2_empty_dir()
676 while ((char *)de <= kaddr) { in ext2_empty_dir()
677 if (de->rec_len == 0) { in ext2_empty_dir()
678 ext2_error(inode->i_sb, __func__, in ext2_empty_dir()
679 "zero-length directory entry"); in ext2_empty_dir()
680 printk("kaddr=%p, de=%p\n", kaddr, de); in ext2_empty_dir()
683 if (de->inode != 0) { in ext2_empty_dir()
685 if (de->name[0] != '.') in ext2_empty_dir()
687 if (de->name_len > 2) in ext2_empty_dir()
689 if (de->name_len < 2) { in ext2_empty_dir()
690 if (de->inode != in ext2_empty_dir()
691 cpu_to_le32(inode->i_ino)) in ext2_empty_dir()
693 } else if (de->name[1] != '.') in ext2_empty_dir()
696 de = ext2_next_entry(de); in ext2_empty_dir()