36 static inline unsigned ext2_rec_len_from_disk(
__le16 dlen)
40 #if (PAGE_CACHE_SIZE >= 65536)
47 static inline __le16 ext2_rec_len_to_disk(
unsigned len)
49 #if (PAGE_CACHE_SIZE >= 65536)
62 static inline unsigned ext2_chunk_size(
struct inode *
inode)
64 return inode->
i_sb->s_blocksize;
67 static inline void ext2_put_page(
struct page *
page)
73 static inline unsigned long dir_pages(
struct inode *
inode)
83 ext2_last_byte(
struct inode *inode,
unsigned long page_nr)
85 unsigned last_byte = inode->
i_size;
93 static int ext2_commit_chunk(
struct page *
page, loff_t
pos,
unsigned len)
96 struct inode *
dir = mapping->
host;
102 if (pos+len > dir->
i_size) {
103 i_size_write(dir, pos+len);
104 mark_inode_dirty(dir);
118 static void ext2_check_page(
struct page *page,
int quiet)
120 struct inode *dir = page->
mapping->host;
122 unsigned chunk_size = ext2_chunk_size(dir);
130 if ((dir->
i_size >> PAGE_CACHE_SHIFT) == page->
index) {
132 if (limit & (chunk_size - 1))
139 rec_len = ext2_rec_len_from_disk(p->
rec_len);
147 if (
unlikely(((offs + rec_len - 1) ^ offs) & ~(chunk_size-1)))
155 SetPageChecked(page);
163 "size of directory #%lu is not a multiple "
164 "of chunk size", dir->
i_ino);
167 error =
"rec_len is smaller than minimal";
170 error =
"unaligned directory entry";
173 error =
"rec_len is too small for name_len";
176 error =
"directory entry across blocks";
179 error =
"inode out of bounds";
182 ext2_error(sb, __func__,
"bad entry in directory #%lu: : %s - "
183 "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
184 dir->
i_ino, error, (page->
index<<PAGE_CACHE_SHIFT)+offs,
192 "entry in directory #%lu spans the page boundary"
193 "offset=%lu, inode=%lu",
194 dir->
i_ino, (page->
index<<PAGE_CACHE_SHIFT)+offs,
198 SetPageChecked(page);
202 static struct page * ext2_get_page(
struct inode *dir,
unsigned long n,
206 struct page *page = read_mapping_page(mapping, n,
NULL);
209 if (!PageChecked(page))
210 ext2_check_page(page, quiet);
218 return ERR_PTR(-
EIO);
226 static inline int ext2_match (
int len,
const char *
const name,
242 ext2_rec_len_from_disk(p->
rec_len));
245 static inline unsigned
246 ext2_validate_entry(
char *base,
unsigned offset,
unsigned mask)
250 while ((
char*)p < (
char*)de) {
253 p = ext2_next_entry(p);
255 return (
char *)p - base;
258 static unsigned char ext2_filetype_table[
EXT2_FT_MAX] = {
270 static unsigned char ext2_type_by_mode[
S_IFMT >>
S_SHIFT] = {
280 static inline void ext2_set_de_type(
ext2_dirent *de,
struct inode *inode)
292 loff_t pos = filp->
f_pos;
293 struct inode *inode = filp->
f_path.dentry->d_inode;
297 unsigned long npages = dir_pages(inode);
298 unsigned chunk_mask = ~(ext2_chunk_size(inode)-1);
299 unsigned char *types =
NULL;
306 types = ext2_filetype_table;
308 for ( ; n < npages; n++, offset = 0) {
311 struct page *page = ext2_get_page(inode, n, 0);
318 return PTR_ERR(page);
323 offset = ext2_validate_entry(kaddr, offset, chunk_mask);
331 for ( ;(
char*)de <= limit; de = ext2_next_entry(de)) {
334 "zero-length directory entry");
345 offset = (
char *)de - kaddr;
347 (n<<PAGE_CACHE_SHIFT) | offset,
370 struct qstr *
child,
struct page ** res_page)
372 const char *name = child->
name;
376 unsigned long npages = dir_pages(dir);
377 struct page *page =
NULL;
380 int dir_has_error = 0;
394 page = ext2_get_page(dir, n, dir_has_error);
398 kaddr += ext2_last_byte(dir, n) - reclen;
399 while ((
char *) de <= kaddr) {
402 "zero-length directory entry");
406 if (ext2_match (namelen, name, de))
408 de = ext2_next_entry(de);
419 "dir %lu size %lld exceeds block count %llu",
424 }
while (n != start);
436 struct page *page = ext2_get_page(dir, 0, 0);
460 static int ext2_prepare_chunk(
struct page *page, loff_t pos,
unsigned len)
467 struct page *page,
struct inode *inode,
int update_times)
471 unsigned len = ext2_rec_len_from_disk(de->
rec_len);
475 err = ext2_prepare_chunk(page, pos, len);
478 ext2_set_de_type(de, inode);
479 err = ext2_commit_chunk(page, pos, len);
484 mark_inode_dirty(dir);
492 struct inode *dir = dentry->
d_parent->d_inode;
493 const char *name = dentry->
d_name.name;
495 unsigned chunk_size = ext2_chunk_size(dir);
498 struct page *page =
NULL;
500 unsigned long npages = dir_pages(dir);
511 for (n = 0; n <= npages; n++) {
514 page = ext2_get_page(dir, n, 0);
520 dir_end = kaddr + ext2_last_byte(dir, n);
523 while ((
char *)de <= kaddr) {
524 if ((
char *)de == dir_end) {
527 rec_len = chunk_size;
528 de->
rec_len = ext2_rec_len_to_disk(chunk_size);
534 "zero-length directory entry");
539 if (ext2_match (namelen, name, de))
542 rec_len = ext2_rec_len_from_disk(de->
rec_len);
543 if (!de->
inode && rec_len >= reclen)
545 if (rec_len >= name_len + reclen)
558 err = ext2_prepare_chunk(page, pos, rec_len);
563 de1->
rec_len = ext2_rec_len_to_disk(rec_len - name_len);
564 de->
rec_len = ext2_rec_len_to_disk(name_len);
570 ext2_set_de_type (de, inode);
571 err = ext2_commit_chunk(page, pos, rec_len);
574 mark_inode_dirty(dir);
591 struct inode *inode = page->
mapping->host;
593 unsigned from = ((
char*)dir - kaddr) & ~(ext2_chunk_size(inode)-1);
594 unsigned to = ((
char *)dir - kaddr) +
595 ext2_rec_len_from_disk(dir->
rec_len);
601 while ((
char*)de < (
char*)dir) {
604 "zero-length directory entry");
609 de = ext2_next_entry(de);
615 err = ext2_prepare_chunk(page, pos, to - from);
618 pde->
rec_len = ext2_rec_len_to_disk(to - from);
620 err = ext2_commit_chunk(page, pos, to - from);
623 mark_inode_dirty(inode);
634 struct page *page = grab_cache_page(inode->
i_mapping, 0);
635 unsigned chunk_size = ext2_chunk_size(inode);
643 err = ext2_prepare_chunk(page, 0, chunk_size);
649 memset(kaddr, 0, chunk_size);
655 ext2_set_de_type (de, inode);
662 ext2_set_de_type (de, inode);
664 err = ext2_commit_chunk(page, 0, chunk_size);
675 struct page *page =
NULL;
676 unsigned long i, npages = dir_pages(inode);
677 int dir_has_error = 0;
679 for (i = 0; i < npages; i++) {
682 page = ext2_get_page(inode, i, dir_has_error);
693 while ((
char *)de <= kaddr) {
696 "zero-length directory entry");
697 printk(
"kaddr=%p, de=%p\n", kaddr, de);
700 if (de->
inode != 0) {
702 if (de->
name[0] !=
'.')
710 }
else if (de->
name[1] !=
'.')
713 de = ext2_next_entry(de);
727 .readdir = ext2_readdir,