]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/ext4/mballoc.c
Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[karo-tx-linux.git] / fs / ext4 / mballoc.c
index 11dc4e0033cfdefb3adb3234a83493a806e94fa8..59e31622cc6ef41cdd8474d47e43e1e634da676a 100644 (file)
@@ -1044,6 +1044,8 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
         * allocating. If we are looking at the buddy cache we would
         * have taken a reference using ext4_mb_load_buddy and that
         * would have pinned buddy page to page cache.
+        * The call to ext4_mb_get_buddy_page_lock will mark the
+        * page accessed.
         */
        ret = ext4_mb_get_buddy_page_lock(sb, group, &e4b);
        if (ret || !EXT4_MB_GRP_NEED_INIT(this_grp)) {
@@ -1062,7 +1064,6 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
                ret = -EIO;
                goto err;
        }
-       mark_page_accessed(page);
 
        if (e4b.bd_buddy_page == NULL) {
                /*
@@ -1082,7 +1083,6 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
                ret = -EIO;
                goto err;
        }
-       mark_page_accessed(page);
 err:
        ext4_mb_put_buddy_page_lock(&e4b);
        return ret;
@@ -1141,7 +1141,7 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
 
        /* we could use find_or_create_page(), but it locks page
         * what we'd like to avoid in fast path ... */
-       page = find_get_page(inode->i_mapping, pnum);
+       page = find_get_page_flags(inode->i_mapping, pnum, FGP_ACCESSED);
        if (page == NULL || !PageUptodate(page)) {
                if (page)
                        /*
@@ -1176,15 +1176,16 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
                ret = -EIO;
                goto err;
        }
+
+       /* Pages marked accessed already */
        e4b->bd_bitmap_page = page;
        e4b->bd_bitmap = page_address(page) + (poff * sb->s_blocksize);
-       mark_page_accessed(page);
 
        block++;
        pnum = block / blocks_per_page;
        poff = block % blocks_per_page;
 
-       page = find_get_page(inode->i_mapping, pnum);
+       page = find_get_page_flags(inode->i_mapping, pnum, FGP_ACCESSED);
        if (page == NULL || !PageUptodate(page)) {
                if (page)
                        page_cache_release(page);
@@ -1209,9 +1210,10 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
                ret = -EIO;
                goto err;
        }
+
+       /* Pages marked accessed already */
        e4b->bd_buddy_page = page;
        e4b->bd_buddy = page_address(page) + (poff * sb->s_blocksize);
-       mark_page_accessed(page);
 
        BUG_ON(e4b->bd_bitmap_page == NULL);
        BUG_ON(e4b->bd_buddy_page == NULL);