Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3 : : */
4 : :
5 : : #include "spdk_internal/cunit.h"
6 : :
7 : : #include "common/lib/ut_multithread.c"
8 : : #include "unit/lib/json_mock.c"
9 : :
10 : : #include "spdk/config.h"
11 : :
12 : : #include "spdk/log.h"
13 : : #include "spdk/fsdev.h"
14 : : #include "spdk/fsdev_module.h"
15 : :
16 : : #define UT_UNIQUE 0xBEADBEAD
17 : : #define UT_FOBJECT ((struct spdk_fsdev_file_object *)0xDEADDEAD)
18 : : #define UT_FHANDLE ((struct spdk_fsdev_file_handle *)0xBEABBEAB)
19 : : #define UT_FNAME "ut_test.file"
20 : : #define UT_LNAME "ut_test.file.link"
21 : : #define UT_ANAME "xattr1.name"
22 : : #define UT_AVALUE "xattr1.val"
23 : : #define UT_NUM_LOOKUPS 11
24 : : #define UT_DATA_SIZE 22
25 : :
26 : :
27 : : #define UT_CALL_REC_MAX_CALLS 5
28 : : #define UT_CALL_REC_MAX_PARAMS 15
29 : : #define UT_CALL_REC_MAX_STR_SIZE 255
30 : :
31 : : #define UT_SUBMIT_IO_NUM_COMMON_PARAMS 4
32 : :
33 : : static uint64_t
34 : 198 : ut_hash(const void *buf, size_t size)
35 : : {
36 : 198 : uint64_t hash = 5381;
37 : 198 : const char *p = buf;
38 : : size_t i;
39 : :
40 [ + + ]: 16386 : for (i = 0; i < size; i++) {
41 : 16188 : hash = ((hash << 5) + hash) + (*p); /* hash * 33 + c */
42 : 16188 : p++;
43 : : }
44 : :
45 : 198 : return hash;
46 : : }
47 : :
48 : : struct ut_call_record {
49 : : struct {
50 : : void *func;
51 : : union {
52 : : uint64_t integer;
53 : : void *ptr;
54 : : char str[UT_CALL_REC_MAX_STR_SIZE + 1];
55 : : uint64_t hash;
56 : : } params[UT_CALL_REC_MAX_PARAMS];
57 : : size_t param_count;
58 : : } call[UT_CALL_REC_MAX_CALLS];
59 : : size_t count;
60 : : };
61 : :
62 : : static struct ut_call_record g_call_list;
63 : :
64 : : static inline void
65 : 348 : ut_calls_reset(void)
66 : : {
67 [ - + ]: 348 : memset(&g_call_list, 0, sizeof(g_call_list));
68 : 348 : }
69 : :
70 : : static inline void
71 : 687 : ut_call_record_begin(void *pfunc)
72 : : {
73 [ - + ]: 687 : SPDK_CU_ASSERT_FATAL(g_call_list.count < UT_CALL_REC_MAX_CALLS);
74 : 687 : g_call_list.call[g_call_list.count].func = pfunc;
75 : 687 : g_call_list.call[g_call_list.count].param_count = 0;
76 : 687 : }
77 : :
78 : : static inline void
79 : 354 : ut_call_record_param_int(uint64_t val)
80 : : {
81 [ - + ]: 354 : SPDK_CU_ASSERT_FATAL(g_call_list.call[g_call_list.count].param_count < UT_CALL_REC_MAX_PARAMS);
82 : 354 : g_call_list.call[g_call_list.count].params[g_call_list.call[g_call_list.count].param_count].integer
83 : 354 : = val;
84 : 354 : g_call_list.call[g_call_list.count].param_count++;
85 : 354 : }
86 : :
87 : : static inline void
88 : 966 : ut_call_record_param_ptr(void *ptr)
89 : : {
90 [ - + ]: 966 : SPDK_CU_ASSERT_FATAL(g_call_list.call[g_call_list.count].param_count < UT_CALL_REC_MAX_PARAMS);
91 : 966 : g_call_list.call[g_call_list.count].params[g_call_list.call[g_call_list.count].param_count].ptr =
92 : : ptr;
93 : 966 : g_call_list.call[g_call_list.count].param_count++;
94 : 966 : }
95 : :
96 : : static inline void
97 : 48 : ut_call_record_param_str(const char *str)
98 : : {
99 [ - + ]: 48 : SPDK_CU_ASSERT_FATAL(g_call_list.call[g_call_list.count].param_count < UT_CALL_REC_MAX_PARAMS);
100 : 48 : spdk_strcpy_pad(
101 : 48 : g_call_list.call[g_call_list.count].params[g_call_list.call[g_call_list.count].param_count].str,
102 : : str, UT_CALL_REC_MAX_STR_SIZE, 0);
103 : 48 : g_call_list.call[g_call_list.count].params[g_call_list.call[g_call_list.count].param_count].str[UT_CALL_REC_MAX_STR_SIZE]
104 : 48 : = 0;
105 : 48 : g_call_list.call[g_call_list.count].param_count++;
106 : 48 : }
107 : :
108 : : static inline void
109 : 15 : ut_call_record_param_hash(const void *buf, size_t size)
110 : : {
111 [ - + ]: 15 : SPDK_CU_ASSERT_FATAL(g_call_list.call[g_call_list.count].param_count < UT_CALL_REC_MAX_PARAMS);
112 : 30 : g_call_list.call[g_call_list.count].params[g_call_list.call[g_call_list.count].param_count].hash =
113 : 15 : ut_hash(buf, size);
114 : 15 : g_call_list.call[g_call_list.count].param_count++;
115 : 15 : }
116 : :
117 : : static inline size_t
118 : 111 : ut_call_record_get_current_param_count(void)
119 : : {
120 : 111 : return g_call_list.call[g_call_list.count].param_count;
121 : : }
122 : : static inline void
123 : 687 : ut_call_record_end(void)
124 : : {
125 : 687 : g_call_list.count++;
126 : 687 : }
127 : :
128 : : static inline void
129 : 576 : ut_call_record_simple_param_ptr(void *pfunc, void *ptr)
130 : : {
131 : 576 : ut_call_record_begin(pfunc);
132 : 576 : ut_call_record_param_ptr(ptr);
133 : 576 : ut_call_record_end();
134 : 576 : }
135 : :
136 : : static inline size_t
137 : 234 : ut_calls_get_call_count(void)
138 : : {
139 : 234 : return g_call_list.count;
140 : : }
141 : :
142 : : static inline size_t
143 : 354 : ut_calls_get_param_count(size_t call_idx)
144 : : {
145 [ - + ]: 354 : SPDK_CU_ASSERT_FATAL(call_idx < g_call_list.count);
146 : 354 : return g_call_list.call[call_idx].param_count;
147 : : }
148 : :
149 : : static inline void *
150 : 354 : ut_calls_get_func(size_t call_idx)
151 : : {
152 [ - + ]: 354 : SPDK_CU_ASSERT_FATAL(call_idx < g_call_list.count);
153 : 354 : return g_call_list.call[call_idx].func;
154 : : }
155 : :
156 : : static inline uint64_t
157 : 360 : ut_calls_param_get_int(size_t call_idx, size_t param_idx)
158 : : {
159 [ - + ]: 360 : SPDK_CU_ASSERT_FATAL(call_idx < g_call_list.count);
160 [ - + ]: 360 : SPDK_CU_ASSERT_FATAL(param_idx < g_call_list.call[call_idx].param_count);
161 : 360 : return g_call_list.call[call_idx].params[param_idx].integer;
162 : : }
163 : :
164 : : static inline void *
165 : 627 : ut_calls_param_get_ptr(size_t call_idx, size_t param_idx)
166 : : {
167 [ - + ]: 627 : SPDK_CU_ASSERT_FATAL(call_idx < g_call_list.count);
168 [ - + ]: 627 : SPDK_CU_ASSERT_FATAL(param_idx < g_call_list.call[call_idx].param_count);
169 : 627 : return g_call_list.call[call_idx].params[param_idx].ptr;
170 : : }
171 : :
172 : : static inline const char *
173 : 48 : ut_calls_param_get_str(size_t call_idx, size_t param_idx)
174 : : {
175 [ - + ]: 48 : SPDK_CU_ASSERT_FATAL(call_idx < g_call_list.count);
176 [ - + ]: 48 : SPDK_CU_ASSERT_FATAL(param_idx < g_call_list.call[call_idx].param_count);
177 : 48 : return g_call_list.call[call_idx].params[param_idx].str;
178 : : }
179 : :
180 : : static inline uint64_t
181 : 15 : ut_calls_param_get_hash(size_t call_idx, size_t param_idx)
182 : : {
183 [ - + ]: 15 : SPDK_CU_ASSERT_FATAL(call_idx < g_call_list.count);
184 [ - + ]: 15 : SPDK_CU_ASSERT_FATAL(param_idx < g_call_list.call[call_idx].param_count);
185 : 15 : return g_call_list.call[call_idx].params[param_idx].hash;
186 : : }
187 : :
188 : : struct ut_fsdev {
189 : : struct spdk_fsdev fsdev;
190 : : int desired_io_status;
191 : : };
192 : :
193 : : struct ut_io_channel {
194 : : int reserved;
195 : : };
196 : :
197 : : struct spdk_fsdev_file_object {
198 : : int reserved;
199 : : };
200 : :
201 : : struct spdk_fsdev_file_handle {
202 : : int reserved;
203 : : };
204 : :
205 : : static inline struct ut_fsdev *
206 : 111 : fsdev_to_ut_fsdev(struct spdk_fsdev *fsdev)
207 : : {
208 : 111 : return SPDK_CONTAINEROF(fsdev, struct ut_fsdev, fsdev);
209 : : }
210 : :
211 : : static struct ut_io_channel *g_ut_io_channel = NULL;
212 : :
213 : : static int
214 : 114 : ut_fsdev_io_channel_create_cb(void *io_device, void *ctx_buf)
215 : : {
216 : 114 : struct ut_io_channel *ch = ctx_buf;
217 : :
218 : 114 : g_ut_io_channel = ch;
219 : :
220 : 114 : ut_call_record_simple_param_ptr(ut_fsdev_io_channel_create_cb, ctx_buf);
221 : :
222 : 114 : return 0;
223 : : }
224 : :
225 : : static void
226 : 114 : ut_fsdev_io_channel_destroy_cb(void *io_device, void *ctx_buf)
227 : : {
228 : 114 : g_ut_io_channel = NULL;
229 : :
230 : 114 : ut_call_record_simple_param_ptr(ut_fsdev_io_channel_destroy_cb, ctx_buf);
231 : 114 : }
232 : :
233 : : static int
234 : 3 : ut_fsdev_initialize(void)
235 : : {
236 : 3 : spdk_io_device_register(&g_call_list,
237 : : ut_fsdev_io_channel_create_cb, ut_fsdev_io_channel_destroy_cb,
238 : : sizeof(struct ut_io_channel), "ut_fsdev");
239 : :
240 : 3 : return 0;
241 : : }
242 : :
243 : : static void
244 : 3 : ut_fsdev_io_device_unregister_done(void *io_device)
245 : : {
246 : 3 : SPDK_NOTICELOG("ut_fsdev_io_device unregistred\n");
247 : 3 : }
248 : :
249 : : static void
250 : 3 : ut_fsdev_finish(void)
251 : : {
252 : 3 : spdk_io_device_unregister(&g_call_list, ut_fsdev_io_device_unregister_done);
253 : 3 : }
254 : :
255 : : static int
256 : 3 : ut_fsdev_get_ctx_size(void)
257 : : {
258 : 3 : return 0;
259 : : }
260 : :
261 : : static struct spdk_fsdev_module ut_fsdev_module = {
262 : : .name = "ut_fsdev",
263 : : .module_init = ut_fsdev_initialize,
264 : : .module_fini = ut_fsdev_finish,
265 : : .get_ctx_size = ut_fsdev_get_ctx_size,
266 : : };
267 : :
268 : 3 : SPDK_FSDEV_MODULE_REGISTER(ut_fsdev, &ut_fsdev_module);
269 : :
270 : : static int
271 : 117 : ut_fsdev_destruct(void *ctx)
272 : : {
273 : 117 : ut_call_record_simple_param_ptr(ut_fsdev_destruct, ctx);
274 : :
275 : 117 : return 0;
276 : : }
277 : :
278 : : static struct spdk_fsdev_file_attr ut_fsdev_attr;
279 : : static struct spdk_fsdev_file_object ut_fsdev_fobject;
280 : : static struct iovec ut_iov[5];
281 : : static struct spdk_fsdev_file_statfs ut_statfs;
282 : : static char ut_buff[1024];
283 : : static bool ut_listxattr_size_only;
284 : : static uint64_t ut_readdir_offset;
285 : : static uint64_t ut_readdir_num_entries;
286 : : static uint64_t ut_readdir_num_entry_cb_calls;
287 : : static struct spdk_fsdev_mount_opts ut_mount_opts;
288 : :
289 : : static void
290 : 111 : ut_fsdev_submit_request(struct spdk_io_channel *_ch, struct spdk_fsdev_io *fsdev_io)
291 : : {
292 : 111 : enum spdk_fsdev_io_type type = spdk_fsdev_io_get_type(fsdev_io);
293 : 111 : struct ut_fsdev *utfsdev = fsdev_to_ut_fsdev(fsdev_io->fsdev);
294 : 111 : struct ut_io_channel *ch = spdk_io_channel_get_ctx(_ch);
295 : 111 : uint64_t unique = spdk_fsdev_io_get_unique(fsdev_io);
296 : 111 : int res, i = 0;
297 : :
298 : 111 : CU_ASSERT(type >= 0 && type < __SPDK_FSDEV_IO_LAST);
299 : :
300 : 111 : ut_call_record_begin(ut_fsdev_submit_request);
301 : :
302 : : /* Common params */
303 : 111 : ut_call_record_param_int(type);
304 : : /* There's no unique for abort so we just add UT_UNIQUE to pass the test */
305 [ + + ]: 111 : ut_call_record_param_int((type != SPDK_FSDEV_IO_ABORT) ? unique : UT_UNIQUE);
306 : 111 : ut_call_record_param_ptr(ch);
307 : 111 : ut_call_record_param_ptr(utfsdev);
308 : :
309 : 111 : CU_ASSERT(ut_call_record_get_current_param_count() == UT_SUBMIT_IO_NUM_COMMON_PARAMS);
310 : :
311 [ + + + + : 111 : switch (type) {
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ ]
312 : 6 : case SPDK_FSDEV_IO_MOUNT:
313 : 6 : ut_call_record_param_hash(&fsdev_io->u_in.mount.opts, sizeof(fsdev_io->u_in.mount.opts));
314 : 6 : fsdev_io->u_out.mount.root_fobject = UT_FOBJECT;
315 : 6 : fsdev_io->u_out.mount.opts.opts_size = fsdev_io->u_in.mount.opts.opts_size;
316 : 6 : fsdev_io->u_out.mount.opts.max_write = fsdev_io->u_in.mount.opts.max_write / 2;
317 : 6 : fsdev_io->u_out.mount.opts.writeback_cache_enabled =
318 : 6 : !fsdev_io->u_in.mount.opts.writeback_cache_enabled;
319 : 6 : break;
320 : 6 : case SPDK_FSDEV_IO_LOOKUP:
321 : 6 : ut_call_record_param_str(fsdev_io->u_in.lookup.name);
322 : 6 : ut_call_record_param_ptr(fsdev_io->u_in.lookup.parent_fobject);
323 : 6 : fsdev_io->u_out.lookup.fobject = &ut_fsdev_fobject;
324 : 6 : fsdev_io->u_out.lookup.attr = ut_fsdev_attr;
325 : 6 : break;
326 : 3 : case SPDK_FSDEV_IO_FORGET:
327 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.forget.fobject);
328 : 3 : ut_call_record_param_int(fsdev_io->u_in.forget.nlookup);
329 : 3 : break;
330 : 3 : case SPDK_FSDEV_IO_GETATTR:
331 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.getattr.fobject);
332 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.getattr.fhandle);
333 : 3 : fsdev_io->u_out.getattr.attr = ut_fsdev_attr;
334 : 3 : break;
335 : 3 : case SPDK_FSDEV_IO_SETATTR:
336 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.setattr.fobject);
337 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.setattr.fhandle);
338 : 3 : ut_call_record_param_hash(&fsdev_io->u_in.setattr.attr, sizeof(fsdev_io->u_in.setattr.attr));
339 : 3 : ut_call_record_param_int(fsdev_io->u_in.setattr.to_set);
340 : 3 : fsdev_io->u_out.getattr.attr = ut_fsdev_attr;
341 : 3 : break;
342 : 3 : case SPDK_FSDEV_IO_READLINK:
343 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.readlink.fobject);
344 [ - + ]: 3 : fsdev_io->u_out.readlink.linkname = strdup(UT_FNAME);
345 [ - + ]: 3 : SPDK_CU_ASSERT_FATAL(fsdev_io->u_out.readlink.linkname != NULL);
346 : 3 : break;
347 : 3 : case SPDK_FSDEV_IO_SYMLINK:
348 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.symlink.parent_fobject);
349 : 3 : ut_call_record_param_str(fsdev_io->u_in.symlink.target);
350 : 3 : ut_call_record_param_str(fsdev_io->u_in.symlink.linkpath);
351 : 3 : ut_call_record_param_int(fsdev_io->u_in.symlink.euid);
352 : 3 : ut_call_record_param_int(fsdev_io->u_in.symlink.egid);
353 : 3 : fsdev_io->u_out.symlink.fobject = UT_FOBJECT + 1;
354 : 3 : fsdev_io->u_out.symlink.attr = ut_fsdev_attr;
355 : 3 : break;
356 : 3 : case SPDK_FSDEV_IO_MKNOD:
357 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.mknod.parent_fobject);
358 : 3 : ut_call_record_param_str(fsdev_io->u_in.mknod.name);
359 : 3 : ut_call_record_param_int(fsdev_io->u_in.mknod.mode);
360 : 3 : ut_call_record_param_int(fsdev_io->u_in.mknod.rdev);
361 : 3 : ut_call_record_param_int(fsdev_io->u_in.mknod.euid);
362 : 3 : ut_call_record_param_int(fsdev_io->u_in.mknod.egid);
363 : 3 : fsdev_io->u_out.mknod.fobject = UT_FOBJECT + 1;
364 : 3 : fsdev_io->u_out.mknod.attr = ut_fsdev_attr;
365 : 3 : break;
366 : 3 : case SPDK_FSDEV_IO_MKDIR:
367 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.mkdir.parent_fobject);
368 : 3 : ut_call_record_param_str(fsdev_io->u_in.mkdir.name);
369 : 3 : ut_call_record_param_int(fsdev_io->u_in.mkdir.mode);
370 : 3 : ut_call_record_param_int(fsdev_io->u_in.mkdir.euid);
371 : 3 : ut_call_record_param_int(fsdev_io->u_in.mkdir.egid);
372 : 3 : fsdev_io->u_out.mkdir.fobject = UT_FOBJECT + 1;
373 : 3 : fsdev_io->u_out.mkdir.attr = ut_fsdev_attr;
374 : 3 : break;
375 : 3 : case SPDK_FSDEV_IO_UNLINK:
376 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.unlink.parent_fobject);
377 : 3 : ut_call_record_param_str(fsdev_io->u_in.unlink.name);
378 : 3 : break;
379 : 3 : case SPDK_FSDEV_IO_RMDIR:
380 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.rmdir.parent_fobject);
381 : 3 : ut_call_record_param_str(fsdev_io->u_in.rmdir.name);
382 : 3 : break;
383 : 3 : case SPDK_FSDEV_IO_RENAME:
384 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.rename.parent_fobject);
385 : 3 : ut_call_record_param_str(fsdev_io->u_in.rename.name);
386 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.rename.new_parent_fobject);
387 : 3 : ut_call_record_param_str(fsdev_io->u_in.rename.new_name);
388 : 3 : ut_call_record_param_int(fsdev_io->u_in.rename.flags);
389 : 3 : break;
390 : 3 : case SPDK_FSDEV_IO_LINK:
391 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.link.fobject);
392 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.link.new_parent_fobject);
393 : 3 : ut_call_record_param_str(fsdev_io->u_in.link.name);
394 : 3 : fsdev_io->u_out.link.fobject = UT_FOBJECT + 1;
395 : 3 : fsdev_io->u_out.link.attr = ut_fsdev_attr;
396 : 3 : break;
397 : 3 : case SPDK_FSDEV_IO_OPEN:
398 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.open.fobject);
399 : 3 : ut_call_record_param_int(fsdev_io->u_in.open.flags);
400 : 3 : fsdev_io->u_out.open.fhandle = UT_FHANDLE;
401 : 3 : break;
402 : 3 : case SPDK_FSDEV_IO_READ:
403 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.read.fobject);
404 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.read.fhandle);
405 : 3 : ut_call_record_param_int(fsdev_io->u_in.read.size);
406 : 3 : ut_call_record_param_int(fsdev_io->u_in.read.offs);
407 : 3 : ut_call_record_param_int(fsdev_io->u_in.read.flags);
408 : 3 : ut_call_record_param_hash(fsdev_io->u_in.read.iov,
409 : 3 : fsdev_io->u_in.read.iovcnt * sizeof(fsdev_io->u_in.read.iov[0]));
410 : 3 : ut_call_record_param_int(fsdev_io->u_in.read.iovcnt);
411 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.read.opts);
412 : 3 : fsdev_io->u_out.read.data_size = UT_DATA_SIZE;
413 : 3 : break;
414 : 3 : case SPDK_FSDEV_IO_WRITE:
415 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.write.fobject);
416 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.write.fhandle);
417 : 3 : ut_call_record_param_int(fsdev_io->u_in.write.size);
418 : 3 : ut_call_record_param_int(fsdev_io->u_in.write.offs);
419 : 3 : ut_call_record_param_int(fsdev_io->u_in.write.flags);
420 : 3 : ut_call_record_param_hash(fsdev_io->u_in.write.iov,
421 : 3 : fsdev_io->u_in.write.iovcnt * sizeof(fsdev_io->u_in.write.iov[0]));
422 : 3 : ut_call_record_param_int(fsdev_io->u_in.write.iovcnt);
423 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.write.opts);
424 : 3 : fsdev_io->u_out.write.data_size = UT_DATA_SIZE;
425 : 3 : break;
426 : 3 : case SPDK_FSDEV_IO_STATFS:
427 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.statfs.fobject);
428 : 3 : fsdev_io->u_out.statfs.statfs = ut_statfs;
429 : 3 : break;
430 : 3 : case SPDK_FSDEV_IO_RELEASE:
431 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.release.fobject);
432 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.release.fhandle);
433 : 3 : break;
434 : 3 : case SPDK_FSDEV_IO_FSYNC:
435 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.fsync.fobject);
436 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.fsync.fhandle);
437 [ - + ]: 3 : ut_call_record_param_int(fsdev_io->u_in.fsync.datasync);
438 : 3 : break;
439 : 3 : case SPDK_FSDEV_IO_SETXATTR:
440 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.setxattr.fobject);
441 : 3 : ut_call_record_param_str(fsdev_io->u_in.setxattr.name);
442 : 3 : ut_call_record_param_str(fsdev_io->u_in.setxattr.value);
443 : 3 : ut_call_record_param_int(fsdev_io->u_in.setxattr.size);
444 : 3 : ut_call_record_param_int(fsdev_io->u_in.setxattr.flags);
445 : 3 : break;
446 : 3 : case SPDK_FSDEV_IO_GETXATTR:
447 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.getxattr.fobject);
448 : 3 : ut_call_record_param_str(fsdev_io->u_in.getxattr.name);
449 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.getxattr.buffer);
450 : 3 : ut_call_record_param_int(fsdev_io->u_in.getxattr.size);
451 : 3 : spdk_strcpy_pad(fsdev_io->u_in.getxattr.buffer, UT_AVALUE,
452 : 3 : fsdev_io->u_in.getxattr.size - 1, 0);
453 : 3 : fsdev_io->u_out.getxattr.value_size = sizeof(UT_AVALUE);
454 : 3 : break;
455 : 6 : case SPDK_FSDEV_IO_LISTXATTR:
456 : 6 : ut_call_record_param_ptr(fsdev_io->u_in.listxattr.fobject);
457 : 6 : ut_call_record_param_ptr(fsdev_io->u_in.listxattr.buffer);
458 : 6 : ut_call_record_param_int(fsdev_io->u_in.listxattr.size);
459 : :
460 : 6 : fsdev_io->u_out.listxattr.size_only = fsdev_io->u_in.listxattr.buffer == NULL;
461 : 6 : fsdev_io->u_out.listxattr.data_size = (sizeof(ut_buff) / sizeof(UT_ANAME)) * sizeof(UT_ANAME);
462 : :
463 [ + + + + ]: 6 : if (!fsdev_io->u_out.listxattr.size_only) {
464 : 3 : size_t size = fsdev_io->u_in.listxattr.size;
465 : 3 : char *p = fsdev_io->u_in.listxattr.buffer;
466 : :
467 [ + + ]: 258 : while (size >= sizeof(UT_ANAME)) {
468 [ - + - + ]: 255 : memcpy(p, UT_ANAME, sizeof(UT_ANAME));
469 : 255 : p += sizeof(UT_ANAME);
470 : 255 : size -= sizeof(UT_ANAME);
471 : : }
472 : : }
473 : 6 : break;
474 : 3 : case SPDK_FSDEV_IO_REMOVEXATTR:
475 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.removexattr.fobject);
476 : 3 : ut_call_record_param_str(fsdev_io->u_in.removexattr.name);
477 : 3 : break;
478 : 3 : case SPDK_FSDEV_IO_FLUSH:
479 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.flush.fobject);
480 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.flush.fhandle);
481 : 3 : break;
482 : 3 : case SPDK_FSDEV_IO_OPENDIR:
483 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.opendir.fobject);
484 : 3 : ut_call_record_param_int(fsdev_io->u_in.opendir.flags);
485 : 3 : fsdev_io->u_out.opendir.fhandle = UT_FHANDLE;
486 : 3 : break;
487 : 3 : case SPDK_FSDEV_IO_READDIR:
488 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.readdir.fobject);
489 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.readdir.fhandle);
490 : 3 : ut_call_record_param_int(fsdev_io->u_in.readdir.offset);
491 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.readdir.usr_entry_cb_fn);
492 : :
493 : : do {
494 : 60 : fsdev_io->u_out.readdir.fobject = UT_FOBJECT + i;
495 : 60 : fsdev_io->u_out.readdir.attr = ut_fsdev_attr;
496 : 60 : fsdev_io->u_out.readdir.name = UT_FNAME;
497 : 60 : fsdev_io->u_out.readdir.offset = ut_readdir_offset + i;
498 : 60 : res = fsdev_io->u_in.readdir.entry_cb_fn(fsdev_io, fsdev_io->internal.cb_arg);
499 : 60 : i++;
500 [ + + ]: 60 : } while (!res);
501 : :
502 : 3 : break;
503 : 3 : case SPDK_FSDEV_IO_RELEASEDIR:
504 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.releasedir.fobject);
505 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.releasedir.fhandle);
506 : 3 : break;
507 : 3 : case SPDK_FSDEV_IO_FSYNCDIR:
508 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.fsyncdir.fobject);
509 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.fsyncdir.fhandle);
510 [ - + ]: 3 : ut_call_record_param_int(fsdev_io->u_in.fsyncdir.datasync);
511 : 3 : break;
512 : 3 : case SPDK_FSDEV_IO_FLOCK:
513 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.flock.fobject);
514 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.flock.fhandle);
515 : 3 : ut_call_record_param_int(fsdev_io->u_in.flock.operation);
516 : 3 : break;
517 : 3 : case SPDK_FSDEV_IO_CREATE:
518 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.create.parent_fobject);
519 : 3 : ut_call_record_param_str(fsdev_io->u_in.create.name);
520 : 3 : ut_call_record_param_int(fsdev_io->u_in.create.mode);
521 : 3 : ut_call_record_param_int(fsdev_io->u_in.create.flags);
522 : 3 : ut_call_record_param_int(fsdev_io->u_in.create.umask);
523 : 3 : ut_call_record_param_int(fsdev_io->u_in.create.euid);
524 : 3 : ut_call_record_param_int(fsdev_io->u_in.create.egid);
525 : 3 : fsdev_io->u_out.create.fobject = UT_FOBJECT + 1;
526 : 3 : fsdev_io->u_out.create.fhandle = UT_FHANDLE;
527 : 3 : fsdev_io->u_out.create.attr = ut_fsdev_attr;
528 : 3 : break;
529 : 3 : case SPDK_FSDEV_IO_ABORT:
530 : 3 : ut_call_record_param_int(fsdev_io->u_in.abort.unique_to_abort);
531 : 3 : break;
532 : 3 : case SPDK_FSDEV_IO_FALLOCATE:
533 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.fallocate.fobject);
534 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.fallocate.fhandle);
535 : 3 : ut_call_record_param_int(fsdev_io->u_in.fallocate.mode);
536 : 3 : ut_call_record_param_int(fsdev_io->u_in.fallocate.offset);
537 : 3 : ut_call_record_param_int(fsdev_io->u_in.fallocate.length);
538 : 3 : break;
539 : 3 : case SPDK_FSDEV_IO_COPY_FILE_RANGE:
540 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.copy_file_range.fobject_in);
541 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.copy_file_range.fhandle_in);
542 : 3 : ut_call_record_param_int(fsdev_io->u_in.copy_file_range.off_in);
543 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.copy_file_range.fobject_out);
544 : 3 : ut_call_record_param_ptr(fsdev_io->u_in.copy_file_range.fhandle_out);
545 : 3 : ut_call_record_param_int(fsdev_io->u_in.copy_file_range.off_out);
546 : 3 : ut_call_record_param_int(fsdev_io->u_in.copy_file_range.len);
547 : 3 : ut_call_record_param_int(fsdev_io->u_in.copy_file_range.flags);
548 : 3 : fsdev_io->u_out.copy_file_range.data_size = UT_DATA_SIZE;
549 : 3 : break;
550 : 3 : case __SPDK_FSDEV_IO_LAST:
551 : : default:
552 : 3 : break;
553 : : }
554 : :
555 : 111 : ut_call_record_end();
556 : :
557 : 111 : spdk_fsdev_io_complete(fsdev_io, utfsdev->desired_io_status);
558 : 111 : }
559 : :
560 : : static struct spdk_io_channel *
561 : 114 : ut_fsdev_get_io_channel(void *ctx)
562 : : {
563 : 114 : ut_call_record_simple_param_ptr(ut_fsdev_get_io_channel, ctx);
564 : :
565 : 114 : return spdk_get_io_channel(&g_call_list);
566 : : }
567 : :
568 : : static void
569 : 0 : ut_fsdev_write_config_json(struct spdk_fsdev *fsdev, struct spdk_json_write_ctx *w)
570 : : {
571 : :
572 : 0 : }
573 : :
574 : : static int
575 : 0 : ut_fsdev_get_memory_domains(void *ctx, struct spdk_memory_domain **domains,
576 : : int array_size)
577 : : {
578 : 0 : return 0;
579 : : }
580 : :
581 : : static const struct spdk_fsdev_fn_table ut_fdev_fn_table = {
582 : : .destruct = ut_fsdev_destruct,
583 : : .submit_request = ut_fsdev_submit_request,
584 : : .get_io_channel = ut_fsdev_get_io_channel,
585 : : .write_config_json = ut_fsdev_write_config_json,
586 : : .get_memory_domains = ut_fsdev_get_memory_domains,
587 : : };
588 : :
589 : : static void
590 : 117 : ut_fsdev_free(struct ut_fsdev *ufsdev)
591 : : {
592 : 117 : free(ufsdev->fsdev.name);
593 : 117 : free(ufsdev);
594 : 117 : }
595 : :
596 : : static void
597 : 117 : ut_fsdev_unregister_done(void *cb_arg, int rc)
598 : : {
599 : 117 : struct ut_fsdev *ufsdev = cb_arg;
600 : :
601 : 117 : ut_call_record_simple_param_ptr(ut_fsdev_unregister_done, cb_arg);
602 : :
603 : 117 : ut_fsdev_free(ufsdev);
604 : 117 : }
605 : :
606 : : static void
607 : 117 : ut_fsdev_destroy(struct ut_fsdev *utfsdev)
608 : : {
609 : 117 : ut_calls_reset();
610 : 117 : spdk_fsdev_unregister(&utfsdev->fsdev, ut_fsdev_unregister_done, utfsdev);
611 : 117 : poll_thread(0);
612 : :
613 : 117 : CU_ASSERT(ut_calls_get_call_count() == 2);
614 : :
615 : 117 : CU_ASSERT(ut_calls_get_func(0) == ut_fsdev_destruct);
616 : 117 : CU_ASSERT(ut_calls_get_param_count(0) == 1);
617 : 117 : CU_ASSERT(ut_calls_param_get_ptr(0, 0) == utfsdev);
618 : :
619 : 117 : CU_ASSERT(ut_calls_get_func(1) == ut_fsdev_unregister_done);
620 : 117 : CU_ASSERT(ut_calls_get_param_count(1) == 1);
621 : 117 : CU_ASSERT(ut_calls_param_get_ptr(1, 0) == utfsdev);
622 : 117 : }
623 : :
624 : : static struct ut_fsdev *
625 : 117 : ut_fsdev_create(const char *name)
626 : : {
627 : : struct ut_fsdev *ufsdev;
628 : : int rc;
629 : :
630 : 117 : ufsdev = calloc(1, sizeof(*ufsdev));
631 [ - + ]: 117 : if (!ufsdev) {
632 : 0 : SPDK_ERRLOG("Could not allocate ut_fsdev\n");
633 : 0 : return NULL;
634 : : }
635 : :
636 [ - + ]: 117 : ufsdev->fsdev.name = strdup(name);
637 [ - + ]: 117 : if (!ufsdev->fsdev.name) {
638 : 0 : SPDK_ERRLOG("Could not strdup name %s\n", name);
639 : 0 : free(ufsdev);
640 : 0 : return NULL;
641 : : }
642 : :
643 : 117 : ufsdev->fsdev.ctxt = ufsdev;
644 : 117 : ufsdev->fsdev.fn_table = &ut_fdev_fn_table;
645 : 117 : ufsdev->fsdev.module = &ut_fsdev_module;
646 : :
647 : 117 : rc = spdk_fsdev_register(&ufsdev->fsdev);
648 [ - + ]: 117 : if (rc) {
649 : 0 : ut_fsdev_free(ufsdev);
650 : 0 : return NULL;
651 : : }
652 : :
653 : 117 : return ufsdev;
654 : : }
655 : :
656 : : static void
657 : 3 : ut_fsdev_initialize_complete(void *cb_arg, int rc)
658 : : {
659 : 3 : bool *completed = cb_arg;
660 : :
661 : 3 : *completed = true;
662 : 3 : }
663 : :
664 : : static int
665 : 3 : ut_fsdev_setup(void)
666 : : {
667 : 3 : bool completed = false;
668 : :
669 : 3 : spdk_fsdev_initialize(ut_fsdev_initialize_complete, &completed);
670 : :
671 : 3 : poll_thread(0);
672 : :
673 [ - + - + ]: 3 : if (!completed) {
674 : 0 : SPDK_ERRLOG("No spdk_fsdev_initialize callback arrived\n");
675 : 0 : return EINVAL;
676 : : }
677 : :
678 : 3 : return 0;
679 : : }
680 : :
681 : : static void
682 : 3 : ut_fsdev_teardown_complete(void *cb_arg)
683 : : {
684 : 3 : bool *completed = cb_arg;
685 : :
686 : 3 : *completed = true;
687 : 3 : }
688 : :
689 : : static int
690 : 3 : ut_fsdev_teardown(void)
691 : : {
692 : 3 : bool completed = false;
693 : 3 : spdk_fsdev_finish(ut_fsdev_teardown_complete, &completed);
694 : :
695 : 3 : poll_thread(0);
696 : :
697 [ - + - + ]: 3 : if (!completed) {
698 : 0 : SPDK_ERRLOG("No spdk_fsdev_finish callback arrived\n");
699 : 0 : return EINVAL;
700 : : }
701 : :
702 : 3 : return 0;
703 : : }
704 : :
705 : : static void
706 : 0 : fsdev_event_cb(enum spdk_fsdev_event_type type, struct spdk_fsdev *fsdev,
707 : : void *event_ctx)
708 : : {
709 : 0 : SPDK_NOTICELOG("Unsupported bdev event: type %d\n", type);
710 : 0 : }
711 : :
712 : : static void
713 : 3 : ut_fsdev_test_open_close(void)
714 : : {
715 : : struct ut_fsdev *utfsdev;
716 : 3 : struct spdk_fsdev_desc *fsdev_desc;
717 : : int rc;
718 : :
719 : 3 : utfsdev = ut_fsdev_create("utfsdev0");
720 : 3 : CU_ASSERT(utfsdev != NULL);
721 : :
722 [ - + - + ]: 3 : CU_ASSERT(!strcmp(spdk_fsdev_get_module_name(&utfsdev->fsdev), ut_fsdev_module.name));
723 [ - + ]: 3 : CU_ASSERT(!strcmp(spdk_fsdev_get_name(&utfsdev->fsdev), "utfsdev0"));
724 : :
725 : 3 : ut_calls_reset();
726 : 3 : rc = spdk_fsdev_open("utfsdev0", fsdev_event_cb, NULL, &fsdev_desc);
727 : 3 : CU_ASSERT(rc == 0);
728 : 3 : CU_ASSERT(fsdev_desc != NULL);
729 : 3 : CU_ASSERT(spdk_fsdev_desc_get_fsdev(fsdev_desc) == &utfsdev->fsdev);
730 : :
731 [ + - ]: 3 : if (fsdev_desc) {
732 : 3 : spdk_fsdev_close(fsdev_desc);
733 : : }
734 : :
735 : 3 : ut_fsdev_destroy(utfsdev);
736 : 3 : }
737 : :
738 : : static void
739 : 3 : ut_fsdev_test_set_opts(void)
740 : : {
741 : 3 : struct spdk_fsdev_opts old_opts;
742 : 3 : struct spdk_fsdev_opts new_opts;
743 : : int rc;
744 : :
745 : 3 : rc = spdk_fsdev_set_opts(NULL);
746 : 3 : CU_ASSERT(rc == -EINVAL);
747 : :
748 : 3 : new_opts.opts_size = 0;
749 : 3 : rc = spdk_fsdev_set_opts(&new_opts);
750 : 3 : CU_ASSERT(rc == -EINVAL);
751 : :
752 : 3 : old_opts.opts_size = sizeof(old_opts);
753 : 3 : rc = spdk_fsdev_get_opts(&old_opts, sizeof(old_opts));
754 : 3 : CU_ASSERT(rc == 0);
755 : :
756 : 3 : new_opts.opts_size = sizeof(new_opts);
757 : 3 : new_opts.fsdev_io_pool_size = old_opts.fsdev_io_pool_size * 2;
758 : 3 : new_opts.fsdev_io_cache_size = old_opts.fsdev_io_cache_size * 2;
759 : 3 : rc = spdk_fsdev_set_opts(&new_opts);
760 : 3 : CU_ASSERT(rc == 0);
761 : :
762 : 3 : rc = spdk_fsdev_get_opts(&new_opts, sizeof(new_opts));
763 : 3 : CU_ASSERT(rc == 0);
764 : 3 : CU_ASSERT(old_opts.fsdev_io_pool_size * 2 == new_opts.fsdev_io_pool_size);
765 : 3 : CU_ASSERT(old_opts.fsdev_io_cache_size * 2 == new_opts.fsdev_io_cache_size);
766 : 3 : }
767 : :
768 : : static void
769 : 3 : ut_fsdev_test_get_io_channel(void)
770 : : {
771 : : struct ut_fsdev *utfsdev;
772 : : struct spdk_io_channel *ch;
773 : 3 : struct spdk_fsdev_desc *fsdev_desc;
774 : : struct ut_io_channel *ut_ch;
775 : : int rc;
776 : :
777 : 3 : utfsdev = ut_fsdev_create("utfsdev0");
778 : 3 : CU_ASSERT(utfsdev != NULL);
779 : :
780 : 3 : rc = spdk_fsdev_open("utfsdev0", fsdev_event_cb, NULL, &fsdev_desc);
781 : 3 : CU_ASSERT(rc == 0);
782 : 3 : CU_ASSERT(fsdev_desc != NULL);
783 : 3 : CU_ASSERT(spdk_fsdev_desc_get_fsdev(fsdev_desc) == &utfsdev->fsdev);
784 : :
785 : 3 : ut_calls_reset();
786 : 3 : ch = spdk_fsdev_get_io_channel(fsdev_desc);
787 : 3 : CU_ASSERT(ch != NULL);
788 : 3 : CU_ASSERT(ut_calls_get_call_count() == 2);
789 : :
790 : 3 : CU_ASSERT(ut_calls_get_func(0) == ut_fsdev_get_io_channel);
791 : 3 : CU_ASSERT(ut_calls_get_param_count(0) == 1);
792 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, 0) == utfsdev);
793 : :
794 : 3 : CU_ASSERT(ut_calls_get_func(1) == ut_fsdev_io_channel_create_cb);
795 : 3 : CU_ASSERT(ut_calls_get_param_count(1) == 1);
796 : 3 : ut_ch = (struct ut_io_channel *)ut_calls_param_get_ptr(1, 0);
797 : :
798 : 3 : ut_calls_reset();
799 : 3 : spdk_put_io_channel(ch);
800 : 3 : poll_thread(0);
801 : 3 : CU_ASSERT(ut_calls_get_call_count() == 1);
802 : :
803 : 3 : CU_ASSERT(ut_calls_get_func(0) == ut_fsdev_io_channel_destroy_cb);
804 : 3 : CU_ASSERT(ut_calls_get_param_count(0) == 1);
805 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, 0) == ut_ch);
806 : :
807 : 3 : spdk_fsdev_close(fsdev_desc);
808 : :
809 : 3 : ut_fsdev_destroy(utfsdev);
810 : 3 : }
811 : :
812 : : typedef int (*execute_clb)(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
813 : : struct spdk_fsdev_desc *fsdev_desc, int *status);
814 : : typedef void (*check_clb)(void);
815 : :
816 : : static void
817 : 111 : ut_fsdev_test_io(enum spdk_fsdev_io_type type, int desired_io_status, size_t num_priv_params,
818 : : execute_clb execute_cb, check_clb check_cb)
819 : : {
820 : : struct ut_fsdev *utfsdev;
821 : : struct spdk_io_channel *ch;
822 : 111 : struct spdk_fsdev_desc *fsdev_desc;
823 : : int rc;
824 : 111 : int status = -1;
825 : :
826 : 111 : utfsdev = ut_fsdev_create("utfsdev0");
827 : 111 : CU_ASSERT(utfsdev != NULL);
828 : :
829 : 111 : rc = spdk_fsdev_open("utfsdev0", fsdev_event_cb, NULL, &fsdev_desc);
830 : 111 : CU_ASSERT(rc == 0);
831 : 111 : CU_ASSERT(fsdev_desc != NULL);
832 : :
833 : 111 : ch = spdk_fsdev_get_io_channel(fsdev_desc);
834 : 111 : CU_ASSERT(ch != NULL);
835 : :
836 : 111 : ut_calls_reset();
837 : 111 : utfsdev->desired_io_status = desired_io_status;
838 : 111 : rc = execute_cb(utfsdev, ch, fsdev_desc, &status);
839 : 111 : CU_ASSERT(rc == 0);
840 : :
841 : 111 : poll_thread(0);
842 : 111 : CU_ASSERT(status == desired_io_status);
843 : 111 : CU_ASSERT(ut_calls_get_call_count() == 1);
844 : 111 : CU_ASSERT(ut_calls_get_func(0) == ut_fsdev_submit_request);
845 : 111 : CU_ASSERT(ut_calls_get_param_count(0) == UT_SUBMIT_IO_NUM_COMMON_PARAMS + num_priv_params);
846 : :
847 : : /* Common params */
848 : 111 : CU_ASSERT(ut_calls_param_get_int(0, 0) == type);
849 : 111 : CU_ASSERT(ut_calls_param_get_int(0, 1) == UT_UNIQUE);
850 : 111 : CU_ASSERT(ut_calls_param_get_ptr(0, 2) == g_ut_io_channel);
851 : 111 : CU_ASSERT(ut_calls_param_get_ptr(0, 3) == utfsdev);
852 : :
853 [ - + ]: 111 : SPDK_CU_ASSERT_FATAL(UT_SUBMIT_IO_NUM_COMMON_PARAMS == 4);
854 : :
855 : : /* Op-specific params */
856 : 111 : check_cb();
857 : :
858 : 111 : ut_calls_reset();
859 : 111 : spdk_put_io_channel(ch);
860 : 111 : poll_thread(0);
861 : :
862 : 111 : spdk_fsdev_close(fsdev_desc);
863 : :
864 : 111 : ut_fsdev_destroy(utfsdev);
865 : 111 : }
866 : :
867 : : static void
868 : 6 : ut_fsdev_mount_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
869 : : const struct spdk_fsdev_mount_opts *opts, struct spdk_fsdev_file_object *root_fobject)
870 : :
871 : : {
872 : 6 : int *clb_status = cb_arg;
873 : 6 : *clb_status = status;
874 [ + + ]: 6 : if (!status) {
875 : 3 : CU_ASSERT(root_fobject == UT_FOBJECT);
876 : 3 : CU_ASSERT(opts != NULL);
877 : 3 : CU_ASSERT(opts->opts_size == ut_mount_opts.opts_size);
878 : 3 : CU_ASSERT(opts->max_write == ut_mount_opts.max_write / 2);
879 : 3 : CU_ASSERT(opts->writeback_cache_enabled == !ut_mount_opts.writeback_cache_enabled);
880 : : }
881 : 6 : }
882 : :
883 : : static int
884 : 6 : ut_fsdev_mount_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
885 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
886 : : {
887 [ - + ]: 6 : memset(&ut_mount_opts, 0, sizeof(ut_mount_opts));
888 : 6 : ut_mount_opts.opts_size = sizeof(ut_mount_opts);
889 : 6 : ut_mount_opts.max_write = UINT32_MAX;
890 : 6 : ut_mount_opts.writeback_cache_enabled = true;
891 : :
892 : 6 : return spdk_fsdev_mount(fsdev_desc, ch, UT_UNIQUE, &ut_mount_opts, ut_fsdev_mount_cpl_cb, status);
893 : : }
894 : :
895 : : static void
896 : 6 : ut_fsdev_mount_check_clb(void)
897 : : {
898 : 6 : CU_ASSERT(ut_calls_param_get_hash(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) ==
899 : : ut_hash(&ut_mount_opts, sizeof(ut_mount_opts)));
900 : 6 : }
901 : :
902 : : static void
903 : 3 : ut_fsdev_test_mount_ok(void)
904 : : {
905 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_MOUNT, 0, 1, ut_fsdev_mount_execute_clb,
906 : : ut_fsdev_mount_check_clb);
907 : 3 : }
908 : :
909 : : static void
910 : 3 : ut_fsdev_test_mount_err(void)
911 : : {
912 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_MOUNT, -EINVAL, 1, ut_fsdev_mount_execute_clb,
913 : : ut_fsdev_mount_check_clb);
914 : 3 : }
915 : :
916 : : static void
917 : 3 : ut_fsdev_umount_cpl_cb(void *cb_arg, struct spdk_io_channel *ch)
918 : : {
919 : 3 : int *clb_status = cb_arg;
920 : 3 : *clb_status = 0; /* the callback doesn't get status, so we just zero it here */
921 : 3 : }
922 : :
923 : : static int
924 : 3 : ut_fsdev_umount_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
925 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
926 : : {
927 : 3 : return spdk_fsdev_umount(fsdev_desc, ch, UT_UNIQUE, ut_fsdev_umount_cpl_cb, status);
928 : : }
929 : :
930 : : static void
931 : 3 : ut_fsdev_umount_check_clb(void)
932 : : {
933 : : /* Nothing to check here */
934 : 3 : }
935 : :
936 : : static void
937 : 3 : ut_fsdev_test_umount(void)
938 : : {
939 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_UMOUNT, 0, 0, ut_fsdev_umount_execute_clb,
940 : : ut_fsdev_umount_check_clb);
941 : 3 : }
942 : :
943 : : static void
944 : 6 : ut_fsdev_lookup_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
945 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr)
946 : : {
947 : 6 : int *clb_status = cb_arg;
948 : 6 : *clb_status = status;
949 [ + + ]: 6 : if (!status) {
950 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
951 : 3 : CU_ASSERT(&ut_fsdev_fobject == fobject);
952 : : }
953 : 6 : }
954 : :
955 : : static int
956 : 6 : ut_fsdev_lookup_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
957 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
958 : : {
959 : 6 : return spdk_fsdev_lookup(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME,
960 : : ut_fsdev_lookup_cpl_cb,
961 : : status);
962 : : }
963 : :
964 : : static void
965 : 6 : ut_fsdev_lookup_check_clb(void)
966 : : {
967 [ - + ]: 6 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS), UT_FNAME,
968 : : UT_CALL_REC_MAX_STR_SIZE));
969 : 6 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FOBJECT);
970 : 6 : }
971 : :
972 : : static void
973 : 3 : ut_fsdev_test_lookup_ok(void)
974 : : {
975 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_LOOKUP, 0, 2, ut_fsdev_lookup_execute_clb,
976 : : ut_fsdev_lookup_check_clb);
977 : 3 : }
978 : :
979 : : static void
980 : 3 : ut_fsdev_test_lookup_err(void)
981 : : {
982 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_LOOKUP, -EBUSY, 2, ut_fsdev_lookup_execute_clb,
983 : : ut_fsdev_lookup_check_clb);
984 : 3 : }
985 : :
986 : : static void
987 : 3 : ut_fsdev_forget_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
988 : : {
989 : 3 : int *clb_status = cb_arg;
990 : 3 : *clb_status = status;
991 : 3 : }
992 : :
993 : : static int
994 : 3 : ut_fsdev_forget_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
995 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
996 : : {
997 : 3 : return spdk_fsdev_forget(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_NUM_LOOKUPS,
998 : : ut_fsdev_forget_cpl_cb, status);
999 : : }
1000 : :
1001 : : static void
1002 : 3 : ut_fsdev_forget_check_clb(void)
1003 : : {
1004 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1005 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_NUM_LOOKUPS);
1006 : 3 : }
1007 : :
1008 : : static void
1009 : 3 : ut_fsdev_test_forget(void)
1010 : : {
1011 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_FORGET, 0, 2, ut_fsdev_forget_execute_clb,
1012 : : ut_fsdev_forget_check_clb);
1013 : 3 : }
1014 : :
1015 : : static void
1016 : 3 : ut_fsdev_getattr_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1017 : : const struct spdk_fsdev_file_attr *attr)
1018 : : {
1019 : 3 : int *clb_status = cb_arg;
1020 : 3 : *clb_status = status;
1021 : 3 : }
1022 : :
1023 : : static int
1024 : 3 : ut_fsdev_getattr_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1025 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1026 : : {
1027 : 3 : return spdk_fsdev_getattr(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE,
1028 : : ut_fsdev_getattr_cpl_cb, status);
1029 : : }
1030 : :
1031 : : static void
1032 : 3 : ut_fsdev_getattr_check_clb(void)
1033 : : {
1034 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1035 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1036 : 3 : }
1037 : :
1038 : : static void
1039 : 3 : ut_fsdev_test_getattr(void)
1040 : : {
1041 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_GETATTR, 0, 2, ut_fsdev_getattr_execute_clb,
1042 : : ut_fsdev_getattr_check_clb);
1043 : 3 : }
1044 : :
1045 : : static void
1046 : 3 : ut_fsdev_setattr_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1047 : : const struct spdk_fsdev_file_attr *attr)
1048 : : {
1049 : 3 : int *clb_status = cb_arg;
1050 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1051 : 3 : *clb_status = status;
1052 : 3 : }
1053 : :
1054 : : static int
1055 : 3 : ut_fsdev_setattr_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1056 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1057 : : {
1058 [ - + ]: 3 : memset(&ut_fsdev_attr, rand(), sizeof(ut_fsdev_attr));
1059 : 3 : return spdk_fsdev_setattr(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE,
1060 : : &ut_fsdev_attr, 0x11111111, ut_fsdev_setattr_cpl_cb, status);
1061 : : }
1062 : :
1063 : : static void
1064 : 3 : ut_fsdev_setattr_check_clb(void)
1065 : : {
1066 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1067 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1068 : 3 : CU_ASSERT(ut_calls_param_get_hash(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) ==
1069 : : ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)));
1070 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 0x11111111);
1071 : 3 : }
1072 : :
1073 : : static void
1074 : 3 : ut_fsdev_test_setattr(void)
1075 : : {
1076 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_SETATTR, 0, 4, ut_fsdev_setattr_execute_clb,
1077 : : ut_fsdev_setattr_check_clb);
1078 : 3 : }
1079 : :
1080 : : static void
1081 : 3 : ut_fsdev_readlink_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1082 : : const char *linkname)
1083 : : {
1084 : 3 : int *clb_status = cb_arg;
1085 [ - + ]: 3 : CU_ASSERT(!strcmp(linkname, UT_FNAME));
1086 : 3 : *clb_status = status;
1087 : 3 : }
1088 : :
1089 : : static int
1090 : 3 : ut_fsdev_readlink_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1091 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1092 : : {
1093 : 3 : return spdk_fsdev_readlink(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, ut_fsdev_readlink_cpl_cb,
1094 : : status);
1095 : : }
1096 : :
1097 : : static void
1098 : 3 : ut_fsdev_readlink_check_clb(void)
1099 : : {
1100 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1101 : 3 : }
1102 : :
1103 : : static void
1104 : 3 : ut_fsdev_test_readlink(void)
1105 : : {
1106 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_READLINK, 0, 1, ut_fsdev_readlink_execute_clb,
1107 : : ut_fsdev_readlink_check_clb);
1108 : 3 : }
1109 : :
1110 : : static void
1111 : 3 : ut_fsdev_symlink_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1112 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr)
1113 : : {
1114 : 3 : int *clb_status = cb_arg;
1115 : 3 : CU_ASSERT(fobject == UT_FOBJECT + 1);
1116 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1117 : 3 : *clb_status = status;
1118 : 3 : }
1119 : :
1120 : : static int
1121 : 3 : ut_fsdev_symlink_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1122 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1123 : : {
1124 [ - + ]: 3 : memset(&ut_fsdev_attr, rand(), sizeof(ut_fsdev_attr));
1125 : 3 : return spdk_fsdev_symlink(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME, UT_LNAME, 100, 200,
1126 : : ut_fsdev_symlink_cpl_cb, status);
1127 : : }
1128 : :
1129 : : static void
1130 : 3 : ut_fsdev_symlink_check_clb(void)
1131 : : {
1132 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1133 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_FNAME,
1134 : : UT_CALL_REC_MAX_STR_SIZE));
1135 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2), UT_LNAME,
1136 : : UT_CALL_REC_MAX_STR_SIZE));
1137 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 100);
1138 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 200);
1139 : 3 : }
1140 : :
1141 : : static void
1142 : 3 : ut_fsdev_test_symlink(void)
1143 : : {
1144 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_SYMLINK, 0, 5, ut_fsdev_symlink_execute_clb,
1145 : : ut_fsdev_symlink_check_clb);
1146 : 3 : }
1147 : :
1148 : : static void
1149 : 3 : ut_fsdev_mknod_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1150 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr)
1151 : : {
1152 : 3 : int *clb_status = cb_arg;
1153 : 3 : CU_ASSERT(fobject == UT_FOBJECT + 1);
1154 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1155 : 3 : *clb_status = status;
1156 : 3 : }
1157 : :
1158 : : static int
1159 : 3 : ut_fsdev_mknod_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1160 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1161 : : {
1162 [ - + ]: 3 : memset(&ut_fsdev_attr, rand(), sizeof(ut_fsdev_attr));
1163 : 3 : return spdk_fsdev_mknod(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME, 0x1111, 50, 100, 200,
1164 : : ut_fsdev_mknod_cpl_cb, status);
1165 : : }
1166 : :
1167 : : static void
1168 : 3 : ut_fsdev_mknod_check_clb(void)
1169 : : {
1170 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1171 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_FNAME,
1172 : : UT_CALL_REC_MAX_STR_SIZE));
1173 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 0x1111);
1174 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 50);
1175 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 100);
1176 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 5) == 200);
1177 : 3 : }
1178 : :
1179 : : static void
1180 : 3 : ut_fsdev_test_mknod(void)
1181 : : {
1182 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_MKNOD, 0, 6, ut_fsdev_mknod_execute_clb,
1183 : : ut_fsdev_mknod_check_clb);
1184 : 3 : }
1185 : :
1186 : : static void
1187 : 3 : ut_fsdev_mkdir_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1188 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr)
1189 : : {
1190 : 3 : int *clb_status = cb_arg;
1191 : 3 : CU_ASSERT(fobject == UT_FOBJECT + 1);
1192 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1193 : 3 : *clb_status = status;
1194 : 3 : }
1195 : :
1196 : : static int
1197 : 3 : ut_fsdev_mkdir_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1198 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1199 : : {
1200 [ - + ]: 3 : memset(&ut_fsdev_attr, rand(), sizeof(ut_fsdev_attr));
1201 : 3 : return spdk_fsdev_mkdir(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME, 0x1111, 100, 200,
1202 : : ut_fsdev_mkdir_cpl_cb, status);
1203 : : }
1204 : :
1205 : : static void
1206 : 3 : ut_fsdev_mkdir_check_clb(void)
1207 : : {
1208 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1209 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_FNAME,
1210 : : UT_CALL_REC_MAX_STR_SIZE));
1211 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 0x1111);
1212 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 100);
1213 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 200);
1214 : 3 : }
1215 : :
1216 : : static void
1217 : 3 : ut_fsdev_test_mkdir(void)
1218 : : {
1219 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_MKDIR, 0, 5, ut_fsdev_mkdir_execute_clb,
1220 : : ut_fsdev_mkdir_check_clb);
1221 : 3 : }
1222 : :
1223 : : static void
1224 : 3 : ut_fsdev_unlink_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1225 : : {
1226 : 3 : int *clb_status = cb_arg;
1227 : 3 : *clb_status = status;
1228 : 3 : }
1229 : :
1230 : : static int
1231 : 3 : ut_fsdev_unlink_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1232 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1233 : : {
1234 : 3 : return spdk_fsdev_unlink(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME,
1235 : : ut_fsdev_unlink_cpl_cb, status);
1236 : : }
1237 : :
1238 : : static void
1239 : 3 : ut_fsdev_unlink_check_clb(void)
1240 : : {
1241 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1242 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_FNAME,
1243 : : UT_CALL_REC_MAX_STR_SIZE));
1244 : 3 : }
1245 : :
1246 : : static void
1247 : 3 : ut_fsdev_test_unlink(void)
1248 : : {
1249 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_UNLINK, 0, 2, ut_fsdev_unlink_execute_clb,
1250 : : ut_fsdev_unlink_check_clb);
1251 : 3 : }
1252 : :
1253 : : static void
1254 : 3 : ut_fsdev_rmdir_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1255 : : {
1256 : 3 : int *clb_status = cb_arg;
1257 : 3 : *clb_status = status;
1258 : 3 : }
1259 : :
1260 : : static int
1261 : 3 : ut_fsdev_rmdir_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1262 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1263 : : {
1264 : 3 : return spdk_fsdev_rmdir(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME,
1265 : : ut_fsdev_rmdir_cpl_cb, status);
1266 : : }
1267 : :
1268 : : static void
1269 : 3 : ut_fsdev_rmdir_check_clb(void)
1270 : : {
1271 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1272 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_FNAME,
1273 : : UT_CALL_REC_MAX_STR_SIZE));
1274 : 3 : }
1275 : :
1276 : : static void
1277 : 3 : ut_fsdev_test_rmdir(void)
1278 : : {
1279 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_RMDIR, 0, 2, ut_fsdev_rmdir_execute_clb,
1280 : : ut_fsdev_rmdir_check_clb);
1281 : 3 : }
1282 : :
1283 : : static void
1284 : 3 : ut_fsdev_rename_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1285 : : {
1286 : 3 : int *clb_status = cb_arg;
1287 : 3 : *clb_status = status;
1288 : 3 : }
1289 : :
1290 : : static int
1291 : 3 : ut_fsdev_rename_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1292 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1293 : : {
1294 : 3 : return spdk_fsdev_rename(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FNAME, UT_FOBJECT + 2,
1295 : : UT_LNAME, 0xFFFF, ut_fsdev_rename_cpl_cb, status);
1296 : : }
1297 : :
1298 : : static void
1299 : 3 : ut_fsdev_rename_check_clb(void)
1300 : : {
1301 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1302 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_FNAME,
1303 : : UT_CALL_REC_MAX_STR_SIZE));
1304 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == UT_FOBJECT + 2);
1305 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3), UT_LNAME,
1306 : : UT_CALL_REC_MAX_STR_SIZE));
1307 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 0xFFFF);
1308 : 3 : }
1309 : :
1310 : : static void
1311 : 3 : ut_fsdev_test_rename(void)
1312 : : {
1313 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_RENAME, 0, 5, ut_fsdev_rename_execute_clb,
1314 : : ut_fsdev_rename_check_clb);
1315 : 3 : }
1316 : :
1317 : : static void
1318 : 3 : ut_fsdev_link_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1319 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr)
1320 : : {
1321 : 3 : int *clb_status = cb_arg;
1322 : 3 : CU_ASSERT(fobject == UT_FOBJECT + 1);
1323 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1324 : 3 : *clb_status = status;
1325 : 3 : }
1326 : :
1327 : : static int
1328 : 3 : ut_fsdev_link_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1329 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1330 : : {
1331 : 3 : return spdk_fsdev_link(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FOBJECT + 2, UT_LNAME,
1332 : : ut_fsdev_link_cpl_cb, status);
1333 : : }
1334 : :
1335 : : static void
1336 : 3 : ut_fsdev_link_check_clb(void)
1337 : : {
1338 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1339 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FOBJECT + 2);
1340 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2), UT_LNAME,
1341 : : UT_CALL_REC_MAX_STR_SIZE));
1342 : 3 : }
1343 : :
1344 : : static void
1345 : 3 : ut_fsdev_test_link(void)
1346 : : {
1347 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_LINK, 0, 3, ut_fsdev_link_execute_clb,
1348 : : ut_fsdev_link_check_clb);
1349 : 3 : }
1350 : :
1351 : : static void
1352 : 3 : ut_fsdev_fopen_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1353 : : struct spdk_fsdev_file_handle *fhandle)
1354 : : {
1355 : 3 : int *clb_status = cb_arg;
1356 : 3 : CU_ASSERT(fhandle == UT_FHANDLE);
1357 : 3 : *clb_status = status;
1358 : 3 : }
1359 : :
1360 : : static int
1361 : 3 : ut_fsdev_fopen_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1362 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1363 : : {
1364 : 3 : return spdk_fsdev_fopen(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, 0xFEAD,
1365 : : ut_fsdev_fopen_cpl_cb, status);
1366 : : }
1367 : :
1368 : : static void
1369 : 3 : ut_fsdev_fopen_check_clb(void)
1370 : : {
1371 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1372 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == 0xFEAD);
1373 : 3 : }
1374 : :
1375 : : static void
1376 : 3 : ut_fsdev_test_fopen(void)
1377 : : {
1378 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_OPEN, 0, 2, ut_fsdev_fopen_execute_clb,
1379 : : ut_fsdev_fopen_check_clb);
1380 : 3 : }
1381 : :
1382 : : static void
1383 : 3 : ut_fsdev_read_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1384 : : uint32_t data_size)
1385 : : {
1386 : 3 : int *clb_status = cb_arg;
1387 : 3 : CU_ASSERT(data_size == UT_DATA_SIZE);
1388 : 3 : *clb_status = status;
1389 : 3 : }
1390 : :
1391 : : static int
1392 : 3 : ut_fsdev_read_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1393 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1394 : : {
1395 [ - + ]: 3 : memset(&ut_iov, rand(), sizeof(ut_iov));
1396 : 3 : return spdk_fsdev_read(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, 100, 200, 0x1111,
1397 : : ut_iov, SPDK_COUNTOF(ut_iov), (struct spdk_fsdev_io_opts *)0xAAAAAAAA,
1398 : : ut_fsdev_read_cpl_cb, status);
1399 : : }
1400 : :
1401 : : static void
1402 : 3 : ut_fsdev_read_check_clb(void)
1403 : : {
1404 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1405 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1406 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 100);
1407 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 200);
1408 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 0x1111);
1409 : 3 : CU_ASSERT(ut_calls_param_get_hash(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 5) == ut_hash(ut_iov,
1410 : : sizeof(ut_iov)));
1411 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 6) == SPDK_COUNTOF(ut_iov));
1412 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 7) == 0xAAAAAAAA);
1413 : 3 : }
1414 : :
1415 : : static void
1416 : 3 : ut_fsdev_test_read(void)
1417 : : {
1418 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_READ, 0, 8, ut_fsdev_read_execute_clb,
1419 : : ut_fsdev_read_check_clb);
1420 : 3 : }
1421 : :
1422 : : static void
1423 : 3 : ut_fsdev_write_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1424 : : uint32_t data_size)
1425 : : {
1426 : 3 : int *clb_status = cb_arg;
1427 : 3 : CU_ASSERT(data_size == UT_DATA_SIZE);
1428 : 3 : *clb_status = status;
1429 : 3 : }
1430 : :
1431 : : static int
1432 : 3 : ut_fsdev_write_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1433 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1434 : : {
1435 [ - + ]: 3 : memset(&ut_iov, rand(), sizeof(ut_iov));
1436 : 3 : return spdk_fsdev_write(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, 100, 200, 0x1111,
1437 : : ut_iov, SPDK_COUNTOF(ut_iov), (struct spdk_fsdev_io_opts *)0xAAAAAAAA,
1438 : : ut_fsdev_write_cpl_cb, status);
1439 : : }
1440 : :
1441 : : static void
1442 : 3 : ut_fsdev_write_check_clb(void)
1443 : : {
1444 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1445 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1446 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 100);
1447 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 200);
1448 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 0x1111);
1449 : 3 : CU_ASSERT(ut_calls_param_get_hash(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 5) ==
1450 : : ut_hash(ut_iov, sizeof(ut_iov)));
1451 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 6) == SPDK_COUNTOF(ut_iov));
1452 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 7) == 0xAAAAAAAA);
1453 : 3 : }
1454 : :
1455 : : static void
1456 : 3 : ut_fsdev_test_write(void)
1457 : : {
1458 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_WRITE, 0, 8, ut_fsdev_write_execute_clb,
1459 : : ut_fsdev_write_check_clb);
1460 : 3 : }
1461 : :
1462 : : static void
1463 : 3 : ut_fsdev_statfs_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1464 : : const struct spdk_fsdev_file_statfs *statfs)
1465 : : {
1466 : 3 : int *clb_status = cb_arg;
1467 : 3 : CU_ASSERT(ut_hash(&ut_statfs, sizeof(ut_statfs)) == ut_hash(statfs, sizeof(*statfs)));
1468 : 3 : *clb_status = status;
1469 : 3 : }
1470 : :
1471 : : static int
1472 : 3 : ut_fsdev_statfs_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1473 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1474 : : {
1475 [ - + ]: 3 : memset(&ut_statfs, rand(), sizeof(ut_statfs));
1476 : 3 : return spdk_fsdev_statfs(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT,
1477 : : ut_fsdev_statfs_cpl_cb, status);
1478 : : }
1479 : :
1480 : : static void
1481 : 3 : ut_fsdev_statfs_check_clb(void)
1482 : : {
1483 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1484 : 3 : }
1485 : :
1486 : : static void
1487 : 3 : ut_fsdev_test_statfs(void)
1488 : : {
1489 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_STATFS, 0, 1, ut_fsdev_statfs_execute_clb,
1490 : : ut_fsdev_statfs_check_clb);
1491 : 3 : }
1492 : :
1493 : : static void
1494 : 3 : ut_fsdev_release_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1495 : : {
1496 : 3 : int *clb_status = cb_arg;
1497 : 3 : *clb_status = status;
1498 : 3 : }
1499 : :
1500 : : static int
1501 : 3 : ut_fsdev_release_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1502 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1503 : : {
1504 : 3 : return spdk_fsdev_release(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE,
1505 : : ut_fsdev_release_cpl_cb, status);
1506 : : }
1507 : :
1508 : : static void
1509 : 3 : ut_fsdev_release_check_clb(void)
1510 : : {
1511 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1512 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1513 : 3 : }
1514 : :
1515 : : static void
1516 : 3 : ut_fsdev_test_release(void)
1517 : : {
1518 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_RELEASE, 0, 2, ut_fsdev_release_execute_clb,
1519 : : ut_fsdev_release_check_clb);
1520 : 3 : }
1521 : :
1522 : : static void
1523 : 3 : ut_fsdev_fsync_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1524 : : {
1525 : 3 : int *clb_status = cb_arg;
1526 : 3 : *clb_status = status;
1527 : 3 : }
1528 : :
1529 : : static int
1530 : 3 : ut_fsdev_fsync_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1531 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1532 : : {
1533 : 3 : return spdk_fsdev_fsync(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, false,
1534 : : ut_fsdev_fsync_cpl_cb, status);
1535 : : }
1536 : :
1537 : : static void
1538 : 3 : ut_fsdev_fsync_check_clb(void)
1539 : : {
1540 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1541 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1542 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == false);
1543 : 3 : }
1544 : :
1545 : : static void
1546 : 3 : ut_fsdev_test_fsync(void)
1547 : : {
1548 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_FSYNC, 0, 3, ut_fsdev_fsync_execute_clb,
1549 : : ut_fsdev_fsync_check_clb);
1550 : 3 : }
1551 : :
1552 : : static void
1553 : 3 : ut_fsdev_getxattr_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1554 : : size_t value_size)
1555 : : {
1556 : 3 : int *clb_status = cb_arg;
1557 : 3 : CU_ASSERT(value_size == sizeof(UT_AVALUE));
1558 : 3 : CU_ASSERT(!strcmp(ut_buff, UT_AVALUE));
1559 : 3 : *clb_status = status;
1560 : 3 : }
1561 : :
1562 : : static int
1563 : 3 : ut_fsdev_getxattr_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1564 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1565 : : {
1566 [ - + ]: 3 : memset(ut_buff, 0, sizeof(ut_buff));
1567 : 3 : return spdk_fsdev_getxattr(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_ANAME, ut_buff,
1568 : : sizeof(ut_buff), ut_fsdev_getxattr_cpl_cb, status);
1569 : : }
1570 : :
1571 : : static void
1572 : 3 : ut_fsdev_getxattr_check_clb(void)
1573 : : {
1574 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1575 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_ANAME,
1576 : : UT_CALL_REC_MAX_STR_SIZE));
1577 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == ut_buff);
1578 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == sizeof(ut_buff));
1579 : 3 : }
1580 : :
1581 : : static void
1582 : 3 : ut_fsdev_test_getxattr(void)
1583 : : {
1584 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_GETXATTR, 0, 4, ut_fsdev_getxattr_execute_clb,
1585 : : ut_fsdev_getxattr_check_clb);
1586 : 3 : }
1587 : :
1588 : : static void
1589 : 3 : ut_fsdev_setxattr_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1590 : : {
1591 : 3 : int *clb_status = cb_arg;
1592 : 3 : *clb_status = status;
1593 : 3 : }
1594 : :
1595 : : static int
1596 : 3 : ut_fsdev_setxattr_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1597 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1598 : : {
1599 : 3 : return spdk_fsdev_setxattr(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_ANAME, UT_AVALUE,
1600 : : sizeof(UT_AVALUE), 0xFF, ut_fsdev_setxattr_cpl_cb, status);
1601 : : }
1602 : :
1603 : : static void
1604 : 3 : ut_fsdev_setxattr_check_clb(void)
1605 : : {
1606 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1607 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_ANAME,
1608 : : UT_CALL_REC_MAX_STR_SIZE));
1609 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2), UT_AVALUE,
1610 : : UT_CALL_REC_MAX_STR_SIZE));
1611 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == sizeof(UT_AVALUE));
1612 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 0xFF);
1613 : 3 : }
1614 : :
1615 : : static void
1616 : 3 : ut_fsdev_test_setxattr(void)
1617 : : {
1618 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_SETXATTR, 0, 5, ut_fsdev_setxattr_execute_clb,
1619 : : ut_fsdev_setxattr_check_clb);
1620 : 3 : }
1621 : :
1622 : : static void
1623 : 6 : ut_fsdev_listxattr_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status, size_t size,
1624 : : bool size_only)
1625 : : {
1626 : 6 : int *clb_status = cb_arg;
1627 [ + + + + ]: 6 : if (ut_listxattr_size_only) {
1628 : 3 : CU_ASSERT(size_only);
1629 : 3 : CU_ASSERT(size == (sizeof(ut_buff) / sizeof(UT_ANAME)) * sizeof(UT_ANAME));
1630 : : } else {
1631 : 3 : char *p = ut_buff;
1632 : :
1633 : 3 : CU_ASSERT(!size_only);
1634 : 3 : CU_ASSERT(size != 0);
1635 : :
1636 [ + + ]: 258 : for (; p + sizeof(UT_ANAME) <= ut_buff + size; p += sizeof(UT_ANAME)) {
1637 [ - + ]: 255 : CU_ASSERT(!strcmp(p, UT_ANAME));
1638 : : }
1639 : :
1640 : 3 : CU_ASSERT(size + sizeof(UT_ANAME) > sizeof(ut_buff));
1641 : : }
1642 : 6 : *clb_status = status;
1643 : 6 : }
1644 : :
1645 : : static int
1646 : 6 : ut_fsdev_listxattr_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1647 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1648 : : {
1649 [ + + + + ]: 6 : return spdk_fsdev_listxattr(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT,
1650 [ + + + + ]: 6 : ut_listxattr_size_only ? NULL : ut_buff, ut_listxattr_size_only ? 0 : sizeof(ut_buff),
1651 : : ut_fsdev_listxattr_cpl_cb, status);
1652 : : }
1653 : :
1654 : : static void
1655 : 6 : ut_fsdev_listxattr_check_clb(void)
1656 : : {
1657 : 6 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1658 [ + + + + ]: 6 : if (ut_listxattr_size_only) {
1659 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == NULL);
1660 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 0);
1661 : : } else {
1662 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == ut_buff);
1663 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == sizeof(ut_buff));
1664 : : }
1665 : 6 : }
1666 : :
1667 : : static void
1668 : 3 : ut_fsdev_test_listxattr(void)
1669 : : {
1670 : 3 : ut_listxattr_size_only = false;
1671 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_LISTXATTR, 0, 3, ut_fsdev_listxattr_execute_clb,
1672 : : ut_fsdev_listxattr_check_clb);
1673 : 3 : }
1674 : :
1675 : : static void
1676 : 3 : ut_fsdev_test_listxattr_get_size(void)
1677 : : {
1678 : 3 : ut_listxattr_size_only = true;
1679 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_LISTXATTR, 0, 3, ut_fsdev_listxattr_execute_clb,
1680 : : ut_fsdev_listxattr_check_clb);
1681 : 3 : }
1682 : :
1683 : : static void
1684 : 3 : ut_fsdev_removexattr_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1685 : : {
1686 : 3 : int *clb_status = cb_arg;
1687 : 3 : *clb_status = status;
1688 : 3 : }
1689 : :
1690 : : static int
1691 : 3 : ut_fsdev_removexattr_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1692 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1693 : : {
1694 : 3 : return spdk_fsdev_removexattr(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_ANAME,
1695 : : ut_fsdev_removexattr_cpl_cb, status);
1696 : : }
1697 : :
1698 : : static void
1699 : 3 : ut_fsdev_removexattr_check_clb(void)
1700 : : {
1701 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1702 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_ANAME,
1703 : : UT_CALL_REC_MAX_STR_SIZE));
1704 : 3 : }
1705 : :
1706 : : static void
1707 : 3 : ut_fsdev_test_removexattr(void)
1708 : : {
1709 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_REMOVEXATTR, 0, 2, ut_fsdev_removexattr_execute_clb,
1710 : : ut_fsdev_removexattr_check_clb);
1711 : 3 : }
1712 : :
1713 : : static void
1714 : 3 : ut_fsdev_flush_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1715 : : {
1716 : 3 : int *clb_status = cb_arg;
1717 : 3 : *clb_status = status;
1718 : 3 : }
1719 : :
1720 : : static int
1721 : 3 : ut_fsdev_flush_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1722 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1723 : : {
1724 : 3 : return spdk_fsdev_flush(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE,
1725 : : ut_fsdev_flush_cpl_cb, status);
1726 : : }
1727 : :
1728 : : static void
1729 : 3 : ut_fsdev_flush_check_clb(void)
1730 : : {
1731 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1732 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1733 : 3 : }
1734 : :
1735 : : static void
1736 : 3 : ut_fsdev_test_flush(void)
1737 : : {
1738 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_FLUSH, 0, 2, ut_fsdev_flush_execute_clb,
1739 : : ut_fsdev_flush_check_clb);
1740 : 3 : }
1741 : :
1742 : : static void
1743 : 3 : ut_fsdev_opendir_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1744 : : struct spdk_fsdev_file_handle *fhandle)
1745 : : {
1746 : 3 : int *clb_status = cb_arg;
1747 : 3 : CU_ASSERT(fhandle == UT_FHANDLE);
1748 : 3 : *clb_status = status;
1749 : 3 : }
1750 : :
1751 : : static int
1752 : 3 : ut_fsdev_opendir_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1753 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1754 : : {
1755 : 3 : return spdk_fsdev_opendir(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, 0x1111,
1756 : : ut_fsdev_opendir_cpl_cb, status);
1757 : : }
1758 : :
1759 : : static void
1760 : 3 : ut_fsdev_opendir_check_clb(void)
1761 : : {
1762 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1763 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == 0x1111);
1764 : 3 : }
1765 : :
1766 : : static void
1767 : 3 : ut_fsdev_test_opendir(void)
1768 : : {
1769 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_OPENDIR, 0, 2, ut_fsdev_opendir_execute_clb,
1770 : : ut_fsdev_opendir_check_clb);
1771 : 3 : }
1772 : :
1773 : : static int
1774 : 60 : ut_fsdev_readdir_entry_cb(void *cb_arg, struct spdk_io_channel *ch, const char *name,
1775 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr,
1776 : : off_t offset)
1777 : : {
1778 [ - + ]: 60 : CU_ASSERT(!strcmp(name, UT_FNAME));
1779 : 60 : CU_ASSERT(fobject == UT_FOBJECT + ut_readdir_num_entry_cb_calls);
1780 : 60 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1781 : 60 : CU_ASSERT(offset == (off_t)(ut_readdir_offset + ut_readdir_num_entry_cb_calls));
1782 : :
1783 : 60 : ut_readdir_num_entry_cb_calls++;
1784 [ + + ]: 60 : return (ut_readdir_num_entry_cb_calls == ut_readdir_num_entries) ? -1 : 0;
1785 : : }
1786 : :
1787 : : static void
1788 : 3 : ut_fsdev_readdir_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1789 : : {
1790 : 3 : int *clb_status = cb_arg;
1791 : 3 : *clb_status = status;
1792 : 3 : }
1793 : :
1794 : : static int
1795 : 3 : ut_fsdev_readdir_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1796 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1797 : : {
1798 : 3 : ut_readdir_num_entries = 20;
1799 : 3 : ut_readdir_num_entry_cb_calls = 0;
1800 : 3 : ut_readdir_offset = (uint64_t)rand();
1801 [ - + ]: 3 : memset(&ut_fsdev_attr, rand(), sizeof(ut_fsdev_attr));
1802 : 3 : return spdk_fsdev_readdir(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, 10000,
1803 : : ut_fsdev_readdir_entry_cb, ut_fsdev_readdir_cpl_cb, status);
1804 : : }
1805 : :
1806 : : static void
1807 : 3 : ut_fsdev_readdir_check_clb(void)
1808 : : {
1809 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1810 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1811 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 10000);
1812 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0,
1813 : : UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == ut_fsdev_readdir_entry_cb);
1814 : 3 : CU_ASSERT(ut_readdir_num_entry_cb_calls == ut_readdir_num_entries);
1815 : 3 : }
1816 : :
1817 : : static void
1818 : 3 : ut_fsdev_test_readdir(void)
1819 : : {
1820 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_READDIR, 0, 4, ut_fsdev_readdir_execute_clb,
1821 : : ut_fsdev_readdir_check_clb);
1822 : 3 : }
1823 : :
1824 : : static void
1825 : 3 : ut_fsdev_releasedir_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1826 : : {
1827 : 3 : int *clb_status = cb_arg;
1828 : 3 : *clb_status = status;
1829 : 3 : }
1830 : :
1831 : : static int
1832 : 3 : ut_fsdev_releasedir_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1833 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1834 : : {
1835 : 3 : return spdk_fsdev_releasedir(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE,
1836 : : ut_fsdev_releasedir_cpl_cb, status);
1837 : : }
1838 : :
1839 : : static void
1840 : 3 : ut_fsdev_releasedir_check_clb(void)
1841 : : {
1842 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1843 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1844 : 3 : }
1845 : :
1846 : : static void
1847 : 3 : ut_fsdev_test_releasedir(void)
1848 : : {
1849 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_RELEASEDIR, 0, 2, ut_fsdev_releasedir_execute_clb,
1850 : : ut_fsdev_releasedir_check_clb);
1851 : 3 : }
1852 : :
1853 : : static void
1854 : 3 : ut_fsdev_fsyncdir_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1855 : : {
1856 : 3 : int *clb_status = cb_arg;
1857 : 3 : *clb_status = status;
1858 : 3 : }
1859 : :
1860 : : static int
1861 : 3 : ut_fsdev_fsyncdir_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1862 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1863 : : {
1864 : 3 : return spdk_fsdev_fsyncdir(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, true,
1865 : : ut_fsdev_fsyncdir_cpl_cb, status);
1866 : : }
1867 : :
1868 : : static void
1869 : 3 : ut_fsdev_fsyncdir_check_clb(void)
1870 : : {
1871 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1872 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1873 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == true);
1874 : 3 : }
1875 : :
1876 : : static void
1877 : 3 : ut_fsdev_test_fsyncdir(void)
1878 : : {
1879 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_FSYNCDIR, 0, 3, ut_fsdev_fsyncdir_execute_clb,
1880 : : ut_fsdev_fsyncdir_check_clb);
1881 : 3 : }
1882 : :
1883 : : static void
1884 : 3 : ut_fsdev_flock_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1885 : : {
1886 : 3 : int *clb_status = cb_arg;
1887 : 3 : *clb_status = status;
1888 : 3 : }
1889 : :
1890 : : static int
1891 : 3 : ut_fsdev_flock_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1892 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1893 : : {
1894 : 3 : return spdk_fsdev_flock(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, 111,
1895 : : ut_fsdev_flock_cpl_cb, status);
1896 : : }
1897 : :
1898 : : static void
1899 : 3 : ut_fsdev_flock_check_clb(void)
1900 : : {
1901 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1902 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
1903 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 111);
1904 : 3 : }
1905 : :
1906 : : static void
1907 : 3 : ut_fsdev_test_flock(void)
1908 : : {
1909 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_FLOCK, 0, 3, ut_fsdev_flock_execute_clb,
1910 : : ut_fsdev_flock_check_clb);
1911 : 3 : }
1912 : :
1913 : : static void
1914 : 3 : ut_fsdev_create_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
1915 : : struct spdk_fsdev_file_object *fobject, const struct spdk_fsdev_file_attr *attr,
1916 : : struct spdk_fsdev_file_handle *fhandle)
1917 : : {
1918 : 3 : int *clb_status = cb_arg;
1919 : 3 : CU_ASSERT(fobject == UT_FOBJECT + 1);
1920 : 3 : CU_ASSERT(fhandle == UT_FHANDLE);
1921 : 3 : CU_ASSERT(ut_hash(&ut_fsdev_attr, sizeof(ut_fsdev_attr)) == ut_hash(attr, sizeof(*attr)));
1922 : 3 : *clb_status = status;
1923 : 3 : }
1924 : :
1925 : : static int
1926 : 3 : ut_fsdev_create_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1927 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1928 : : {
1929 [ - + ]: 3 : memset(&ut_fsdev_attr, rand(), sizeof(ut_fsdev_attr));
1930 : 3 : return spdk_fsdev_create(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_LNAME, 100, 0x2222, 0x666,
1931 : : 200, 300, ut_fsdev_create_cpl_cb, status);
1932 : : }
1933 : :
1934 : : static void
1935 : 3 : ut_fsdev_create_check_clb(void)
1936 : : {
1937 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
1938 [ - + ]: 3 : CU_ASSERT(!strncmp(ut_calls_param_get_str(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1), UT_LNAME,
1939 : : UT_CALL_REC_MAX_STR_SIZE));
1940 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 100);
1941 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 0x2222);
1942 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 0x666);
1943 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 5) == 200);
1944 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 6) == 300);
1945 : 3 : }
1946 : :
1947 : : static void
1948 : 3 : ut_fsdev_test_create(void)
1949 : : {
1950 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_CREATE, 0, 7, ut_fsdev_create_execute_clb,
1951 : : ut_fsdev_create_check_clb);
1952 : 3 : }
1953 : :
1954 : : static void
1955 : 3 : ut_fsdev_abort_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1956 : : {
1957 : 3 : int *clb_status = cb_arg;
1958 : 3 : *clb_status = status;
1959 : 3 : }
1960 : :
1961 : : static int
1962 : 3 : ut_fsdev_abort_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1963 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1964 : : {
1965 : 3 : return spdk_fsdev_abort(fsdev_desc, ch, UT_UNIQUE,
1966 : : ut_fsdev_abort_cpl_cb, status);
1967 : : }
1968 : :
1969 : : static void
1970 : 3 : ut_fsdev_abort_check_clb(void)
1971 : : {
1972 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_UNIQUE);
1973 : 3 : }
1974 : :
1975 : : static void
1976 : 3 : ut_fsdev_test_abort(void)
1977 : : {
1978 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_ABORT, 0, 1, ut_fsdev_abort_execute_clb,
1979 : : ut_fsdev_abort_check_clb);
1980 : 3 : }
1981 : :
1982 : : static void
1983 : 3 : ut_fsdev_fallocate_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status)
1984 : : {
1985 : 3 : int *clb_status = cb_arg;
1986 : 3 : *clb_status = status;
1987 : 3 : }
1988 : :
1989 : : static int
1990 : 3 : ut_fsdev_fallocate_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
1991 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
1992 : : {
1993 : 3 : return spdk_fsdev_fallocate(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, 0x1111, 2000,
1994 : : 1002, ut_fsdev_fallocate_cpl_cb, status);
1995 : : }
1996 : :
1997 : : static void
1998 : 3 : ut_fsdev_fallocate_check_clb(void)
1999 : : {
2000 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
2001 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
2002 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 0x1111);
2003 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == 2000);
2004 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == 1002);
2005 : 3 : }
2006 : :
2007 : : static void
2008 : 3 : ut_fsdev_test_fallocate(void)
2009 : : {
2010 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_FALLOCATE, 0, 5, ut_fsdev_fallocate_execute_clb,
2011 : : ut_fsdev_fallocate_check_clb);
2012 : 3 : }
2013 : :
2014 : : static void
2015 : 3 : ut_fsdev_copy_file_range_cpl_cb(void *cb_arg, struct spdk_io_channel *ch, int status,
2016 : : uint32_t data_size)
2017 : : {
2018 : 3 : int *clb_status = cb_arg;
2019 : 3 : CU_ASSERT(data_size == UT_DATA_SIZE);
2020 : 3 : *clb_status = status;
2021 : 3 : }
2022 : :
2023 : : static int
2024 : 3 : ut_fsdev_copy_file_range_execute_clb(struct ut_fsdev *utfsdev, struct spdk_io_channel *ch,
2025 : : struct spdk_fsdev_desc *fsdev_desc, int *status)
2026 : : {
2027 : 3 : return spdk_fsdev_copy_file_range(fsdev_desc, ch, UT_UNIQUE, UT_FOBJECT, UT_FHANDLE, 1000,
2028 : : UT_FOBJECT + 2, UT_FHANDLE + 2, 3000, 50000, 0x77777777,
2029 : : ut_fsdev_copy_file_range_cpl_cb, status);
2030 : : }
2031 : :
2032 : : static void
2033 : 3 : ut_fsdev_copy_file_range_check_clb(void)
2034 : : {
2035 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS) == UT_FOBJECT);
2036 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 1) == UT_FHANDLE);
2037 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 2) == 1000);
2038 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 3) == UT_FOBJECT + 2);
2039 : 3 : CU_ASSERT(ut_calls_param_get_ptr(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 4) == UT_FHANDLE + 2);
2040 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 5) == 3000);
2041 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 6) == 50000);
2042 : 3 : CU_ASSERT(ut_calls_param_get_int(0, UT_SUBMIT_IO_NUM_COMMON_PARAMS + 7) == 0x77777777);
2043 : 3 : }
2044 : :
2045 : : static void
2046 : 3 : ut_fsdev_test_copy_file_range(void)
2047 : : {
2048 : 3 : ut_fsdev_test_io(SPDK_FSDEV_IO_COPY_FILE_RANGE, 0, 8, ut_fsdev_copy_file_range_execute_clb,
2049 : : ut_fsdev_copy_file_range_check_clb);
2050 : 3 : }
2051 : :
2052 : : int
2053 : 3 : main(int argc, char **argv)
2054 : : {
2055 : 3 : CU_pSuite suite = NULL;
2056 : : unsigned int num_failures;
2057 : :
2058 : 3 : CU_initialize_registry();
2059 : :
2060 : 3 : suite = CU_add_suite("fsdev", ut_fsdev_setup, ut_fsdev_teardown);
2061 : :
2062 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_open_close);
2063 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_set_opts);
2064 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_get_io_channel);
2065 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_mount_ok);
2066 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_mount_err);
2067 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_umount);
2068 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_lookup_ok);
2069 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_lookup_err);
2070 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_forget);
2071 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_getattr);
2072 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_setattr);
2073 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_readlink);
2074 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_symlink);
2075 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_mknod);
2076 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_mkdir);
2077 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_unlink);
2078 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_rmdir);
2079 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_rename);
2080 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_link);
2081 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_fopen);
2082 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_read);
2083 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_write);
2084 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_statfs);
2085 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_release);
2086 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_fsync);
2087 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_getxattr);
2088 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_setxattr);
2089 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_listxattr);
2090 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_listxattr_get_size);
2091 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_removexattr);
2092 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_flush);
2093 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_opendir);
2094 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_readdir);
2095 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_releasedir);
2096 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_fsyncdir);
2097 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_flock);
2098 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_create);
2099 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_abort);
2100 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_fallocate);
2101 : 3 : CU_ADD_TEST(suite, ut_fsdev_test_copy_file_range);
2102 : :
2103 : 3 : allocate_cores(1);
2104 : 3 : allocate_threads(1);
2105 : 3 : set_thread(0);
2106 : :
2107 : 3 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
2108 : 3 : CU_cleanup_registry();
2109 : :
2110 : 3 : poll_thread(0);
2111 : :
2112 : 3 : free_threads();
2113 : 3 : free_cores();
2114 : :
2115 : 3 : return num_failures;
2116 : : }
|