Procházet zdrojové kódy

f2fs: relocate readahead codes in readdir()

Previously, for large directory, we just do readahead only once in
readdir(), readdir()'s performance may drop when traversing latter
blocks. In order to avoid this, relocate readahead codes to covering
all traverse flow.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Chao Yu před 8 roky
rodič
revize
cb7a844865
1 změnil soubory, kde provedl 5 přidání a 5 odebrání
  1. 5 5
      fs/f2fs/dir.c

+ 5 - 5
fs/f2fs/dir.c

@@ -870,11 +870,6 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)
 		goto out_free;
 		goto out_free;
 	}
 	}
 
 
-	/* readahead for multi pages of dir */
-	if (npages - n > 1 && !ra_has_index(ra, n))
-		page_cache_sync_readahead(inode->i_mapping, ra, file, n,
-				min(npages - n, (pgoff_t)MAX_DIR_RA_PAGES));
-
 	for (; n < npages; n++) {
 	for (; n < npages; n++) {
 
 
 		/* allow readdir() to be interrupted */
 		/* allow readdir() to be interrupted */
@@ -884,6 +879,11 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)
 		}
 		}
 		cond_resched();
 		cond_resched();
 
 
+		/* readahead for multi pages of dir */
+		if (npages - n > 1 && !ra_has_index(ra, n))
+			page_cache_sync_readahead(inode->i_mapping, ra, file, n,
+				min(npages - n, (pgoff_t)MAX_DIR_RA_PAGES));
+
 		dentry_page = get_lock_data_page(inode, n, false);
 		dentry_page = get_lock_data_page(inode, n, false);
 		if (IS_ERR(dentry_page)) {
 		if (IS_ERR(dentry_page)) {
 			err = PTR_ERR(dentry_page);
 			err = PTR_ERR(dentry_page);