1 /* $OpenBSD: fusebuf.c,v 1.12 2016/08/30 16:45:54 natano Exp $ */ 2 /* 3 * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <sys/param.h> 19 #include <sys/kernel.h> 20 #include <sys/malloc.h> 21 #include <sys/pool.h> 22 #include <sys/stat.h> 23 #include <sys/statvfs.h> 24 #include <sys/systm.h> 25 #include <sys/vnode.h> 26 #include <sys/fusebuf.h> 27 28 #include "fusefs_node.h" 29 #include "fusefs.h" 30 31 struct fusebuf * 32 fb_setup(size_t len, ino_t ino, int op, struct proc *p) 33 { 34 struct fusebuf *fbuf; 35 36 fbuf = pool_get(&fusefs_fbuf_pool, PR_WAITOK | PR_ZERO); 37 fbuf->fb_len = len; 38 fbuf->fb_err = 0; 39 arc4random_buf(&fbuf->fb_uuid, sizeof fbuf->fb_uuid); 40 fbuf->fb_type = op; 41 fbuf->fb_ino = ino; 42 if (len == 0) 43 fbuf->fb_dat = NULL; 44 else 45 fbuf->fb_dat = (uint8_t *)malloc(len, M_FUSEFS, 46 M_WAITOK | M_ZERO); 47 48 return (fbuf); 49 } 50 51 int 52 fb_queue(dev_t dev, struct fusebuf *fbuf) 53 { 54 int error = 0; 55 56 fuse_device_queue_fbuf(dev, fbuf); 57 58 if ((error = tsleep(fbuf, PWAIT, "fuse msg", TSLEEP_TIMEOUT * hz))) { 59 fuse_device_cleanup(dev, fbuf); 60 return (error); 61 } 62 63 return (fbuf->fb_err); 64 } 65 66 void 67 fb_delete(struct fusebuf *fbuf) 68 { 69 if (fbuf != NULL) { 70 free(fbuf->fb_dat, M_FUSEFS, 0); 71 pool_put(&fusefs_fbuf_pool, fbuf); 72 } 73 } 74