1*51d8761dSclaudio /* $OpenBSD: fuse_file.c,v 1.10 2024/10/31 13:55:21 claudio Exp $ */ 2a2badd06Stedu /* 3a2badd06Stedu * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com> 4a2badd06Stedu * 5a2badd06Stedu * Permission to use, copy, modify, and distribute this software for any 6a2badd06Stedu * purpose with or without fee is hereby granted, provided that the above 7a2badd06Stedu * copyright notice and this permission notice appear in all copies. 8a2badd06Stedu * 9a2badd06Stedu * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10a2badd06Stedu * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11a2badd06Stedu * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12a2badd06Stedu * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13a2badd06Stedu * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14a2badd06Stedu * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15a2badd06Stedu * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16a2badd06Stedu */ 17a2badd06Stedu 18a2badd06Stedu #include <sys/param.h> 194bc91defSmpi #include <sys/systm.h> 206f9b5942Snatano #include <sys/stat.h> 21a2badd06Stedu #include <sys/statvfs.h> 22a2badd06Stedu #include <sys/vnode.h> 23a2badd06Stedu #include <sys/fusebuf.h> 24a2badd06Stedu 25a2badd06Stedu #include "fusefs_node.h" 26a2badd06Stedu #include "fusefs.h" 27a2badd06Stedu 28a2badd06Stedu int 29a2badd06Stedu fusefs_file_open(struct fusefs_mnt *fmp, struct fusefs_node *ip, 30a2badd06Stedu enum fufh_type fufh_type, int flags, int isdir, struct proc *p) 31a2badd06Stedu { 32a2badd06Stedu struct fusebuf *fbuf; 33a2badd06Stedu int error = 0; 34a2badd06Stedu 3552b7a2e5Ssyl if (!fmp->sess_init) 3652b7a2e5Ssyl return (0); 3752b7a2e5Ssyl 38*51d8761dSclaudio fbuf = fb_setup(0, ip->i_number, 39a2badd06Stedu ((isdir) ? FBT_OPENDIR : FBT_OPEN), p); 40a2badd06Stedu fbuf->fb_io_flags = flags; 41a2badd06Stedu 42a2badd06Stedu error = fb_queue(fmp->dev, fbuf); 43a2badd06Stedu if (error) { 4437318181Ssyl fb_delete(fbuf); 45a2badd06Stedu return (error); 46a2badd06Stedu } 47a2badd06Stedu 48a2badd06Stedu ip->fufh[fufh_type].fh_id = fbuf->fb_io_fd; 49a2badd06Stedu ip->fufh[fufh_type].fh_type = fufh_type; 50a2badd06Stedu 5137318181Ssyl fb_delete(fbuf); 52a2badd06Stedu return (0); 53a2badd06Stedu } 54a2badd06Stedu 55a2badd06Stedu int 56a2badd06Stedu fusefs_file_close(struct fusefs_mnt *fmp, struct fusefs_node * ip, 57a2badd06Stedu enum fufh_type fufh_type, int flags, int isdir, struct proc *p) 58a2badd06Stedu { 59a2badd06Stedu struct fusebuf *fbuf; 60a2badd06Stedu int error = 0; 61a2badd06Stedu 6252b7a2e5Ssyl if (fmp->sess_init) { 63*51d8761dSclaudio fbuf = fb_setup(0, ip->i_number, 64a2badd06Stedu ((isdir) ? FBT_RELEASEDIR : FBT_RELEASE), p); 65a2badd06Stedu fbuf->fb_io_fd = ip->fufh[fufh_type].fh_id; 66a2badd06Stedu fbuf->fb_io_flags = flags; 67a2badd06Stedu 68a2badd06Stedu error = fb_queue(fmp->dev, fbuf); 6932164a9aSsyl if (error && (error != ENOSYS)) 704f926cddSsyl printf("fusefs: file error %d\n", error); 71a2badd06Stedu 7252b7a2e5Ssyl fb_delete(fbuf); 7352b7a2e5Ssyl } 7452b7a2e5Ssyl 75a2badd06Stedu ip->fufh[fufh_type].fh_id = (uint64_t)-1; 76a2badd06Stedu ip->fufh[fufh_type].fh_type = FUFH_INVALID; 77a2badd06Stedu 78a2badd06Stedu return (error); 79a2badd06Stedu } 80a2badd06Stedu 81a2badd06Stedu uint64_t 82a2badd06Stedu fusefs_fd_get(struct fusefs_node *ip, enum fufh_type type) 83a2badd06Stedu { 84a2badd06Stedu if (ip->fufh[type].fh_type == FUFH_INVALID) 85a2badd06Stedu type = FUFH_RDWR; 86a2badd06Stedu 87a2badd06Stedu return (ip->fufh[type].fh_id); 88a2badd06Stedu } 89