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