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/stdinc.h"
6 : #include "spdk/fsdev.h"
7 : #include "spdk/fsdev_module.h"
8 : #include "fsdev_internal.h"
9 :
10 : #define CALL_USR_CLB(_fsdev_io, ch, type, ...) \
11 : do { \
12 : type *usr_cb_fn = _fsdev_io->internal.usr_cb_fn; \
13 : usr_cb_fn(_fsdev_io->internal.usr_cb_arg, ch, _fsdev_io->internal.status, ## __VA_ARGS__); \
14 : } while (0)
15 :
16 : #define CALL_USR_NO_STATUS_CLB(_fsdev_io, ch, type, ...) \
17 : do { \
18 : type *usr_cb_fn = _fsdev_io->internal.usr_cb_fn; \
19 : usr_cb_fn(_fsdev_io->internal.usr_cb_arg, ch, ## __VA_ARGS__); \
20 : } while (0)
21 :
22 : static struct spdk_fsdev_io *
23 37 : fsdev_io_get_and_fill(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
24 : void *usr_cb_fn, void *usr_cb_arg, spdk_fsdev_io_completion_cb cb_fn, void *cb_arg,
25 : enum spdk_fsdev_io_type type)
26 : {
27 : struct spdk_fsdev_io *fsdev_io;
28 37 : struct spdk_fsdev_channel *channel = __io_ch_to_fsdev_ch(ch);
29 :
30 37 : fsdev_io = fsdev_channel_get_io(channel);
31 37 : if (!fsdev_io) {
32 0 : return NULL;
33 : }
34 :
35 37 : fsdev_io->fsdev = spdk_fsdev_desc_get_fsdev(desc);
36 37 : fsdev_io->internal.ch = channel;
37 37 : fsdev_io->internal.desc = desc;
38 37 : fsdev_io->internal.type = type;
39 37 : fsdev_io->internal.unique = unique;
40 37 : fsdev_io->internal.usr_cb_fn = usr_cb_fn;
41 37 : fsdev_io->internal.usr_cb_arg = usr_cb_arg;
42 37 : fsdev_io->internal.cb_arg = cb_arg;
43 37 : fsdev_io->internal.cb_fn = cb_fn;
44 37 : fsdev_io->internal.status = -ENOSYS;
45 37 : fsdev_io->internal.in_submit_request = false;
46 :
47 37 : return fsdev_io;
48 : }
49 :
50 : static inline void
51 37 : fsdev_io_free(struct spdk_fsdev_io *fsdev_io)
52 : {
53 37 : spdk_fsdev_free_io(fsdev_io);
54 37 : }
55 :
56 : static void
57 2 : _spdk_fsdev_mount_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
58 : {
59 2 : struct spdk_io_channel *ch = cb_arg;
60 :
61 2 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_mount_cpl_cb, &fsdev_io->u_out.mount.opts,
62 : fsdev_io->u_out.mount.root_fobject);
63 :
64 2 : fsdev_io_free(fsdev_io);
65 2 : }
66 :
67 : int
68 2 : spdk_fsdev_mount(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch,
69 : uint64_t unique, const struct spdk_fsdev_mount_opts *opts,
70 : spdk_fsdev_mount_cpl_cb cb_fn, void *cb_arg)
71 : {
72 : struct spdk_fsdev_io *fsdev_io;
73 :
74 2 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_mount_cb, ch,
75 : SPDK_FSDEV_IO_MOUNT);
76 2 : if (!fsdev_io) {
77 0 : return -ENOBUFS;
78 : }
79 :
80 2 : fsdev_io->u_in.mount.opts = *opts;
81 :
82 2 : fsdev_io_submit(fsdev_io);
83 2 : return 0;
84 : }
85 :
86 : static void
87 1 : _spdk_fsdev_umount_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
88 : {
89 1 : struct spdk_io_channel *ch = cb_arg;
90 :
91 1 : CALL_USR_NO_STATUS_CLB(fsdev_io, ch, spdk_fsdev_umount_cpl_cb);
92 :
93 1 : fsdev_io_free(fsdev_io);
94 1 : }
95 :
96 : int
97 1 : spdk_fsdev_umount(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch,
98 : uint64_t unique, spdk_fsdev_umount_cpl_cb cb_fn, void *cb_arg)
99 : {
100 : struct spdk_fsdev_io *fsdev_io;
101 :
102 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_umount_cb, ch,
103 : SPDK_FSDEV_IO_UMOUNT);
104 1 : if (!fsdev_io) {
105 0 : return -ENOBUFS;
106 : }
107 :
108 1 : fsdev_io_submit(fsdev_io);
109 1 : return 0;
110 :
111 : }
112 :
113 : static void
114 2 : _spdk_fsdev_lookup_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
115 : {
116 2 : struct spdk_io_channel *ch = cb_arg;
117 :
118 2 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_lookup_cpl_cb, fsdev_io->u_out.lookup.fobject,
119 : &fsdev_io->u_out.lookup.attr);
120 :
121 2 : free(fsdev_io->u_in.lookup.name);
122 2 : fsdev_io_free(fsdev_io);
123 2 : }
124 :
125 : int
126 2 : spdk_fsdev_lookup(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
127 : struct spdk_fsdev_file_object *parent_fobject, const char *name,
128 : spdk_fsdev_lookup_cpl_cb cb_fn, void *cb_arg)
129 : {
130 : struct spdk_fsdev_io *fsdev_io;
131 :
132 2 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_lookup_cb, ch,
133 : SPDK_FSDEV_IO_LOOKUP);
134 2 : if (!fsdev_io) {
135 0 : return -ENOBUFS;
136 : }
137 :
138 2 : fsdev_io->u_in.lookup.name = strdup(name);
139 2 : if (!fsdev_io->u_in.lookup.name) {
140 0 : fsdev_io_free(fsdev_io);
141 0 : return -ENOMEM;
142 : }
143 :
144 2 : fsdev_io->u_in.lookup.parent_fobject = parent_fobject;
145 :
146 2 : fsdev_io_submit(fsdev_io);
147 2 : return 0;
148 : }
149 :
150 : static void
151 1 : _spdk_fsdev_forget_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
152 : {
153 1 : struct spdk_io_channel *ch = cb_arg;
154 :
155 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_forget_cpl_cb);
156 :
157 1 : fsdev_io_free(fsdev_io);
158 1 : }
159 :
160 : int
161 1 : spdk_fsdev_forget(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
162 : struct spdk_fsdev_file_object *fobject, uint64_t nlookup,
163 : spdk_fsdev_forget_cpl_cb cb_fn, void *cb_arg)
164 : {
165 : struct spdk_fsdev_io *fsdev_io;
166 :
167 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_forget_cb, ch,
168 : SPDK_FSDEV_IO_FORGET);
169 1 : if (!fsdev_io) {
170 0 : return -ENOBUFS;
171 : }
172 :
173 1 : fsdev_io->u_in.forget.fobject = fobject;
174 1 : fsdev_io->u_in.forget.nlookup = nlookup;
175 :
176 1 : fsdev_io_submit(fsdev_io);
177 1 : return 0;
178 : }
179 :
180 : static void
181 1 : _spdk_fsdev_getattr_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
182 : {
183 1 : struct spdk_io_channel *ch = cb_arg;
184 :
185 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_getattr_cpl_cb, &fsdev_io->u_out.getattr.attr);
186 :
187 1 : fsdev_io_free(fsdev_io);
188 1 : }
189 :
190 : int
191 1 : spdk_fsdev_getattr(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
192 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
193 : spdk_fsdev_getattr_cpl_cb cb_fn, void *cb_arg)
194 : {
195 : struct spdk_fsdev_io *fsdev_io;
196 :
197 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_getattr_cb, ch,
198 : SPDK_FSDEV_IO_GETATTR);
199 1 : if (!fsdev_io) {
200 0 : return -ENOBUFS;
201 : }
202 :
203 1 : fsdev_io->u_in.getattr.fobject = fobject;
204 1 : fsdev_io->u_in.getattr.fhandle = fhandle;
205 :
206 1 : fsdev_io_submit(fsdev_io);
207 1 : return 0;
208 : }
209 :
210 : static void
211 1 : _spdk_fsdev_setattr_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
212 : {
213 1 : struct spdk_io_channel *ch = cb_arg;
214 :
215 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_setattr_cpl_cb, &fsdev_io->u_out.setattr.attr);
216 :
217 1 : fsdev_io_free(fsdev_io);
218 1 : }
219 :
220 : int
221 1 : spdk_fsdev_setattr(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
222 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
223 : const struct spdk_fsdev_file_attr *attr, uint32_t to_set,
224 : spdk_fsdev_setattr_cpl_cb cb_fn, void *cb_arg)
225 : {
226 : struct spdk_fsdev_io *fsdev_io;
227 :
228 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_setattr_cb, ch,
229 : SPDK_FSDEV_IO_SETATTR);
230 1 : if (!fsdev_io) {
231 0 : return -ENOBUFS;
232 : }
233 :
234 1 : fsdev_io->u_in.setattr.fobject = fobject;
235 1 : fsdev_io->u_in.setattr.fhandle = fhandle;
236 1 : fsdev_io->u_in.setattr.attr = *attr;
237 1 : fsdev_io->u_in.setattr.to_set = to_set;
238 :
239 1 : fsdev_io_submit(fsdev_io);
240 1 : return 0;
241 : }
242 :
243 : static void
244 1 : _spdk_fsdev_readlink_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
245 : {
246 1 : struct spdk_io_channel *ch = cb_arg;
247 :
248 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_readlink_cpl_cb, fsdev_io->u_out.readlink.linkname);
249 :
250 1 : free(fsdev_io->u_out.readlink.linkname);
251 1 : fsdev_io_free(fsdev_io);
252 1 : }
253 :
254 : int
255 1 : spdk_fsdev_readlink(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
256 : struct spdk_fsdev_file_object *fobject, spdk_fsdev_readlink_cpl_cb cb_fn, void *cb_arg)
257 : {
258 : struct spdk_fsdev_io *fsdev_io;
259 :
260 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_readlink_cb, ch,
261 : SPDK_FSDEV_IO_READLINK);
262 1 : if (!fsdev_io) {
263 0 : return -ENOBUFS;
264 : }
265 :
266 1 : fsdev_io->u_in.readlink.fobject = fobject;
267 1 : fsdev_io->u_out.readlink.linkname = NULL;
268 :
269 1 : fsdev_io_submit(fsdev_io);
270 1 : return 0;
271 : }
272 :
273 : static void
274 1 : _spdk_fsdev_symlink_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
275 : {
276 1 : struct spdk_io_channel *ch = cb_arg;
277 :
278 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_symlink_cpl_cb, fsdev_io->u_out.symlink.fobject,
279 : &fsdev_io->u_out.symlink.attr);
280 :
281 1 : free(fsdev_io->u_in.symlink.target);
282 1 : free(fsdev_io->u_in.symlink.linkpath);
283 :
284 1 : fsdev_io_free(fsdev_io);
285 1 : }
286 :
287 : int
288 1 : spdk_fsdev_symlink(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
289 : struct spdk_fsdev_file_object *parent_fobject, const char *target, const char *linkpath,
290 : uid_t euid, gid_t egid, spdk_fsdev_symlink_cpl_cb cb_fn, void *cb_arg)
291 : {
292 : struct spdk_fsdev_io *fsdev_io;
293 :
294 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_symlink_cb, ch,
295 : SPDK_FSDEV_IO_SYMLINK);
296 1 : if (!fsdev_io) {
297 0 : return -ENOBUFS;
298 : }
299 :
300 1 : fsdev_io->u_in.symlink.target = strdup(target);
301 1 : if (!fsdev_io->u_in.symlink.target) {
302 0 : fsdev_io_free(fsdev_io);
303 0 : return -ENOMEM;
304 : }
305 :
306 1 : fsdev_io->u_in.symlink.linkpath = strdup(linkpath);
307 1 : if (!fsdev_io) {
308 0 : fsdev_io_free(fsdev_io);
309 0 : free(fsdev_io->u_in.symlink.target);
310 0 : return -ENOMEM;
311 : }
312 :
313 1 : fsdev_io->u_in.symlink.parent_fobject = parent_fobject;
314 1 : fsdev_io->u_in.symlink.euid = euid;
315 1 : fsdev_io->u_in.symlink.egid = egid;
316 :
317 1 : fsdev_io_submit(fsdev_io);
318 1 : return 0;
319 : }
320 :
321 : static void
322 1 : _spdk_fsdev_mknod_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
323 : {
324 1 : struct spdk_io_channel *ch = cb_arg;
325 :
326 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_mknod_cpl_cb, fsdev_io->u_out.mknod.fobject,
327 : &fsdev_io->u_out.mknod.attr);
328 :
329 1 : free(fsdev_io->u_in.mknod.name);
330 :
331 1 : fsdev_io_free(fsdev_io);
332 1 : }
333 :
334 : int
335 1 : spdk_fsdev_mknod(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
336 : struct spdk_fsdev_file_object *parent_fobject, const char *name, mode_t mode, dev_t rdev,
337 : uid_t euid, gid_t egid, spdk_fsdev_mknod_cpl_cb cb_fn, void *cb_arg)
338 : {
339 : struct spdk_fsdev_io *fsdev_io;
340 :
341 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_mknod_cb, ch,
342 : SPDK_FSDEV_IO_MKNOD);
343 1 : if (!fsdev_io) {
344 0 : return -ENOBUFS;
345 : }
346 :
347 1 : fsdev_io->u_in.mknod.name = strdup(name);
348 1 : if (!fsdev_io->u_in.mknod.name) {
349 0 : fsdev_io_free(fsdev_io);
350 0 : return -ENOMEM;
351 : }
352 :
353 1 : fsdev_io->u_in.mknod.parent_fobject = parent_fobject;
354 1 : fsdev_io->u_in.mknod.mode = mode;
355 1 : fsdev_io->u_in.mknod.rdev = rdev;
356 1 : fsdev_io->u_in.mknod.euid = euid;
357 1 : fsdev_io->u_in.mknod.egid = egid;
358 :
359 1 : fsdev_io_submit(fsdev_io);
360 1 : return 0;
361 : }
362 :
363 : static void
364 1 : _spdk_fsdev_mkdir_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
365 : {
366 1 : struct spdk_io_channel *ch = cb_arg;
367 :
368 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_mkdir_cpl_cb, fsdev_io->u_out.mkdir.fobject,
369 : &fsdev_io->u_out.mkdir.attr);
370 :
371 1 : free(fsdev_io->u_in.mkdir.name);
372 :
373 1 : fsdev_io_free(fsdev_io);
374 1 : }
375 :
376 : int
377 1 : spdk_fsdev_mkdir(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
378 : struct spdk_fsdev_file_object *parent_fobject, const char *name, mode_t mode,
379 : uid_t euid, gid_t egid, spdk_fsdev_mkdir_cpl_cb cb_fn, void *cb_arg)
380 : {
381 : struct spdk_fsdev_io *fsdev_io;
382 :
383 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_mkdir_cb, ch,
384 : SPDK_FSDEV_IO_MKDIR);
385 1 : if (!fsdev_io) {
386 0 : return -ENOBUFS;
387 : }
388 :
389 1 : fsdev_io->u_in.mkdir.name = strdup(name);
390 1 : if (!fsdev_io->u_in.mkdir.name) {
391 0 : fsdev_io_free(fsdev_io);
392 0 : return -ENOMEM;
393 : }
394 :
395 1 : fsdev_io->u_in.mkdir.parent_fobject = parent_fobject;
396 1 : fsdev_io->u_in.mkdir.mode = mode;
397 1 : fsdev_io->u_in.mkdir.euid = euid;
398 1 : fsdev_io->u_in.mkdir.egid = egid;
399 :
400 1 : fsdev_io_submit(fsdev_io);
401 1 : return 0;
402 : }
403 :
404 : static void
405 1 : _spdk_fsdev_unlink_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
406 : {
407 1 : struct spdk_io_channel *ch = cb_arg;
408 :
409 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_unlink_cpl_cb);
410 :
411 1 : free(fsdev_io->u_in.unlink.name);
412 :
413 1 : fsdev_io_free(fsdev_io);
414 1 : }
415 :
416 : int
417 1 : spdk_fsdev_unlink(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
418 : struct spdk_fsdev_file_object *parent_fobject, const char *name,
419 : spdk_fsdev_unlink_cpl_cb cb_fn, void *cb_arg)
420 : {
421 : struct spdk_fsdev_io *fsdev_io;
422 :
423 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_unlink_cb, ch,
424 : SPDK_FSDEV_IO_UNLINK);
425 1 : if (!fsdev_io) {
426 0 : return -ENOBUFS;
427 : }
428 :
429 1 : fsdev_io->u_in.unlink.name = strdup(name);
430 1 : if (!fsdev_io->u_in.unlink.name) {
431 0 : fsdev_io_free(fsdev_io);
432 0 : return -ENOMEM;
433 : }
434 :
435 1 : fsdev_io->u_in.unlink.parent_fobject = parent_fobject;
436 :
437 1 : fsdev_io_submit(fsdev_io);
438 1 : return 0;
439 : }
440 :
441 : static void
442 1 : _spdk_fsdev_rmdir_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
443 : {
444 1 : struct spdk_io_channel *ch = cb_arg;
445 :
446 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_rmdir_cpl_cb);
447 :
448 1 : free(fsdev_io->u_in.rmdir.name);
449 :
450 1 : fsdev_io_free(fsdev_io);
451 1 : }
452 :
453 : int
454 1 : spdk_fsdev_rmdir(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
455 : struct spdk_fsdev_file_object *parent_fobject, const char *name,
456 : spdk_fsdev_rmdir_cpl_cb cb_fn, void *cb_arg)
457 : {
458 : struct spdk_fsdev_io *fsdev_io;
459 :
460 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_rmdir_cb, ch,
461 : SPDK_FSDEV_IO_RMDIR);
462 1 : if (!fsdev_io) {
463 0 : return -ENOBUFS;
464 : }
465 :
466 1 : fsdev_io->u_in.rmdir.name = strdup(name);
467 1 : if (!fsdev_io->u_in.rmdir.name) {
468 0 : fsdev_io_free(fsdev_io);
469 0 : return -ENOMEM;
470 : }
471 :
472 1 : fsdev_io->u_in.rmdir.parent_fobject = parent_fobject;
473 :
474 1 : fsdev_io_submit(fsdev_io);
475 1 : return 0;
476 : }
477 :
478 : static void
479 1 : _spdk_fsdev_rename_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
480 : {
481 1 : struct spdk_io_channel *ch = cb_arg;
482 :
483 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_rename_cpl_cb);
484 :
485 1 : free(fsdev_io->u_in.rename.name);
486 1 : free(fsdev_io->u_in.rename.new_name);
487 :
488 1 : fsdev_io_free(fsdev_io);
489 1 : }
490 :
491 : int
492 1 : spdk_fsdev_rename(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
493 : struct spdk_fsdev_file_object *parent_fobject, const char *name,
494 : struct spdk_fsdev_file_object *new_parent_fobject, const char *new_name,
495 : uint32_t flags, spdk_fsdev_rename_cpl_cb cb_fn, void *cb_arg)
496 : {
497 : struct spdk_fsdev_io *fsdev_io;
498 :
499 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_rename_cb, ch,
500 : SPDK_FSDEV_IO_RENAME);
501 1 : if (!fsdev_io) {
502 0 : return -ENOBUFS;
503 : }
504 :
505 1 : fsdev_io->u_in.rename.name = strdup(name);
506 1 : if (!fsdev_io->u_in.rename.name) {
507 0 : fsdev_io_free(fsdev_io);
508 0 : return -ENOMEM;
509 : }
510 :
511 1 : fsdev_io->u_in.rename.new_name = strdup(new_name);
512 1 : if (!fsdev_io->u_in.rename.new_name) {
513 0 : free(fsdev_io->u_in.rename.name);
514 0 : fsdev_io_free(fsdev_io);
515 0 : return -ENOMEM;
516 : }
517 :
518 1 : fsdev_io->u_in.rename.parent_fobject = parent_fobject;
519 1 : fsdev_io->u_in.rename.new_parent_fobject = new_parent_fobject;
520 1 : fsdev_io->u_in.rename.flags = flags;
521 :
522 1 : fsdev_io_submit(fsdev_io);
523 1 : return 0;
524 : }
525 :
526 : static void
527 1 : _spdk_fsdev_link_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
528 : {
529 1 : struct spdk_io_channel *ch = cb_arg;
530 :
531 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_link_cpl_cb, fsdev_io->u_out.link.fobject,
532 : &fsdev_io->u_out.link.attr);
533 :
534 1 : free(fsdev_io->u_in.link.name);
535 :
536 1 : fsdev_io_free(fsdev_io);
537 1 : }
538 :
539 : int
540 1 : spdk_fsdev_link(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
541 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_object *new_parent_fobject,
542 : const char *name, spdk_fsdev_link_cpl_cb cb_fn, void *cb_arg)
543 : {
544 : struct spdk_fsdev_io *fsdev_io;
545 :
546 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_link_cb, ch,
547 : SPDK_FSDEV_IO_LINK);
548 1 : if (!fsdev_io) {
549 0 : return -ENOBUFS;
550 : }
551 :
552 1 : fsdev_io->u_in.link.name = strdup(name);
553 1 : if (!fsdev_io->u_in.link.name) {
554 0 : fsdev_io_free(fsdev_io);
555 0 : return -ENOMEM;
556 : }
557 :
558 1 : fsdev_io->u_in.link.fobject = fobject;
559 1 : fsdev_io->u_in.link.new_parent_fobject = new_parent_fobject;
560 :
561 1 : fsdev_io_submit(fsdev_io);
562 1 : return 0;
563 : }
564 :
565 : static void
566 1 : _spdk_fsdev_fopen_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
567 : {
568 1 : struct spdk_io_channel *ch = cb_arg;
569 :
570 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_fopen_cpl_cb, fsdev_io->u_out.open.fhandle);
571 :
572 1 : fsdev_io_free(fsdev_io);
573 1 : }
574 :
575 : int
576 1 : spdk_fsdev_fopen(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
577 : struct spdk_fsdev_file_object *fobject, uint32_t flags,
578 : spdk_fsdev_fopen_cpl_cb cb_fn, void *cb_arg)
579 : {
580 : struct spdk_fsdev_io *fsdev_io;
581 :
582 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_fopen_cb, ch,
583 : SPDK_FSDEV_IO_OPEN);
584 1 : if (!fsdev_io) {
585 0 : return -ENOBUFS;
586 : }
587 :
588 1 : fsdev_io->u_in.open.fobject = fobject;
589 1 : fsdev_io->u_in.open.flags = flags;
590 :
591 1 : fsdev_io_submit(fsdev_io);
592 1 : return 0;
593 : }
594 :
595 : static void
596 1 : _spdk_fsdev_read_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
597 : {
598 1 : struct spdk_io_channel *ch = cb_arg;
599 :
600 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_read_cpl_cb, fsdev_io->u_out.read.data_size);
601 :
602 1 : fsdev_io_free(fsdev_io);
603 1 : }
604 :
605 : int
606 1 : spdk_fsdev_read(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
607 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
608 : size_t size, uint64_t offs, uint32_t flags,
609 : struct iovec *iov, uint32_t iovcnt, struct spdk_fsdev_io_opts *opts,
610 : spdk_fsdev_read_cpl_cb cb_fn, void *cb_arg)
611 : {
612 : struct spdk_fsdev_io *fsdev_io;
613 :
614 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_read_cb, ch,
615 : SPDK_FSDEV_IO_READ);
616 1 : if (!fsdev_io) {
617 0 : return -ENOBUFS;
618 : }
619 :
620 1 : fsdev_io->u_in.read.fobject = fobject;
621 1 : fsdev_io->u_in.read.fhandle = fhandle;
622 1 : fsdev_io->u_in.read.size = size;
623 1 : fsdev_io->u_in.read.offs = offs;
624 1 : fsdev_io->u_in.read.flags = flags;
625 1 : fsdev_io->u_in.read.iov = iov;
626 1 : fsdev_io->u_in.read.iovcnt = iovcnt;
627 1 : fsdev_io->u_in.read.opts = opts;
628 :
629 1 : fsdev_io_submit(fsdev_io);
630 1 : return 0;
631 : }
632 :
633 : static void
634 1 : _spdk_fsdev_write_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
635 : {
636 1 : struct spdk_io_channel *ch = cb_arg;
637 :
638 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_write_cpl_cb, fsdev_io->u_out.write.data_size);
639 :
640 1 : fsdev_io_free(fsdev_io);
641 1 : }
642 :
643 : int
644 1 : spdk_fsdev_write(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
645 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
646 : size_t size, uint64_t offs, uint64_t flags,
647 : const struct iovec *iov, uint32_t iovcnt, struct spdk_fsdev_io_opts *opts,
648 : spdk_fsdev_write_cpl_cb cb_fn, void *cb_arg)
649 : {
650 : struct spdk_fsdev_io *fsdev_io;
651 :
652 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_write_cb, ch,
653 : SPDK_FSDEV_IO_WRITE);
654 1 : if (!fsdev_io) {
655 0 : return -ENOBUFS;
656 : }
657 :
658 1 : fsdev_io->u_in.write.fobject = fobject;
659 1 : fsdev_io->u_in.write.fhandle = fhandle;
660 1 : fsdev_io->u_in.write.size = size;
661 1 : fsdev_io->u_in.write.offs = offs;
662 1 : fsdev_io->u_in.write.flags = flags;
663 1 : fsdev_io->u_in.write.iov = iov;
664 1 : fsdev_io->u_in.write.iovcnt = iovcnt;
665 1 : fsdev_io->u_in.write.opts = opts;
666 :
667 1 : fsdev_io_submit(fsdev_io);
668 1 : return 0;
669 : }
670 :
671 : static void
672 1 : _spdk_fsdev_statfs_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
673 : {
674 1 : struct spdk_io_channel *ch = cb_arg;
675 :
676 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_statfs_cpl_cb, &fsdev_io->u_out.statfs.statfs);
677 :
678 1 : fsdev_io_free(fsdev_io);
679 1 : }
680 :
681 : int
682 1 : spdk_fsdev_statfs(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
683 : struct spdk_fsdev_file_object *fobject, spdk_fsdev_statfs_cpl_cb cb_fn, void *cb_arg)
684 : {
685 : struct spdk_fsdev_io *fsdev_io;
686 :
687 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_statfs_cb, ch,
688 : SPDK_FSDEV_IO_STATFS);
689 1 : if (!fsdev_io) {
690 0 : return -ENOBUFS;
691 : }
692 :
693 1 : fsdev_io->u_in.statfs.fobject = fobject;
694 :
695 1 : fsdev_io_submit(fsdev_io);
696 1 : return 0;
697 : }
698 :
699 : static void
700 1 : _spdk_fsdev_release_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
701 : {
702 1 : struct spdk_io_channel *ch = cb_arg;
703 :
704 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_release_cpl_cb);
705 :
706 1 : fsdev_io_free(fsdev_io);
707 1 : }
708 :
709 : int
710 1 : spdk_fsdev_release(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
711 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
712 : spdk_fsdev_release_cpl_cb cb_fn, void *cb_arg)
713 : {
714 : struct spdk_fsdev_io *fsdev_io;
715 :
716 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_release_cb, ch,
717 : SPDK_FSDEV_IO_RELEASE);
718 1 : if (!fsdev_io) {
719 0 : return -ENOBUFS;
720 : }
721 :
722 1 : fsdev_io->u_in.release.fobject = fobject;
723 1 : fsdev_io->u_in.release.fhandle = fhandle;
724 :
725 1 : fsdev_io_submit(fsdev_io);
726 1 : return 0;
727 : }
728 :
729 : static void
730 1 : _spdk_fsdev_fsync_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
731 : {
732 1 : struct spdk_io_channel *ch = cb_arg;
733 :
734 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_fsync_cpl_cb);
735 :
736 1 : fsdev_io_free(fsdev_io);
737 1 : }
738 :
739 : int
740 1 : spdk_fsdev_fsync(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
741 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle, bool datasync,
742 : spdk_fsdev_fsync_cpl_cb cb_fn, void *cb_arg)
743 : {
744 : struct spdk_fsdev_io *fsdev_io;
745 :
746 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_fsync_cb, ch,
747 : SPDK_FSDEV_IO_FSYNC);
748 1 : if (!fsdev_io) {
749 0 : return -ENOBUFS;
750 : }
751 :
752 1 : fsdev_io->u_in.fsync.fobject = fobject;
753 1 : fsdev_io->u_in.fsync.fhandle = fhandle;
754 1 : fsdev_io->u_in.fsync.datasync = datasync;
755 :
756 1 : fsdev_io_submit(fsdev_io);
757 1 : return 0;
758 : }
759 :
760 : static void
761 1 : _spdk_fsdev_setxattr_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
762 : {
763 1 : struct spdk_io_channel *ch = cb_arg;
764 :
765 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_setxattr_cpl_cb);
766 :
767 1 : free(fsdev_io->u_in.setxattr.value);
768 1 : free(fsdev_io->u_in.setxattr.name);
769 :
770 1 : fsdev_io_free(fsdev_io);
771 1 : }
772 :
773 : int
774 1 : spdk_fsdev_setxattr(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
775 : struct spdk_fsdev_file_object *fobject, const char *name, const char *value, size_t size,
776 : uint32_t flags, spdk_fsdev_setxattr_cpl_cb cb_fn, void *cb_arg)
777 : {
778 : struct spdk_fsdev_io *fsdev_io;
779 :
780 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_setxattr_cb, ch,
781 : SPDK_FSDEV_IO_SETXATTR);
782 1 : if (!fsdev_io) {
783 0 : return -ENOBUFS;
784 : }
785 :
786 1 : fsdev_io->u_in.setxattr.name = strdup(name);
787 1 : if (!fsdev_io->u_in.setxattr.name) {
788 0 : fsdev_io_free(fsdev_io);
789 0 : return -ENOMEM;
790 : }
791 :
792 1 : fsdev_io->u_in.setxattr.value = malloc(size);
793 1 : if (!fsdev_io->u_in.setxattr.value) {
794 0 : free(fsdev_io->u_in.setxattr.name);
795 0 : fsdev_io_free(fsdev_io);
796 0 : return -ENOMEM;
797 : }
798 :
799 1 : memcpy(fsdev_io->u_in.setxattr.value, value, size);
800 1 : fsdev_io->u_in.setxattr.fobject = fobject;
801 1 : fsdev_io->u_in.setxattr.size = size;
802 1 : fsdev_io->u_in.setxattr.flags = flags;
803 :
804 1 : fsdev_io_submit(fsdev_io);
805 1 : return 0;
806 : }
807 :
808 : static void
809 1 : _spdk_fsdev_getxattr_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
810 : {
811 1 : struct spdk_io_channel *ch = cb_arg;
812 :
813 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_getxattr_cpl_cb, fsdev_io->u_out.getxattr.value_size);
814 :
815 1 : free(fsdev_io->u_in.getxattr.name);
816 :
817 1 : fsdev_io_free(fsdev_io);
818 1 : }
819 :
820 : int
821 1 : spdk_fsdev_getxattr(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
822 : struct spdk_fsdev_file_object *fobject, const char *name, void *buffer, size_t size,
823 : spdk_fsdev_getxattr_cpl_cb cb_fn, void *cb_arg)
824 : {
825 : struct spdk_fsdev_io *fsdev_io;
826 :
827 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_getxattr_cb, ch,
828 : SPDK_FSDEV_IO_GETXATTR);
829 1 : if (!fsdev_io) {
830 0 : return -ENOBUFS;
831 : }
832 :
833 1 : fsdev_io->u_in.getxattr.name = strdup(name);
834 1 : if (!fsdev_io->u_in.getxattr.name) {
835 0 : fsdev_io_free(fsdev_io);
836 0 : return -ENOMEM;
837 : }
838 :
839 1 : fsdev_io->u_in.getxattr.fobject = fobject;
840 1 : fsdev_io->u_in.getxattr.buffer = buffer;
841 1 : fsdev_io->u_in.getxattr.size = size;
842 :
843 1 : fsdev_io_submit(fsdev_io);
844 1 : return 0;
845 : }
846 :
847 : static void
848 2 : _spdk_fsdev_listxattr_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
849 : {
850 2 : struct spdk_io_channel *ch = cb_arg;
851 :
852 2 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_listxattr_cpl_cb, fsdev_io->u_out.listxattr.data_size,
853 : fsdev_io->u_out.listxattr.size_only);
854 :
855 2 : fsdev_io_free(fsdev_io);
856 2 : }
857 :
858 : int
859 2 : spdk_fsdev_listxattr(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
860 : struct spdk_fsdev_file_object *fobject, char *buffer, size_t size,
861 : spdk_fsdev_listxattr_cpl_cb cb_fn, void *cb_arg)
862 : {
863 : struct spdk_fsdev_io *fsdev_io;
864 :
865 2 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_listxattr_cb, ch,
866 : SPDK_FSDEV_IO_LISTXATTR);
867 2 : if (!fsdev_io) {
868 0 : return -ENOBUFS;
869 : }
870 :
871 2 : fsdev_io->u_in.listxattr.fobject = fobject;
872 2 : fsdev_io->u_in.listxattr.buffer = buffer;
873 2 : fsdev_io->u_in.listxattr.size = size;
874 :
875 2 : fsdev_io_submit(fsdev_io);
876 2 : return 0;
877 : }
878 :
879 : static void
880 1 : _spdk_fsdev_removexattr_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
881 : {
882 1 : struct spdk_io_channel *ch = cb_arg;
883 :
884 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_removexattr_cpl_cb);
885 :
886 1 : free(fsdev_io->u_in.removexattr.name);
887 :
888 1 : fsdev_io_free(fsdev_io);
889 1 : }
890 :
891 : int
892 1 : spdk_fsdev_removexattr(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
893 : struct spdk_fsdev_file_object *fobject, const char *name,
894 : spdk_fsdev_removexattr_cpl_cb cb_fn, void *cb_arg)
895 : {
896 : struct spdk_fsdev_io *fsdev_io;
897 :
898 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_removexattr_cb, ch,
899 : SPDK_FSDEV_IO_REMOVEXATTR);
900 1 : if (!fsdev_io) {
901 0 : return -ENOBUFS;
902 : }
903 :
904 1 : fsdev_io->u_in.removexattr.name = strdup(name);
905 1 : if (!fsdev_io->u_in.removexattr.name) {
906 0 : fsdev_io_free(fsdev_io);
907 0 : return -ENOMEM;
908 : }
909 :
910 1 : fsdev_io->u_in.removexattr.fobject = fobject;
911 :
912 1 : fsdev_io_submit(fsdev_io);
913 1 : return 0;
914 : }
915 :
916 : static void
917 1 : _spdk_fsdev_flush_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
918 : {
919 1 : struct spdk_io_channel *ch = cb_arg;
920 :
921 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_flush_cpl_cb);
922 :
923 1 : fsdev_io_free(fsdev_io);
924 1 : }
925 :
926 : int
927 1 : spdk_fsdev_flush(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
928 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
929 : spdk_fsdev_flush_cpl_cb cb_fn, void *cb_arg)
930 : {
931 : struct spdk_fsdev_io *fsdev_io;
932 :
933 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_flush_cb, ch,
934 : SPDK_FSDEV_IO_FLUSH);
935 1 : if (!fsdev_io) {
936 0 : return -ENOBUFS;
937 : }
938 :
939 1 : fsdev_io->u_in.flush.fobject = fobject;
940 1 : fsdev_io->u_in.flush.fhandle = fhandle;
941 :
942 1 : fsdev_io_submit(fsdev_io);
943 1 : return 0;
944 : }
945 :
946 : static void
947 1 : _spdk_fsdev_opendir_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
948 : {
949 1 : struct spdk_io_channel *ch = cb_arg;
950 :
951 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_opendir_cpl_cb, fsdev_io->u_out.opendir.fhandle);
952 :
953 1 : fsdev_io_free(fsdev_io);
954 1 : }
955 :
956 : int
957 1 : spdk_fsdev_opendir(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
958 : struct spdk_fsdev_file_object *fobject, uint32_t flags,
959 : spdk_fsdev_opendir_cpl_cb cb_fn, void *cb_arg)
960 : {
961 : struct spdk_fsdev_io *fsdev_io;
962 :
963 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_opendir_cb, ch,
964 : SPDK_FSDEV_IO_OPENDIR);
965 1 : if (!fsdev_io) {
966 0 : return -ENOBUFS;
967 : }
968 :
969 1 : fsdev_io->u_in.opendir.fobject = fobject;
970 1 : fsdev_io->u_in.opendir.flags = flags;
971 :
972 1 : fsdev_io_submit(fsdev_io);
973 1 : return 0;
974 : }
975 :
976 : static int
977 20 : _spdk_fsdev_readdir_entry_clb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
978 : {
979 20 : spdk_fsdev_readdir_entry_cb *usr_entry_cb_fn = fsdev_io->u_in.readdir.usr_entry_cb_fn;
980 20 : struct spdk_io_channel *ch = cb_arg;
981 :
982 40 : return usr_entry_cb_fn(fsdev_io->internal.usr_cb_arg, ch, fsdev_io->u_out.readdir.name,
983 20 : fsdev_io->u_out.readdir.fobject, &fsdev_io->u_out.readdir.attr, fsdev_io->u_out.readdir.offset);
984 : }
985 :
986 : static void
987 1 : _spdk_fsdev_readdir_emum_clb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
988 : {
989 1 : struct spdk_io_channel *ch = cb_arg;
990 :
991 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_readdir_cpl_cb);
992 :
993 1 : fsdev_io_free(fsdev_io);
994 1 : }
995 :
996 : int
997 1 : spdk_fsdev_readdir(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
998 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle, uint64_t offset,
999 : spdk_fsdev_readdir_entry_cb entry_cb_fn, spdk_fsdev_readdir_cpl_cb cpl_cb_fn, void *cb_arg)
1000 : {
1001 : struct spdk_fsdev_io *fsdev_io;
1002 :
1003 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cpl_cb_fn, cb_arg,
1004 : _spdk_fsdev_readdir_emum_clb, ch, SPDK_FSDEV_IO_READDIR);
1005 1 : if (!fsdev_io) {
1006 0 : return -ENOBUFS;
1007 : }
1008 :
1009 1 : fsdev_io->u_in.readdir.fobject = fobject;
1010 1 : fsdev_io->u_in.readdir.fhandle = fhandle;
1011 1 : fsdev_io->u_in.readdir.offset = offset;
1012 1 : fsdev_io->u_in.readdir.entry_cb_fn = _spdk_fsdev_readdir_entry_clb;
1013 1 : fsdev_io->u_in.readdir.usr_entry_cb_fn = entry_cb_fn;
1014 :
1015 1 : fsdev_io_submit(fsdev_io);
1016 1 : return 0;
1017 : }
1018 :
1019 : static void
1020 1 : _spdk_fsdev_releasedir_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1021 : {
1022 1 : struct spdk_io_channel *ch = cb_arg;
1023 :
1024 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_releasedir_cpl_cb);
1025 :
1026 1 : fsdev_io_free(fsdev_io);
1027 1 : }
1028 :
1029 : int
1030 1 : spdk_fsdev_releasedir(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
1031 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
1032 : spdk_fsdev_releasedir_cpl_cb cb_fn, void *cb_arg)
1033 : {
1034 : struct spdk_fsdev_io *fsdev_io;
1035 :
1036 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_releasedir_cb, ch,
1037 : SPDK_FSDEV_IO_RELEASEDIR);
1038 1 : if (!fsdev_io) {
1039 0 : return -ENOBUFS;
1040 : }
1041 :
1042 1 : fsdev_io->u_in.releasedir.fobject = fobject;
1043 1 : fsdev_io->u_in.releasedir.fhandle = fhandle;
1044 :
1045 1 : fsdev_io_submit(fsdev_io);
1046 1 : return 0;
1047 : }
1048 :
1049 : static void
1050 1 : _spdk_fsdev_fsyncdir_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1051 : {
1052 1 : struct spdk_io_channel *ch = cb_arg;
1053 :
1054 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_fsyncdir_cpl_cb);
1055 :
1056 1 : fsdev_io_free(fsdev_io);
1057 1 : }
1058 :
1059 : int
1060 1 : spdk_fsdev_fsyncdir(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
1061 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle, bool datasync,
1062 : spdk_fsdev_fsyncdir_cpl_cb cb_fn, void *cb_arg)
1063 : {
1064 : struct spdk_fsdev_io *fsdev_io;
1065 :
1066 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_fsyncdir_cb, ch,
1067 : SPDK_FSDEV_IO_FSYNCDIR);
1068 1 : if (!fsdev_io) {
1069 0 : return -ENOBUFS;
1070 : }
1071 :
1072 1 : fsdev_io->u_in.fsyncdir.fobject = fobject;
1073 1 : fsdev_io->u_in.fsyncdir.fhandle = fhandle;
1074 1 : fsdev_io->u_in.fsyncdir.datasync = datasync;
1075 :
1076 1 : fsdev_io_submit(fsdev_io);
1077 1 : return 0;
1078 : }
1079 :
1080 : static void
1081 1 : _spdk_fsdev_flock_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1082 : {
1083 1 : struct spdk_io_channel *ch = cb_arg;
1084 :
1085 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_flock_cpl_cb);
1086 :
1087 1 : fsdev_io_free(fsdev_io);
1088 1 : }
1089 :
1090 : int
1091 1 : spdk_fsdev_flock(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
1092 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle, int operation,
1093 : spdk_fsdev_flock_cpl_cb cb_fn, void *cb_arg)
1094 : {
1095 : struct spdk_fsdev_io *fsdev_io;
1096 :
1097 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_flock_cb, ch,
1098 : SPDK_FSDEV_IO_FLOCK);
1099 1 : if (!fsdev_io) {
1100 0 : return -ENOBUFS;
1101 : }
1102 :
1103 1 : fsdev_io->u_in.flock.fobject = fobject;
1104 1 : fsdev_io->u_in.flock.fhandle = fhandle;
1105 1 : fsdev_io->u_in.flock.operation = operation;
1106 :
1107 1 : fsdev_io_submit(fsdev_io);
1108 1 : return 0;
1109 : }
1110 :
1111 : static void
1112 1 : _spdk_fsdev_create_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1113 : {
1114 1 : struct spdk_io_channel *ch = cb_arg;
1115 :
1116 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_create_cpl_cb, fsdev_io->u_out.create.fobject,
1117 : &fsdev_io->u_out.create.attr, fsdev_io->u_out.create.fhandle);
1118 :
1119 1 : free(fsdev_io->u_in.create.name);
1120 :
1121 1 : fsdev_io_free(fsdev_io);
1122 1 : }
1123 :
1124 : int
1125 1 : spdk_fsdev_create(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
1126 : struct spdk_fsdev_file_object *parent_fobject, const char *name, mode_t mode, uint32_t flags,
1127 : mode_t umask, uid_t euid, gid_t egid, spdk_fsdev_create_cpl_cb cb_fn, void *cb_arg)
1128 : {
1129 : struct spdk_fsdev_io *fsdev_io;
1130 :
1131 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_create_cb, ch,
1132 : SPDK_FSDEV_IO_CREATE);
1133 1 : if (!fsdev_io) {
1134 0 : return -ENOBUFS;
1135 : }
1136 :
1137 1 : fsdev_io->u_in.create.name = strdup(name);
1138 1 : if (!fsdev_io->u_in.create.name) {
1139 0 : fsdev_io_free(fsdev_io);
1140 0 : return -ENOMEM;
1141 : }
1142 :
1143 1 : fsdev_io->u_in.create.parent_fobject = parent_fobject;
1144 1 : fsdev_io->u_in.create.mode = mode;
1145 1 : fsdev_io->u_in.create.flags = flags;
1146 1 : fsdev_io->u_in.create.umask = umask;
1147 1 : fsdev_io->u_in.create.euid = euid;
1148 1 : fsdev_io->u_in.create.egid = egid;
1149 :
1150 1 : fsdev_io_submit(fsdev_io);
1151 1 : return 0;
1152 : }
1153 :
1154 : static void
1155 1 : _spdk_fsdev_interrupt_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1156 : {
1157 1 : struct spdk_io_channel *ch = cb_arg;
1158 :
1159 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_abort_cpl_cb);
1160 :
1161 1 : fsdev_io_free(fsdev_io);
1162 1 : }
1163 :
1164 : int
1165 1 : spdk_fsdev_abort(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch,
1166 : uint64_t unique_to_abort, spdk_fsdev_abort_cpl_cb cb_fn, void *cb_arg)
1167 : {
1168 : struct spdk_fsdev_io *fsdev_io;
1169 :
1170 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, 0, cb_fn, cb_arg, _spdk_fsdev_interrupt_cb, ch,
1171 : SPDK_FSDEV_IO_ABORT);
1172 1 : if (!fsdev_io) {
1173 0 : return -ENOBUFS;
1174 : }
1175 :
1176 1 : fsdev_io->u_in.abort.unique_to_abort = unique_to_abort;
1177 :
1178 1 : fsdev_io_submit(fsdev_io);
1179 1 : return 0;
1180 : }
1181 :
1182 : static void
1183 1 : _spdk_fsdev_fallocate_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1184 : {
1185 1 : struct spdk_io_channel *ch = cb_arg;
1186 :
1187 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_fallocate_cpl_cb);
1188 :
1189 1 : fsdev_io_free(fsdev_io);
1190 1 : }
1191 :
1192 : int
1193 1 : spdk_fsdev_fallocate(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch, uint64_t unique,
1194 : struct spdk_fsdev_file_object *fobject, struct spdk_fsdev_file_handle *fhandle,
1195 : int mode, off_t offset, off_t length,
1196 : spdk_fsdev_fallocate_cpl_cb cb_fn, void *cb_arg)
1197 : {
1198 : struct spdk_fsdev_io *fsdev_io;
1199 :
1200 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_fallocate_cb, ch,
1201 : SPDK_FSDEV_IO_FALLOCATE);
1202 1 : if (!fsdev_io) {
1203 0 : return -ENOBUFS;
1204 : }
1205 :
1206 1 : fsdev_io->u_in.fallocate.fobject = fobject;
1207 1 : fsdev_io->u_in.fallocate.fhandle = fhandle;
1208 1 : fsdev_io->u_in.fallocate.mode = mode;
1209 1 : fsdev_io->u_in.fallocate.offset = offset;
1210 1 : fsdev_io->u_in.fallocate.length = length;
1211 :
1212 1 : fsdev_io_submit(fsdev_io);
1213 1 : return 0;
1214 : }
1215 :
1216 : static void
1217 1 : _spdk_fsdev_copy_file_range_cb(struct spdk_fsdev_io *fsdev_io, void *cb_arg)
1218 : {
1219 1 : struct spdk_io_channel *ch = cb_arg;
1220 :
1221 1 : CALL_USR_CLB(fsdev_io, ch, spdk_fsdev_copy_file_range_cpl_cb,
1222 : fsdev_io->u_out.copy_file_range.data_size);
1223 :
1224 1 : fsdev_io_free(fsdev_io);
1225 1 : }
1226 :
1227 : int
1228 1 : spdk_fsdev_copy_file_range(struct spdk_fsdev_desc *desc, struct spdk_io_channel *ch,
1229 : uint64_t unique,
1230 : struct spdk_fsdev_file_object *fobject_in, struct spdk_fsdev_file_handle *fhandle_in, off_t off_in,
1231 : struct spdk_fsdev_file_object *fobject_out, struct spdk_fsdev_file_handle *fhandle_out,
1232 : off_t off_out, size_t len, uint32_t flags,
1233 : spdk_fsdev_copy_file_range_cpl_cb cb_fn, void *cb_arg)
1234 : {
1235 : struct spdk_fsdev_io *fsdev_io;
1236 :
1237 1 : fsdev_io = fsdev_io_get_and_fill(desc, ch, unique, cb_fn, cb_arg, _spdk_fsdev_copy_file_range_cb,
1238 : ch,
1239 : SPDK_FSDEV_IO_COPY_FILE_RANGE);
1240 1 : if (!fsdev_io) {
1241 0 : return -ENOBUFS;
1242 : }
1243 :
1244 1 : fsdev_io->u_in.copy_file_range.fobject_in = fobject_in;
1245 1 : fsdev_io->u_in.copy_file_range.fhandle_in = fhandle_in;
1246 1 : fsdev_io->u_in.copy_file_range.off_in = off_in;
1247 1 : fsdev_io->u_in.copy_file_range.fobject_out = fobject_out;
1248 1 : fsdev_io->u_in.copy_file_range.fhandle_out = fhandle_out;
1249 1 : fsdev_io->u_in.copy_file_range.off_out = off_out;
1250 1 : fsdev_io->u_in.copy_file_range.len = len;
1251 1 : fsdev_io->u_in.copy_file_range.flags = flags;
1252 :
1253 1 : fsdev_io_submit(fsdev_io);
1254 1 : return 0;
1255 : }
|