sys/vfs/autofs: Add Copyright
[dragonfly.git] / sys / vfs / autofs / autofs.h
1 /*-
2  * Copyright (c) 2016 Tomohiro Kusumi <kusumi.tomohiro@gmail.com>
3  * Copyright (c) 2016 The DragonFly Project
4  * Copyright (c) 2014 The FreeBSD Foundation
5  * All rights reserved.
6  *
7  * This software was developed by Edward Tomasz Napierala under sponsorship
8  * from the FreeBSD Foundation.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * $FreeBSD$
32  */
33
34 #ifndef AUTOFS_H
35 #define AUTOFS_H
36
37 #include <sys/kernel.h>
38 #include <sys/module.h>
39 #include <sys/types.h>
40 #include <sys/systm.h>
41 #include <sys/malloc.h>
42 #include <sys/objcache.h>
43 #include <sys/tree.h>
44 #include <sys/lock.h>
45 #include <sys/mutex2.h>
46 #include <sys/condvar.h>
47 #include <sys/mount.h>
48 #include <sys/vnode.h>
49 #include <sys/timespec.h>
50 #include <sys/callout.h>
51 #include <sys/taskqueue.h>
52 #include <sys/conf.h>
53 #include <sys/bus.h>
54
55 #define AUTOFS_ROOTINO  ((ino_t)1)
56 #define VFSTOAUTOFS(mp) ((struct autofs_mount *)((mp)->mnt_data))
57 #define VTOI(vp)        ((struct autofs_node *)((vp)->v_data))
58
59 MALLOC_DECLARE(M_AUTOFS);
60
61 extern struct objcache *autofs_request_objcache;
62 extern struct objcache *autofs_node_objcache;
63 extern struct autofs_softc *autofs_softc;
64 extern struct dev_ops autofs_ops;
65
66 extern struct vop_ops autofs_vnode_vops;
67
68 extern int autofs_debug;
69 //extern int autofs_mount_on_stat;
70
71 #define AUTOFS_DEBUG(X, ...)                            \
72         do {                                            \
73                 if (autofs_debug > 1)                   \
74                         kprintf("%s: " X "\n",          \
75                             __func__, ## __VA_ARGS__);  \
76         } while (0)
77
78 #define AUTOFS_WARN(X, ...)                             \
79         do {                                            \
80                 if (autofs_debug > 0) {                 \
81                         kprintf("WARNING: %s: " X "\n", \
82                             __func__, ## __VA_ARGS__);  \
83                 }                                       \
84         } while (0)
85
86 #define AUTOFS_FATAL(X, ...)                            \
87         kprintf("FATAL: %s: " X "\n", __func__, ## __VA_ARGS__)
88
89 /*
90  * APRINTF is only for debugging.
91  */
92 #define APRINTF(X, ...)                                 \
93         kprintf("### %s(%s): " X,                       \
94             __func__, curproc->p_comm, ## __VA_ARGS__)
95
96 struct autofs_node {
97         RB_ENTRY(autofs_node)           an_link;
98         char                            *an_name;
99         ino_t                           an_ino;
100         struct autofs_node              *an_parent;
101         RB_HEAD(autofs_node_tree,
102             autofs_node)                an_children;
103         struct autofs_mount             *an_mount;
104         struct vnode                    *an_vnode;
105         mtx_t                           an_vnode_lock;
106         bool                            an_cached;
107         bool                            an_wildcards;
108         struct callout                  an_callout;
109         int                             an_retries;
110         struct timespec                 an_ctime;
111 };
112
113 struct autofs_mount {
114         TAILQ_ENTRY(autofs_mount)       am_next;
115         struct autofs_node              *am_root;
116         struct mount                    *am_mp;
117         mtx_t                           am_lock;
118         char                            am_from[MAXPATHLEN];
119         char                            am_on[MAXPATHLEN];
120         char                            am_options[MAXPATHLEN];
121         char                            am_prefix[MAXPATHLEN];
122         ino_t                           am_last_ino;
123 };
124
125 struct autofs_request {
126         TAILQ_ENTRY(autofs_request)     ar_next;
127         struct autofs_mount             *ar_mount;
128         int                             ar_id;
129         bool                            ar_done;
130         int                             ar_error;
131         bool                            ar_wildcards;
132         bool                            ar_in_progress;
133         char                            ar_from[MAXPATHLEN];
134         char                            ar_path[MAXPATHLEN];
135         char                            ar_prefix[MAXPATHLEN];
136         char                            ar_key[MAXPATHLEN];
137         char                            ar_options[MAXPATHLEN];
138         struct timeout_task             ar_task;
139         volatile u_int                  ar_refcount;
140 };
141
142 struct autofs_softc {
143         device_t                        sc_dev;
144         struct cdev                     *sc_cdev;
145         struct cv                       sc_cv;
146         struct lock                     sc_lock;
147         TAILQ_HEAD(, autofs_request)    sc_requests;
148         bool                            sc_dev_opened;
149         pid_t                           sc_dev_sid;
150         int                             sc_last_request_id;
151 };
152
153 int     autofs_trigger(struct autofs_node *anp, const char *component,
154             int componentlen);
155 bool    autofs_cached(struct autofs_node *anp, const char *component,
156             int componentlen);
157 char*   autofs_path(struct autofs_node *anp);
158 void    autofs_flush(struct autofs_mount *amp);
159 bool    autofs_ignore_thread(void);
160 int     autofs_node_new(struct autofs_node *parent, struct autofs_mount *amp,
161             const char *name, int namelen, struct autofs_node **anpp);
162 int     autofs_node_find(struct autofs_node *parent,
163             const char *name, int namelen, struct autofs_node **anpp);
164 void    autofs_node_delete(struct autofs_node *anp);
165 int     autofs_node_vn(struct autofs_node *anp, struct mount *mp,
166             int flags, struct vnode **vpp);
167
168 static __inline void
169 autofs_node_cache(struct autofs_node *anp)
170 {
171         anp->an_cached = true;
172 }
173
174 static __inline void
175 autofs_node_uncache(struct autofs_node *anp)
176 {
177         anp->an_cached = false;
178 }
179
180 RB_PROTOTYPE(autofs_node_tree, autofs_node, an_link, autofs_node_cmp);
181
182 #endif /* !AUTOFS_H */