xref: /spdk/test/unit/lib/blobfs/blobfs_async_ut/blobfs_async_ut.c (revision ea941caeaf896fdf2aef7685f86f37023060faed)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2017 Intel Corporation.
312e840b9SSeth Howell  *   All rights reserved.
412e840b9SSeth Howell  */
512e840b9SSeth Howell 
612e840b9SSeth Howell #include "spdk/stdinc.h"
712e840b9SSeth Howell 
812e840b9SSeth Howell #include "CUnit/Basic.h"
912e840b9SSeth Howell 
10b035e2b8SBen Walker #include "common/lib/ut_multithread.c"
1112e840b9SSeth Howell 
12ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
1312e840b9SSeth Howell #include "blobfs/blobfs.c"
1412e840b9SSeth Howell #include "blobfs/tree.c"
15b035e2b8SBen Walker #include "blob/blobstore.h"
1612e840b9SSeth Howell 
1712e840b9SSeth Howell #include "unit/lib/blob/bs_dev_common.c"
1812e840b9SSeth Howell 
1912e840b9SSeth Howell struct spdk_filesystem *g_fs;
2012e840b9SSeth Howell struct spdk_file *g_file;
2112e840b9SSeth Howell int g_fserrno;
2212e840b9SSeth Howell 
23ba8f1a9eSAlexey Marchuk DEFINE_STUB(spdk_memory_domain_memzero, int, (struct spdk_memory_domain *src_domain,
24ba8f1a9eSAlexey Marchuk 		void *src_domain_ctx, struct iovec *iov, uint32_t iovcnt, void (*cpl_cb)(void *, int),
25ba8f1a9eSAlexey Marchuk 		void *cpl_cb_arg), 0);
26475b86aaSKonrad Sztyber DEFINE_STUB(spdk_mempool_lookup, struct spdk_mempool *, (const char *name), NULL);
27ba8f1a9eSAlexey Marchuk 
2812e840b9SSeth Howell static void
fs_op_complete(void * ctx,int fserrno)2912e840b9SSeth Howell fs_op_complete(void *ctx, int fserrno)
3012e840b9SSeth Howell {
3112e840b9SSeth Howell 	g_fserrno = fserrno;
3212e840b9SSeth Howell }
3312e840b9SSeth Howell 
3412e840b9SSeth Howell static void
fs_op_with_handle_complete(void * ctx,struct spdk_filesystem * fs,int fserrno)3512e840b9SSeth Howell fs_op_with_handle_complete(void *ctx, struct spdk_filesystem *fs, int fserrno)
3612e840b9SSeth Howell {
3712e840b9SSeth Howell 	g_fs = fs;
3812e840b9SSeth Howell 	g_fserrno = fserrno;
3912e840b9SSeth Howell }
4012e840b9SSeth Howell 
4112e840b9SSeth Howell static void
fs_poll_threads(void)421914de09SChangpeng Liu fs_poll_threads(void)
431914de09SChangpeng Liu {
441914de09SChangpeng Liu 	poll_threads();
451914de09SChangpeng Liu 	while (spdk_thread_poll(g_cache_pool_thread, 0, 0) > 0) {}
461914de09SChangpeng Liu }
471914de09SChangpeng Liu 
481914de09SChangpeng Liu static void
fs_init(void)4912e840b9SSeth Howell fs_init(void)
5012e840b9SSeth Howell {
5112e840b9SSeth Howell 	struct spdk_filesystem *fs;
5212e840b9SSeth Howell 	struct spdk_bs_dev *dev;
5312e840b9SSeth Howell 
5412e840b9SSeth Howell 	dev = init_dev();
5512e840b9SSeth Howell 
5612e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
571914de09SChangpeng Liu 	fs_poll_threads();
58438b71d1SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
5912e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
6012e840b9SSeth Howell 	fs = g_fs;
61b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
6212e840b9SSeth Howell 
6312e840b9SSeth Howell 	g_fserrno = 1;
6412e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
651914de09SChangpeng Liu 	fs_poll_threads();
6612e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
6712e840b9SSeth Howell }
6812e840b9SSeth Howell 
6912e840b9SSeth Howell static void
create_cb(void * ctx,int fserrno)7012e840b9SSeth Howell create_cb(void *ctx, int fserrno)
7112e840b9SSeth Howell {
7212e840b9SSeth Howell 	g_fserrno = fserrno;
7312e840b9SSeth Howell }
7412e840b9SSeth Howell 
7512e840b9SSeth Howell static void
open_cb(void * ctx,struct spdk_file * f,int fserrno)7612e840b9SSeth Howell open_cb(void *ctx, struct spdk_file *f, int fserrno)
7712e840b9SSeth Howell {
7812e840b9SSeth Howell 	g_fserrno = fserrno;
7912e840b9SSeth Howell 	g_file = f;
8012e840b9SSeth Howell }
8112e840b9SSeth Howell 
8212e840b9SSeth Howell static void
delete_cb(void * ctx,int fserrno)8312e840b9SSeth Howell delete_cb(void *ctx, int fserrno)
8412e840b9SSeth Howell {
8512e840b9SSeth Howell 	g_fserrno = fserrno;
8612e840b9SSeth Howell }
8712e840b9SSeth Howell 
8812e840b9SSeth Howell static void
fs_open(void)8912e840b9SSeth Howell fs_open(void)
9012e840b9SSeth Howell {
9112e840b9SSeth Howell 	struct spdk_filesystem *fs;
9212e840b9SSeth Howell 	spdk_fs_iter iter;
9312e840b9SSeth Howell 	struct spdk_bs_dev *dev;
9412e840b9SSeth Howell 	struct spdk_file *file;
9512e840b9SSeth Howell 	char name[257] = {'\0'};
9612e840b9SSeth Howell 
9712e840b9SSeth Howell 	dev = init_dev();
9812e840b9SSeth Howell 	memset(name, 'a', sizeof(name) - 1);
9912e840b9SSeth Howell 
10012e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
1011914de09SChangpeng Liu 	fs_poll_threads();
102438b71d1SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
10312e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
10412e840b9SSeth Howell 	fs = g_fs;
105b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
10612e840b9SSeth Howell 
10712e840b9SSeth Howell 	g_fserrno = 0;
10812e840b9SSeth Howell 	/* Open should fail, because the file name is too long. */
10912e840b9SSeth Howell 	spdk_fs_open_file_async(fs, name, SPDK_BLOBFS_OPEN_CREATE, open_cb, NULL);
1101914de09SChangpeng Liu 	fs_poll_threads();
11112e840b9SSeth Howell 	CU_ASSERT(g_fserrno == -ENAMETOOLONG);
11212e840b9SSeth Howell 
11312e840b9SSeth Howell 	g_fserrno = 0;
11412e840b9SSeth Howell 	spdk_fs_open_file_async(fs, "file1", 0, open_cb, NULL);
1151914de09SChangpeng Liu 	fs_poll_threads();
11612e840b9SSeth Howell 	CU_ASSERT(g_fserrno == -ENOENT);
11712e840b9SSeth Howell 
11812e840b9SSeth Howell 	g_file = NULL;
11912e840b9SSeth Howell 	g_fserrno = 1;
12012e840b9SSeth Howell 	spdk_fs_open_file_async(fs, "file1", SPDK_BLOBFS_OPEN_CREATE, open_cb, NULL);
1211914de09SChangpeng Liu 	fs_poll_threads();
12212e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
12312e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_file != NULL);
12412e840b9SSeth Howell 	CU_ASSERT(!strcmp("file1", g_file->name));
12512e840b9SSeth Howell 	CU_ASSERT(g_file->ref_count == 1);
12612e840b9SSeth Howell 
12712e840b9SSeth Howell 	iter = spdk_fs_iter_first(fs);
12812e840b9SSeth Howell 	CU_ASSERT(iter != NULL);
12912e840b9SSeth Howell 	file = spdk_fs_iter_get_file(iter);
13012e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(file != NULL);
13112e840b9SSeth Howell 	CU_ASSERT(!strcmp("file1", file->name));
13212e840b9SSeth Howell 	iter = spdk_fs_iter_next(iter);
13312e840b9SSeth Howell 	CU_ASSERT(iter == NULL);
13412e840b9SSeth Howell 
13512e840b9SSeth Howell 	g_fserrno = 0;
13612e840b9SSeth Howell 	/* Delete should successful, we will mark the file as deleted. */
13712e840b9SSeth Howell 	spdk_fs_delete_file_async(fs, "file1", delete_cb, NULL);
1381914de09SChangpeng Liu 	fs_poll_threads();
13912e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
14012e840b9SSeth Howell 	CU_ASSERT(!TAILQ_EMPTY(&fs->files));
14112e840b9SSeth Howell 
14212e840b9SSeth Howell 	g_fserrno = 1;
14312e840b9SSeth Howell 	spdk_file_close_async(g_file, fs_op_complete, NULL);
1441914de09SChangpeng Liu 	fs_poll_threads();
14512e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
14612e840b9SSeth Howell 	CU_ASSERT(TAILQ_EMPTY(&fs->files));
14712e840b9SSeth Howell 
14812e840b9SSeth Howell 	g_fserrno = 1;
14912e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
1501914de09SChangpeng Liu 	fs_poll_threads();
15112e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
15212e840b9SSeth Howell }
15312e840b9SSeth Howell 
15412e840b9SSeth Howell static void
fs_create(void)15512e840b9SSeth Howell fs_create(void)
15612e840b9SSeth Howell {
15712e840b9SSeth Howell 	struct spdk_filesystem *fs;
15812e840b9SSeth Howell 	struct spdk_bs_dev *dev;
15912e840b9SSeth Howell 	char name[257] = {'\0'};
16012e840b9SSeth Howell 
16112e840b9SSeth Howell 	dev = init_dev();
16212e840b9SSeth Howell 	memset(name, 'a', sizeof(name) - 1);
16312e840b9SSeth Howell 
16412e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
1651914de09SChangpeng Liu 	fs_poll_threads();
16612e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
16712e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
16812e840b9SSeth Howell 	fs = g_fs;
169b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
17012e840b9SSeth Howell 
17112e840b9SSeth Howell 	g_fserrno = 0;
17212e840b9SSeth Howell 	/* Create should fail, because the file name is too long. */
17312e840b9SSeth Howell 	spdk_fs_create_file_async(fs, name, create_cb, NULL);
1741914de09SChangpeng Liu 	fs_poll_threads();
17512e840b9SSeth Howell 	CU_ASSERT(g_fserrno == -ENAMETOOLONG);
17612e840b9SSeth Howell 
17712e840b9SSeth Howell 	g_fserrno = 1;
17812e840b9SSeth Howell 	spdk_fs_create_file_async(fs, "file1", create_cb, NULL);
1791914de09SChangpeng Liu 	fs_poll_threads();
18012e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
18112e840b9SSeth Howell 
18212e840b9SSeth Howell 	g_fserrno = 1;
18312e840b9SSeth Howell 	spdk_fs_create_file_async(fs, "file1", create_cb, NULL);
1841914de09SChangpeng Liu 	fs_poll_threads();
18512e840b9SSeth Howell 	CU_ASSERT(g_fserrno == -EEXIST);
18612e840b9SSeth Howell 
18712e840b9SSeth Howell 	g_fserrno = 1;
18812e840b9SSeth Howell 	spdk_fs_delete_file_async(fs, "file1", delete_cb, NULL);
1891914de09SChangpeng Liu 	fs_poll_threads();
19012e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
19112e840b9SSeth Howell 	CU_ASSERT(TAILQ_EMPTY(&fs->files));
19212e840b9SSeth Howell 
19312e840b9SSeth Howell 	g_fserrno = 1;
19412e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
1951914de09SChangpeng Liu 	fs_poll_threads();
19612e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
19712e840b9SSeth Howell }
19812e840b9SSeth Howell 
19912e840b9SSeth Howell static void
fs_truncate(void)20012e840b9SSeth Howell fs_truncate(void)
20112e840b9SSeth Howell {
20212e840b9SSeth Howell 	struct spdk_filesystem *fs;
20312e840b9SSeth Howell 	struct spdk_bs_dev *dev;
20412e840b9SSeth Howell 
20512e840b9SSeth Howell 	dev = init_dev();
20612e840b9SSeth Howell 
20712e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
2081914de09SChangpeng Liu 	fs_poll_threads();
20912e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
21012e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
21112e840b9SSeth Howell 	fs = g_fs;
212b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
21312e840b9SSeth Howell 
21412e840b9SSeth Howell 	g_file = NULL;
21512e840b9SSeth Howell 	g_fserrno = 1;
21612e840b9SSeth Howell 	spdk_fs_open_file_async(fs, "file1", SPDK_BLOBFS_OPEN_CREATE, open_cb, NULL);
2171914de09SChangpeng Liu 	fs_poll_threads();
21812e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
21912e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_file != NULL);
22012e840b9SSeth Howell 
22112e840b9SSeth Howell 	g_fserrno = 1;
22212e840b9SSeth Howell 	spdk_file_truncate_async(g_file, 18 * 1024 * 1024 + 1, fs_op_complete, NULL);
2231914de09SChangpeng Liu 	fs_poll_threads();
22412e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
22512e840b9SSeth Howell 	CU_ASSERT(g_file->length == 18 * 1024 * 1024 + 1);
22612e840b9SSeth Howell 
22712e840b9SSeth Howell 	g_fserrno = 1;
22812e840b9SSeth Howell 	spdk_file_truncate_async(g_file, 1, fs_op_complete, NULL);
2291914de09SChangpeng Liu 	fs_poll_threads();
23012e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
23112e840b9SSeth Howell 	CU_ASSERT(g_file->length == 1);
23212e840b9SSeth Howell 
23312e840b9SSeth Howell 	g_fserrno = 1;
23412e840b9SSeth Howell 	spdk_file_truncate_async(g_file, 18 * 1024 * 1024 + 1, fs_op_complete, NULL);
2351914de09SChangpeng Liu 	fs_poll_threads();
23612e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
23712e840b9SSeth Howell 	CU_ASSERT(g_file->length == 18 * 1024 * 1024 + 1);
23812e840b9SSeth Howell 
23912e840b9SSeth Howell 	g_fserrno = 1;
24012e840b9SSeth Howell 	spdk_file_close_async(g_file, fs_op_complete, NULL);
2411914de09SChangpeng Liu 	fs_poll_threads();
24212e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
24312e840b9SSeth Howell 	CU_ASSERT(g_file->ref_count == 0);
24412e840b9SSeth Howell 
24512e840b9SSeth Howell 	g_fserrno = 1;
24612e840b9SSeth Howell 	spdk_fs_delete_file_async(fs, "file1", delete_cb, NULL);
2471914de09SChangpeng Liu 	fs_poll_threads();
24812e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
24912e840b9SSeth Howell 	CU_ASSERT(TAILQ_EMPTY(&fs->files));
25012e840b9SSeth Howell 
25112e840b9SSeth Howell 	g_fserrno = 1;
25212e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
2531914de09SChangpeng Liu 	fs_poll_threads();
25412e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
25512e840b9SSeth Howell }
25612e840b9SSeth Howell 
25712e840b9SSeth Howell static void
fs_rename(void)25812e840b9SSeth Howell fs_rename(void)
25912e840b9SSeth Howell {
26012e840b9SSeth Howell 	struct spdk_filesystem *fs;
2618caf6b64SSeth Howell 	struct spdk_file *file, *file2, *file_iter;
26212e840b9SSeth Howell 	struct spdk_bs_dev *dev;
26312e840b9SSeth Howell 
26412e840b9SSeth Howell 	dev = init_dev();
26512e840b9SSeth Howell 
26612e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
2671914de09SChangpeng Liu 	fs_poll_threads();
26812e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
26912e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
27012e840b9SSeth Howell 	fs = g_fs;
271b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
27212e840b9SSeth Howell 
27312e840b9SSeth Howell 	g_fserrno = 1;
27412e840b9SSeth Howell 	spdk_fs_create_file_async(fs, "file1", create_cb, NULL);
2751914de09SChangpeng Liu 	fs_poll_threads();
27612e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
27712e840b9SSeth Howell 
27812e840b9SSeth Howell 	g_file = NULL;
27912e840b9SSeth Howell 	g_fserrno = 1;
28012e840b9SSeth Howell 	spdk_fs_open_file_async(fs, "file1", 0, open_cb, NULL);
2811914de09SChangpeng Liu 	fs_poll_threads();
28212e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
28312e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_file != NULL);
28412e840b9SSeth Howell 	CU_ASSERT(g_file->ref_count == 1);
28512e840b9SSeth Howell 
28612e840b9SSeth Howell 	file = g_file;
28712e840b9SSeth Howell 	g_file = NULL;
28812e840b9SSeth Howell 	g_fserrno = 1;
28912e840b9SSeth Howell 	spdk_file_close_async(file, fs_op_complete, NULL);
2901914de09SChangpeng Liu 	fs_poll_threads();
29112e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
29212e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(file->ref_count == 0);
29312e840b9SSeth Howell 
29412e840b9SSeth Howell 	g_file = NULL;
29512e840b9SSeth Howell 	g_fserrno = 1;
29612e840b9SSeth Howell 	spdk_fs_open_file_async(fs, "file2", SPDK_BLOBFS_OPEN_CREATE, open_cb, NULL);
2971914de09SChangpeng Liu 	fs_poll_threads();
29812e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
29912e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_file != NULL);
30012e840b9SSeth Howell 	CU_ASSERT(g_file->ref_count == 1);
30112e840b9SSeth Howell 
30212e840b9SSeth Howell 	file2 = g_file;
30312e840b9SSeth Howell 	g_file = NULL;
30412e840b9SSeth Howell 	g_fserrno = 1;
30512e840b9SSeth Howell 	spdk_file_close_async(file2, fs_op_complete, NULL);
3061914de09SChangpeng Liu 	fs_poll_threads();
30712e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
30812e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(file2->ref_count == 0);
30912e840b9SSeth Howell 
31012e840b9SSeth Howell 	/*
31112e840b9SSeth Howell 	 * Do a 3-way rename.  This should delete the old "file2", then rename
31212e840b9SSeth Howell 	 *  "file1" to "file2".
31312e840b9SSeth Howell 	 */
31412e840b9SSeth Howell 	g_fserrno = 1;
31512e840b9SSeth Howell 	spdk_fs_rename_file_async(fs, "file1", "file2", fs_op_complete, NULL);
3161914de09SChangpeng Liu 	fs_poll_threads();
31712e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
31812e840b9SSeth Howell 	CU_ASSERT(file->ref_count == 0);
31912e840b9SSeth Howell 	CU_ASSERT(!strcmp(file->name, "file2"));
32012e840b9SSeth Howell 	CU_ASSERT(TAILQ_FIRST(&fs->files) == file);
32112e840b9SSeth Howell 	CU_ASSERT(TAILQ_NEXT(file, tailq) == NULL);
32212e840b9SSeth Howell 
32312e840b9SSeth Howell 	g_fserrno = 0;
32412e840b9SSeth Howell 	spdk_fs_delete_file_async(fs, "file1", delete_cb, NULL);
3251914de09SChangpeng Liu 	fs_poll_threads();
32612e840b9SSeth Howell 	CU_ASSERT(g_fserrno == -ENOENT);
32712e840b9SSeth Howell 	CU_ASSERT(!TAILQ_EMPTY(&fs->files));
3288caf6b64SSeth Howell 	TAILQ_FOREACH(file_iter, &fs->files, tailq) {
3298caf6b64SSeth Howell 		if (file_iter == NULL) {
3308caf6b64SSeth Howell 			SPDK_CU_ASSERT_FATAL(false);
3318caf6b64SSeth Howell 		}
3328caf6b64SSeth Howell 	}
33312e840b9SSeth Howell 
33412e840b9SSeth Howell 	g_fserrno = 1;
33512e840b9SSeth Howell 	spdk_fs_delete_file_async(fs, "file2", delete_cb, NULL);
3361914de09SChangpeng Liu 	fs_poll_threads();
33712e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
33812e840b9SSeth Howell 	CU_ASSERT(TAILQ_EMPTY(&fs->files));
33912e840b9SSeth Howell 
34012e840b9SSeth Howell 	g_fserrno = 1;
34112e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
3421914de09SChangpeng Liu 	fs_poll_threads();
34312e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
34412e840b9SSeth Howell }
34512e840b9SSeth Howell 
34612e840b9SSeth Howell static void
fs_rw_async(void)347fdd365edSChangpeng Liu fs_rw_async(void)
348fdd365edSChangpeng Liu {
349fdd365edSChangpeng Liu 	struct spdk_filesystem *fs;
350fdd365edSChangpeng Liu 	struct spdk_bs_dev *dev;
351fdd365edSChangpeng Liu 	uint8_t w_buf[4096];
352fdd365edSChangpeng Liu 	uint8_t r_buf[4096];
353fdd365edSChangpeng Liu 
354fdd365edSChangpeng Liu 	dev = init_dev();
355fdd365edSChangpeng Liu 
356fdd365edSChangpeng Liu 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
3571914de09SChangpeng Liu 	fs_poll_threads();
358fdd365edSChangpeng Liu 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
359fdd365edSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
360fdd365edSChangpeng Liu 	fs = g_fs;
361fdd365edSChangpeng Liu 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
362fdd365edSChangpeng Liu 
363fdd365edSChangpeng Liu 	g_file = NULL;
364fdd365edSChangpeng Liu 	g_fserrno = 1;
365fdd365edSChangpeng Liu 	spdk_fs_open_file_async(fs, "file1", SPDK_BLOBFS_OPEN_CREATE, open_cb, NULL);
3661914de09SChangpeng Liu 	fs_poll_threads();
367fdd365edSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
368fdd365edSChangpeng Liu 	SPDK_CU_ASSERT_FATAL(g_file != NULL);
369fdd365edSChangpeng Liu 
370fdd365edSChangpeng Liu 	/* Write file */
371fdd365edSChangpeng Liu 	CU_ASSERT(g_file->length == 0);
372fdd365edSChangpeng Liu 	g_fserrno = 1;
373fdd365edSChangpeng Liu 	memset(w_buf, 0x5a, sizeof(w_buf));
374fdd365edSChangpeng Liu 	spdk_file_write_async(g_file, fs->sync_target.sync_io_channel, w_buf, 0, 4096,
375fdd365edSChangpeng Liu 			      fs_op_complete, NULL);
3761914de09SChangpeng Liu 	fs_poll_threads();
377fdd365edSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
378fdd365edSChangpeng Liu 	CU_ASSERT(g_file->length == 4096);
379fdd365edSChangpeng Liu 
380fdd365edSChangpeng Liu 	/* Read file */
381fdd365edSChangpeng Liu 	g_fserrno = 1;
382fdd365edSChangpeng Liu 	memset(r_buf, 0x0, sizeof(r_buf));
383fdd365edSChangpeng Liu 	spdk_file_read_async(g_file, fs->sync_target.sync_io_channel, r_buf, 0, 4096,
384fdd365edSChangpeng Liu 			     fs_op_complete, NULL);
3851914de09SChangpeng Liu 	fs_poll_threads();
386fdd365edSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
387fdd365edSChangpeng Liu 	CU_ASSERT(memcmp(r_buf, w_buf, sizeof(r_buf)) == 0);
388fdd365edSChangpeng Liu 
389fdd365edSChangpeng Liu 	g_fserrno = 1;
390fdd365edSChangpeng Liu 	spdk_file_close_async(g_file, fs_op_complete, NULL);
3911914de09SChangpeng Liu 	fs_poll_threads();
392fdd365edSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
393fdd365edSChangpeng Liu 
394fdd365edSChangpeng Liu 	g_fserrno = 1;
395fdd365edSChangpeng Liu 	spdk_fs_unload(fs, fs_op_complete, NULL);
3961914de09SChangpeng Liu 	fs_poll_threads();
397fdd365edSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
398fdd365edSChangpeng Liu }
399fdd365edSChangpeng Liu 
400fdd365edSChangpeng Liu static void
fs_writev_readv_async(void)401485a2dcfSChangpeng Liu fs_writev_readv_async(void)
402485a2dcfSChangpeng Liu {
403485a2dcfSChangpeng Liu 	struct spdk_filesystem *fs;
404485a2dcfSChangpeng Liu 	struct spdk_bs_dev *dev;
405485a2dcfSChangpeng Liu 	struct iovec w_iov[2];
406485a2dcfSChangpeng Liu 	struct iovec r_iov[2];
407485a2dcfSChangpeng Liu 	uint8_t w_buf[4096];
408485a2dcfSChangpeng Liu 	uint8_t r_buf[4096];
409485a2dcfSChangpeng Liu 
410485a2dcfSChangpeng Liu 	dev = init_dev();
411485a2dcfSChangpeng Liu 
412485a2dcfSChangpeng Liu 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
4131914de09SChangpeng Liu 	fs_poll_threads();
414485a2dcfSChangpeng Liu 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
415485a2dcfSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
416485a2dcfSChangpeng Liu 	fs = g_fs;
417485a2dcfSChangpeng Liu 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
418485a2dcfSChangpeng Liu 
419485a2dcfSChangpeng Liu 	g_file = NULL;
420485a2dcfSChangpeng Liu 	g_fserrno = 1;
421485a2dcfSChangpeng Liu 	spdk_fs_open_file_async(fs, "file1", SPDK_BLOBFS_OPEN_CREATE, open_cb, NULL);
4221914de09SChangpeng Liu 	fs_poll_threads();
423485a2dcfSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
424485a2dcfSChangpeng Liu 	SPDK_CU_ASSERT_FATAL(g_file != NULL);
425485a2dcfSChangpeng Liu 
426485a2dcfSChangpeng Liu 	/* Write file */
427485a2dcfSChangpeng Liu 	CU_ASSERT(g_file->length == 0);
428485a2dcfSChangpeng Liu 	g_fserrno = 1;
429485a2dcfSChangpeng Liu 	memset(w_buf, 0x5a, sizeof(w_buf));
430485a2dcfSChangpeng Liu 	w_iov[0].iov_base = w_buf;
431485a2dcfSChangpeng Liu 	w_iov[0].iov_len = 2048;
432485a2dcfSChangpeng Liu 	w_iov[1].iov_base = w_buf + 2048;
433485a2dcfSChangpeng Liu 	w_iov[1].iov_len = 2048;
434485a2dcfSChangpeng Liu 	spdk_file_writev_async(g_file, fs->sync_target.sync_io_channel,
435485a2dcfSChangpeng Liu 			       w_iov, 2, 0, 4096, fs_op_complete, NULL);
4361914de09SChangpeng Liu 	fs_poll_threads();
437485a2dcfSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
438485a2dcfSChangpeng Liu 	CU_ASSERT(g_file->length == 4096);
439485a2dcfSChangpeng Liu 
440485a2dcfSChangpeng Liu 	/* Read file */
441485a2dcfSChangpeng Liu 	g_fserrno = 1;
442485a2dcfSChangpeng Liu 	memset(r_buf, 0x0, sizeof(r_buf));
443485a2dcfSChangpeng Liu 	r_iov[0].iov_base = r_buf;
444485a2dcfSChangpeng Liu 	r_iov[0].iov_len = 2048;
445485a2dcfSChangpeng Liu 	r_iov[1].iov_base = r_buf + 2048;
446485a2dcfSChangpeng Liu 	r_iov[1].iov_len = 2048;
447485a2dcfSChangpeng Liu 	spdk_file_readv_async(g_file, fs->sync_target.sync_io_channel,
448485a2dcfSChangpeng Liu 			      r_iov, 2, 0, 4096, fs_op_complete, NULL);
4491914de09SChangpeng Liu 	fs_poll_threads();
450485a2dcfSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
451485a2dcfSChangpeng Liu 	CU_ASSERT(memcmp(r_buf, w_buf, sizeof(r_buf)) == 0);
452485a2dcfSChangpeng Liu 
453be4a5602SGangCao 	/* Overwrite file with block aligned */
454be4a5602SGangCao 	g_fserrno = 1;
455be4a5602SGangCao 	memset(w_buf, 0x6a, sizeof(w_buf));
456be4a5602SGangCao 	w_iov[0].iov_base = w_buf;
457be4a5602SGangCao 	w_iov[0].iov_len = 2048;
458be4a5602SGangCao 	w_iov[1].iov_base = w_buf + 2048;
459be4a5602SGangCao 	w_iov[1].iov_len = 2048;
460be4a5602SGangCao 	spdk_file_writev_async(g_file, fs->sync_target.sync_io_channel,
461be4a5602SGangCao 			       w_iov, 2, 0, 4096, fs_op_complete, NULL);
4621914de09SChangpeng Liu 	fs_poll_threads();
463be4a5602SGangCao 	CU_ASSERT(g_fserrno == 0);
464be4a5602SGangCao 	CU_ASSERT(g_file->length == 4096);
465be4a5602SGangCao 
466be4a5602SGangCao 	/* Read file to verify the overwritten data */
467be4a5602SGangCao 	g_fserrno = 1;
468be4a5602SGangCao 	memset(r_buf, 0x0, sizeof(r_buf));
469be4a5602SGangCao 	r_iov[0].iov_base = r_buf;
470be4a5602SGangCao 	r_iov[0].iov_len = 2048;
471be4a5602SGangCao 	r_iov[1].iov_base = r_buf + 2048;
472be4a5602SGangCao 	r_iov[1].iov_len = 2048;
473be4a5602SGangCao 	spdk_file_readv_async(g_file, fs->sync_target.sync_io_channel,
474be4a5602SGangCao 			      r_iov, 2, 0, 4096, fs_op_complete, NULL);
4751914de09SChangpeng Liu 	fs_poll_threads();
476be4a5602SGangCao 	CU_ASSERT(g_fserrno == 0);
477be4a5602SGangCao 	CU_ASSERT(memcmp(r_buf, w_buf, sizeof(r_buf)) == 0);
478be4a5602SGangCao 
479485a2dcfSChangpeng Liu 	g_fserrno = 1;
480485a2dcfSChangpeng Liu 	spdk_file_close_async(g_file, fs_op_complete, NULL);
4811914de09SChangpeng Liu 	fs_poll_threads();
482485a2dcfSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
483485a2dcfSChangpeng Liu 
484485a2dcfSChangpeng Liu 	g_fserrno = 1;
485485a2dcfSChangpeng Liu 	spdk_fs_unload(fs, fs_op_complete, NULL);
4861914de09SChangpeng Liu 	fs_poll_threads();
487485a2dcfSChangpeng Liu 	CU_ASSERT(g_fserrno == 0);
488485a2dcfSChangpeng Liu }
489485a2dcfSChangpeng Liu 
490485a2dcfSChangpeng Liu static void
tree_find_buffer_ut(void)49112e840b9SSeth Howell tree_find_buffer_ut(void)
49212e840b9SSeth Howell {
49312e840b9SSeth Howell 	struct cache_tree *root;
49412e840b9SSeth Howell 	struct cache_tree *level1_0;
49512e840b9SSeth Howell 	struct cache_tree *level0_0_0;
49612e840b9SSeth Howell 	struct cache_tree *level0_0_12;
49712e840b9SSeth Howell 	struct cache_buffer *leaf_0_0_4;
49812e840b9SSeth Howell 	struct cache_buffer *leaf_0_12_8;
49912e840b9SSeth Howell 	struct cache_buffer *leaf_9_23_15;
50012e840b9SSeth Howell 	struct cache_buffer *buffer;
50112e840b9SSeth Howell 
50212e840b9SSeth Howell 	level1_0 = calloc(1, sizeof(struct cache_tree));
50312e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(level1_0 != NULL);
50412e840b9SSeth Howell 	level0_0_0 = calloc(1, sizeof(struct cache_tree));
50512e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(level0_0_0 != NULL);
50612e840b9SSeth Howell 	level0_0_12 = calloc(1, sizeof(struct cache_tree));
50712e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(level0_0_12 != NULL);
50812e840b9SSeth Howell 	leaf_0_0_4 = calloc(1, sizeof(struct cache_buffer));
50912e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(leaf_0_0_4 != NULL);
51012e840b9SSeth Howell 	leaf_0_12_8 = calloc(1, sizeof(struct cache_buffer));
51112e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(leaf_0_12_8 != NULL);
51212e840b9SSeth Howell 	leaf_9_23_15 = calloc(1, sizeof(struct cache_buffer));
51312e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(leaf_9_23_15 != NULL);
51412e840b9SSeth Howell 
51512e840b9SSeth Howell 	level1_0->level = 1;
51612e840b9SSeth Howell 	level0_0_0->level = 0;
51712e840b9SSeth Howell 	level0_0_12->level = 0;
51812e840b9SSeth Howell 
51912e840b9SSeth Howell 	leaf_0_0_4->offset = CACHE_BUFFER_SIZE * 4;
52012e840b9SSeth Howell 	level0_0_0->u.buffer[4] = leaf_0_0_4;
52112e840b9SSeth Howell 	level0_0_0->present_mask |= (1ULL << 4);
52212e840b9SSeth Howell 
52312e840b9SSeth Howell 	leaf_0_12_8->offset = CACHE_TREE_LEVEL_SIZE(1) * 12 + CACHE_BUFFER_SIZE * 8;
52412e840b9SSeth Howell 	level0_0_12->u.buffer[8] = leaf_0_12_8;
52512e840b9SSeth Howell 	level0_0_12->present_mask |= (1ULL << 8);
52612e840b9SSeth Howell 
52712e840b9SSeth Howell 	level1_0->u.tree[0] = level0_0_0;
52812e840b9SSeth Howell 	level1_0->present_mask |= (1ULL << 0);
52912e840b9SSeth Howell 	level1_0->u.tree[12] = level0_0_12;
53012e840b9SSeth Howell 	level1_0->present_mask |= (1ULL << 12);
53112e840b9SSeth Howell 
532bc0180f6SSeth Howell 	buffer = tree_find_buffer(NULL, 0);
53312e840b9SSeth Howell 	CU_ASSERT(buffer == NULL);
53412e840b9SSeth Howell 
535bc0180f6SSeth Howell 	buffer = tree_find_buffer(level0_0_0, 0);
53612e840b9SSeth Howell 	CU_ASSERT(buffer == NULL);
53712e840b9SSeth Howell 
538bc0180f6SSeth Howell 	buffer = tree_find_buffer(level0_0_0, CACHE_TREE_LEVEL_SIZE(0) + 1);
53912e840b9SSeth Howell 	CU_ASSERT(buffer == NULL);
54012e840b9SSeth Howell 
541bc0180f6SSeth Howell 	buffer = tree_find_buffer(level0_0_0, leaf_0_0_4->offset);
54212e840b9SSeth Howell 	CU_ASSERT(buffer == leaf_0_0_4);
54312e840b9SSeth Howell 
544bc0180f6SSeth Howell 	buffer = tree_find_buffer(level1_0, leaf_0_0_4->offset);
54512e840b9SSeth Howell 	CU_ASSERT(buffer == leaf_0_0_4);
54612e840b9SSeth Howell 
547bc0180f6SSeth Howell 	buffer = tree_find_buffer(level1_0, leaf_0_12_8->offset);
54812e840b9SSeth Howell 	CU_ASSERT(buffer == leaf_0_12_8);
54912e840b9SSeth Howell 
550bc0180f6SSeth Howell 	buffer = tree_find_buffer(level1_0, leaf_0_12_8->offset + CACHE_BUFFER_SIZE - 1);
55112e840b9SSeth Howell 	CU_ASSERT(buffer == leaf_0_12_8);
55212e840b9SSeth Howell 
553bc0180f6SSeth Howell 	buffer = tree_find_buffer(level1_0, leaf_0_12_8->offset - 1);
55412e840b9SSeth Howell 	CU_ASSERT(buffer == NULL);
55512e840b9SSeth Howell 
55612e840b9SSeth Howell 	leaf_9_23_15->offset = CACHE_TREE_LEVEL_SIZE(2) * 9 +
55712e840b9SSeth Howell 			       CACHE_TREE_LEVEL_SIZE(1) * 23 +
55812e840b9SSeth Howell 			       CACHE_BUFFER_SIZE * 15;
559bc0180f6SSeth Howell 	root = tree_insert_buffer(level1_0, leaf_9_23_15);
56012e840b9SSeth Howell 	CU_ASSERT(root != level1_0);
561bc0180f6SSeth Howell 	buffer = tree_find_buffer(root, leaf_9_23_15->offset);
56212e840b9SSeth Howell 	CU_ASSERT(buffer == leaf_9_23_15);
563bc0180f6SSeth Howell 	tree_free_buffers(root);
56412e840b9SSeth Howell 	free(root);
56512e840b9SSeth Howell }
56612e840b9SSeth Howell 
56712e840b9SSeth Howell static void
channel_ops(void)56812e840b9SSeth Howell channel_ops(void)
56912e840b9SSeth Howell {
57012e840b9SSeth Howell 	struct spdk_filesystem *fs;
57112e840b9SSeth Howell 	struct spdk_bs_dev *dev;
57212e840b9SSeth Howell 	struct spdk_io_channel *channel;
57312e840b9SSeth Howell 
57412e840b9SSeth Howell 	dev = init_dev();
57512e840b9SSeth Howell 
57612e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
5771914de09SChangpeng Liu 	fs_poll_threads();
57812e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
57912e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
58012e840b9SSeth Howell 	fs = g_fs;
581b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
58212e840b9SSeth Howell 
58312e840b9SSeth Howell 	channel =  spdk_fs_alloc_io_channel(fs);
58412e840b9SSeth Howell 	CU_ASSERT(channel != NULL);
58512e840b9SSeth Howell 
58612e840b9SSeth Howell 	spdk_fs_free_io_channel(channel);
58712e840b9SSeth Howell 
58812e840b9SSeth Howell 	g_fserrno = 1;
58912e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
5901914de09SChangpeng Liu 	fs_poll_threads();
59112e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
59212e840b9SSeth Howell 	g_fs = NULL;
59312e840b9SSeth Howell }
59412e840b9SSeth Howell 
59512e840b9SSeth Howell static void
channel_ops_sync(void)59612e840b9SSeth Howell channel_ops_sync(void)
59712e840b9SSeth Howell {
59812e840b9SSeth Howell 	struct spdk_filesystem *fs;
59912e840b9SSeth Howell 	struct spdk_bs_dev *dev;
600e9d400d5SBen Walker 	struct spdk_fs_thread_ctx *channel;
60112e840b9SSeth Howell 
60212e840b9SSeth Howell 	dev = init_dev();
60312e840b9SSeth Howell 
60412e840b9SSeth Howell 	spdk_fs_init(dev, NULL, NULL, fs_op_with_handle_complete, NULL);
6051914de09SChangpeng Liu 	fs_poll_threads();
60612e840b9SSeth Howell 	SPDK_CU_ASSERT_FATAL(g_fs != NULL);
60712e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
60812e840b9SSeth Howell 	fs = g_fs;
609b035e2b8SBen Walker 	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);
61012e840b9SSeth Howell 
611e9d400d5SBen Walker 	channel =  spdk_fs_alloc_thread_ctx(fs);
61212e840b9SSeth Howell 	CU_ASSERT(channel != NULL);
61312e840b9SSeth Howell 
614e9d400d5SBen Walker 	spdk_fs_free_thread_ctx(channel);
61512e840b9SSeth Howell 
61612e840b9SSeth Howell 	g_fserrno = 1;
61712e840b9SSeth Howell 	spdk_fs_unload(fs, fs_op_complete, NULL);
6181914de09SChangpeng Liu 	fs_poll_threads();
61912e840b9SSeth Howell 	CU_ASSERT(g_fserrno == 0);
62012e840b9SSeth Howell 	g_fs = NULL;
62112e840b9SSeth Howell }
62212e840b9SSeth Howell 
6238dd1cd21SBen Walker int
main(int argc,char ** argv)6248dd1cd21SBen Walker main(int argc, char **argv)
62512e840b9SSeth Howell {
62612e840b9SSeth Howell 	CU_pSuite	suite = NULL;
62712e840b9SSeth Howell 	unsigned int	num_failures;
62812e840b9SSeth Howell 
62978b696bcSVitaliy Mysak 	CU_initialize_registry();
63012e840b9SSeth Howell 
63112e840b9SSeth Howell 	suite = CU_add_suite("blobfs_async_ut", NULL, NULL);
63212e840b9SSeth Howell 
633dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_init);
634dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_open);
635dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_create);
636dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_truncate);
637dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_rename);
638dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_rw_async);
639dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, fs_writev_readv_async);
640dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, tree_find_buffer_ut);
641dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, channel_ops);
642dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, channel_ops_sync);
64312e840b9SSeth Howell 
644b035e2b8SBen Walker 	allocate_threads(1);
645b035e2b8SBen Walker 	set_thread(0);
64666e620d8SBen Walker 
64712e840b9SSeth Howell 	g_dev_buffer = calloc(1, DEV_BUFFER_SIZE);
648*ea941caeSKonrad Sztyber 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
64912e840b9SSeth Howell 	CU_cleanup_registry();
65012e840b9SSeth Howell 	free(g_dev_buffer);
651b035e2b8SBen Walker 
652b035e2b8SBen Walker 	free_threads();
653b035e2b8SBen Walker 
65412e840b9SSeth Howell 	return num_failures;
65512e840b9SSeth Howell }
656