Commit d31fbdc4 authored by Chao Yu's avatar Chao Yu Committed by Gao Xiang
Browse files

erofs: allow readdir() to be interrupted



In a quick slow device, readdir() may loop for long time in large
directory, let's give a chance to allow it to be interrupted by
userspace.

Signed-off-by: default avatarChao Yu <chao@kernel.org>
Reviewed-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250710073619.4083422-1-chao@kernel.org


[ Gao Xiang: move cond_resched() to the end of the while loop. ]
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
parent 27917e81
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -58,6 +58,11 @@ static int erofs_readdir(struct file *f, struct dir_context *ctx)
		struct erofs_dirent *de;
		unsigned int nameoff, maxsize;

		if (fatal_signal_pending(current)) {
			err = -ERESTARTSYS;
			break;
		}

		de = erofs_bread(&buf, dbstart, true);
		if (IS_ERR(de)) {
			erofs_err(sb, "failed to readdir of logical block %llu of nid %llu",
@@ -88,6 +93,7 @@ static int erofs_readdir(struct file *f, struct dir_context *ctx)
			break;
		ctx->pos = dbstart + maxsize;
		ofs = 0;
		cond_resched();
	}
	erofs_put_metabuf(&buf);
	if (EROFS_I(dir)->dot_omitted && ctx->pos == dir->i_size) {