Commit 6afd227c authored by Gao Xiang's avatar Gao Xiang Committed by Greg Kroah-Hartman
Browse files

staging: erofs: redefine where `owned_workgrp_t' points



By design, workgroups are queued in the form of linked lists.

Previously, it points to the next `z_erofs_vle_workgroup',
which isn't flexible enough to simplify `z_erofs_vle_submit_all'.

Let's fix it by pointing to the next `owned_workgrp_t' and use
container_of to get its coresponding `z_erofs_vle_workgroup'.

Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarGao Xiang <gaoxiang25@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 92e6efd5
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -333,7 +333,7 @@ retry:
			    *owned_head) != Z_EROFS_VLE_WORKGRP_NIL)
			goto retry;

		*owned_head = grp;
		*owned_head = &grp->next;
		*hosted = true;
	} else if (grp->next == Z_EROFS_VLE_WORKGRP_TAIL) {
		/*
@@ -488,7 +488,8 @@ z_erofs_vle_work_register(const struct z_erofs_vle_work_finder *f,
		}
	}

	*f->owned_head = *f->grp_ret = grp;
	*f->owned_head = &grp->next;
	*f->grp_ret = grp;
	return work;
}

@@ -1084,7 +1085,7 @@ static void z_erofs_vle_unzip_all(struct super_block *sb,
		/* no possible that 'owned' equals NULL */
		DBG_BUGON(owned == Z_EROFS_VLE_WORKGRP_NIL);

		grp = owned;
		grp = container_of(owned, struct z_erofs_vle_workgroup, next);
		owned = READ_ONCE(grp->next);

		z_erofs_vle_unzip(sb, grp, page_pool);
@@ -1325,7 +1326,8 @@ static bool z_erofs_vle_submit_all(struct super_block *sb,
		DBG_BUGON(owned_head == Z_EROFS_VLE_WORKGRP_TAIL_CLOSED);
		DBG_BUGON(owned_head == Z_EROFS_VLE_WORKGRP_NIL);

		grp = owned_head;
		grp = container_of(owned_head,
				   struct z_erofs_vle_workgroup, next);

		/* close the main owned chain at first */
		owned_head = cmpxchg(&grp->next, Z_EROFS_VLE_WORKGRP_TAIL,
@@ -1382,7 +1384,7 @@ skippage:
				WRITE_ONCE(lstgrp_io->next, iogrp_next);

			if (!lstgrp_noio)
				ios[0]->head = grp;
				ios[0]->head = &grp->next;
			else
				WRITE_ONCE(lstgrp_noio->next, grp);

+2 −2
Original line number Diff line number Diff line
@@ -67,13 +67,13 @@ struct z_erofs_vle_work {
#define Z_EROFS_VLE_WORKGRP_FMT_LZ4          1
#define Z_EROFS_VLE_WORKGRP_FMT_MASK         1

typedef struct z_erofs_vle_workgroup *z_erofs_vle_owned_workgrp_t;
typedef void *z_erofs_vle_owned_workgrp_t;

struct z_erofs_vle_workgroup {
	struct erofs_workgroup obj;
	struct z_erofs_vle_work work;

	/* next owned workgroup */
	/* point to next owned_workgrp_t */
	z_erofs_vle_owned_workgrp_t next;

	/* compressed pages (including multi-usage pages) */