xref: /openbsd-src/sys/miscfs/fuse/fuse_file.c (revision 51d8761d1e63aff7173adb7b282dbb4d6279257d)
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