aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGao Xiang <hsiangkao@linux.alibaba.com>2024-06-13 00:18:25 +0800
committerGao Xiang <hsiangkao@linux.alibaba.com>2024-06-13 10:44:24 +0800
commit37e5abcd87200a34da1b805cf268d90f1e8d92d1 (patch)
tree66b6f630e4a98d4c80b875cd14fc1ce2d5ee52de
parentea533bb17786779cd0952973ec80172b75fa461d (diff)
downloaderofs-utils-37e5abcd87200a34da1b805cf268d90f1e8d92d1.tar.gz
erofs-utils: mkfs: assign root NID in the main thread
Thus it can be customized (skipped), especially for incremental builds. Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20240612161826.711279-4-hsiangkao@linux.alibaba.com
-rw-r--r--lib/inode.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/lib/inode.c b/lib/inode.c
index e4ec95f..cb314d4 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -1186,8 +1186,6 @@ static int erofs_mkfs_jobfn(struct erofs_mkfs_jobitem *item)
if (ret)
return ret;
inode->bh->op = &erofs_skip_write_bhops;
- if (IS_ROOT(inode)) /* assign root NID */
- erofs_fixup_meta_blkaddr(inode);
return 0;
}
@@ -1206,20 +1204,31 @@ static int erofs_mkfs_jobfn(struct erofs_mkfs_jobitem *item)
struct erofs_mkfs_dfops {
pthread_t worker;
pthread_mutex_t lock;
- pthread_cond_t full, empty;
+ pthread_cond_t full, empty, drain;
struct erofs_mkfs_jobitem *queue;
unsigned int entries, head, tail;
};
#define EROFS_MT_QUEUE_SIZE 128
-void *erofs_mkfs_pop_jobitem(struct erofs_mkfs_dfops *q)
+static void erofs_mkfs_flushjobs(struct erofs_sb_info *sbi)
+{
+ struct erofs_mkfs_dfops *q = sbi->mkfs_dfops;
+
+ pthread_mutex_lock(&q->lock);
+ pthread_cond_wait(&q->drain, &q->lock);
+ pthread_mutex_unlock(&q->lock);
+}
+
+static void *erofs_mkfs_pop_jobitem(struct erofs_mkfs_dfops *q)
{
struct erofs_mkfs_jobitem *item;
pthread_mutex_lock(&q->lock);
- while (q->head == q->tail)
+ while (q->head == q->tail) {
+ pthread_cond_signal(&q->drain);
pthread_cond_wait(&q->empty, &q->lock);
+ }
item = q->queue + q->head;
q->head = (q->head + 1) & (q->entries - 1);
@@ -1229,7 +1238,7 @@ void *erofs_mkfs_pop_jobitem(struct erofs_mkfs_dfops *q)
return item;
}
-void *z_erofs_mt_dfops_worker(void *arg)
+static void *z_erofs_mt_dfops_worker(void *arg)
{
struct erofs_sb_info *sbi = arg;
int ret = 0;
@@ -1247,8 +1256,8 @@ void *z_erofs_mt_dfops_worker(void *arg)
pthread_exit((void *)(uintptr_t)ret);
}
-int erofs_mkfs_go(struct erofs_sb_info *sbi,
- enum erofs_mkfs_jobtype type, void *elem, int size)
+static int erofs_mkfs_go(struct erofs_sb_info *sbi,
+ enum erofs_mkfs_jobtype type, void *elem, int size)
{
struct erofs_mkfs_jobitem *item;
struct erofs_mkfs_dfops *q = sbi->mkfs_dfops;
@@ -1268,8 +1277,8 @@ int erofs_mkfs_go(struct erofs_sb_info *sbi,
return 0;
}
#else
-int erofs_mkfs_go(struct erofs_sb_info *sbi,
- enum erofs_mkfs_jobtype type, void *elem, int size)
+static int erofs_mkfs_go(struct erofs_sb_info *sbi,
+ enum erofs_mkfs_jobtype type, void *elem, int size)
{
struct erofs_mkfs_jobitem item;
@@ -1277,6 +1286,9 @@ int erofs_mkfs_go(struct erofs_sb_info *sbi,
memcpy(&item.u, elem, size);
return erofs_mkfs_jobfn(&item);
}
+static void erofs_mkfs_flushjobs(struct erofs_sb_info *sbi)
+{
+}
#endif
static int erofs_mkfs_handle_directory(struct erofs_inode *dir)
@@ -1538,6 +1550,8 @@ static int erofs_mkfs_dump_tree(struct erofs_inode *root, bool rebuild)
if (err)
return err;
+ erofs_mkfs_flushjobs(root->sbi);
+ erofs_fixup_meta_blkaddr(root); /* assign root NID */
do {
int err;
struct erofs_inode *dir = dumpdir;
@@ -1636,6 +1650,7 @@ static int erofs_mkfs_build_tree(struct erofs_mkfs_buildtree_ctx *ctx)
pthread_mutex_init(&q->lock, NULL);
pthread_cond_init(&q->empty, NULL);
pthread_cond_init(&q->full, NULL);
+ pthread_cond_init(&q->drain, NULL);
q->head = 0;
q->tail = 0;
@@ -1654,6 +1669,7 @@ static int erofs_mkfs_build_tree(struct erofs_mkfs_buildtree_ctx *ctx)
fail:
pthread_cond_destroy(&q->empty);
pthread_cond_destroy(&q->full);
+ pthread_cond_destroy(&q->drain);
pthread_mutex_destroy(&q->lock);
free(q->queue);
free(q);