linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / fs / ext2 / dir.c
index b0e7d9f..8a27dcc 100644 (file)
@@ -112,7 +112,7 @@ static void ext2_check_page(struct page *page)
        if (offs != limit)
                goto Eend;
 out:
-       SetPageFsMisc(page);
+       SetPageChecked(page);
        return;
 
        /* Too bad, we had an error */
@@ -152,20 +152,21 @@ Eend:
                dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
                (unsigned long) le32_to_cpu(p->inode));
 fail:
-       SetPageFsMisc(page);
+       SetPageChecked(page);
        SetPageError(page);
 }
 
 static struct page * ext2_get_page(struct inode *dir, unsigned long n)
 {
        struct address_space *mapping = dir->i_mapping;
-       struct page *page = read_mapping_page(mapping, n, NULL);
+       struct page *page = read_cache_page(mapping, n,
+                               (filler_t*)mapping->a_ops->readpage, NULL);
        if (!IS_ERR(page)) {
                wait_on_page_locked(page);
                kmap(page);
                if (!PageUptodate(page))
                        goto fail;
-               if (!PageFsMisc(page))
+               if (!PageChecked(page))
                        ext2_check_page(page);
                if (PageError(page))
                        goto fail;
@@ -368,6 +369,14 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
                }
                if (++n >= npages)
                        n = 0;
+               /* next page is past the blocks we've got */
+               if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) {
+                       ext2_error(dir->i_sb, __FUNCTION__,
+                               "dir %lu size %lld exceeds block count %llu",
+                               dir->i_ino, dir->i_size,
+                               (unsigned long long)dir->i_blocks);
+                               goto out;
+               }
        } while (n != start);
 out:
        return NULL;
@@ -399,7 +408,8 @@ ino_t ext2_inode_by_name(struct inode * dir, struct dentry *dentry)
        de = ext2_find_entry (dir, dentry, &page);
        if (de) {
                res = le32_to_cpu(de->inode);
-               ext2_put_page(page);
+               kunmap(page);
+               page_cache_release(page);
        }
        return res;
 }
@@ -414,7 +424,8 @@ void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
 
        lock_page(page);
        err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
-       BUG_ON(err);
+       if (err)
+               BUG();
        de->inode = cpu_to_le32(inode->i_ino);
        ext2_set_de_type (de, inode);
        err = ext2_commit_chunk(page, from, to);
@@ -551,7 +562,8 @@ int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page )
                from = (char*)pde - (char*)page_address(page);
        lock_page(page);
        err = mapping->a_ops->prepare_write(NULL, page, from, to);
-       BUG_ON(err);
+       if (err)
+               BUG();
        if (pde)
                pde->rec_len = cpu_to_le16(to-from);
        dir->inode = 0;
@@ -656,7 +668,7 @@ not_empty:
        return 0;
 }
 
-const struct file_operations ext2_dir_operations = {
+struct file_operations ext2_dir_operations = {
        .llseek         = generic_file_llseek,
        .read           = generic_read_dir,
        .readdir        = ext2_readdir,