staging: erofs: redefine where `owned_workgrp_t' points
authorGao Xiang <gaoxiang25@huawei.com>
Fri, 7 Dec 2018 16:19:17 +0000 (00:19 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Dec 2018 16:10:48 +0000 (17:10 +0100)
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: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/erofs/unzip_vle.c
drivers/staging/erofs/unzip_vle.h

index 2b494f29e2c2d8ecf351b4021a488331864d1154..a8cf324f0b9c51faf6e1c4620b3c6a5aec19d99f 100644 (file)
@@ -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);
 
index 3316bc36965d4fd2ab6b5270f7ee7c2cf1e0eb7d..5a4e1b62c0d1c40906aa500a2d49b5ffc535c89a 100644 (file)
@@ -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) */