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