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