flush.c revision 1.16 1 1.16 pooka /* $NetBSD: flush.c,v 1.16 2008/08/12 19:44:39 pooka Exp $ */
2 1.1 pooka
3 1.1 pooka /*
4 1.1 pooka * Copyright (c) 2007 Antti Kantee. All Rights Reserved.
5 1.1 pooka *
6 1.1 pooka * Redistribution and use in source and binary forms, with or without
7 1.1 pooka * modification, are permitted provided that the following conditions
8 1.1 pooka * are met:
9 1.1 pooka * 1. Redistributions of source code must retain the above copyright
10 1.1 pooka * notice, this list of conditions and the following disclaimer.
11 1.1 pooka * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 pooka * notice, this list of conditions and the following disclaimer in the
13 1.1 pooka * documentation and/or other materials provided with the distribution.
14 1.1 pooka *
15 1.1 pooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 1.1 pooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.1 pooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.1 pooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.1 pooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.1 pooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.1 pooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.1 pooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.1 pooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.1 pooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.1 pooka * SUCH DAMAGE.
26 1.1 pooka */
27 1.1 pooka
28 1.1 pooka #include <sys/cdefs.h>
29 1.1 pooka #if !defined(lint)
30 1.16 pooka __RCSID("$NetBSD: flush.c,v 1.16 2008/08/12 19:44:39 pooka Exp $");
31 1.1 pooka #endif /* !lint */
32 1.1 pooka
33 1.1 pooka /*
34 1.1 pooka * Flushing / invalidation routines
35 1.1 pooka */
36 1.1 pooka
37 1.1 pooka #include <sys/types.h>
38 1.1 pooka
39 1.12 pooka #include <assert.h>
40 1.3 pooka #include <err.h>
41 1.1 pooka #include <errno.h>
42 1.1 pooka #include <puffs.h>
43 1.3 pooka #include <stdio.h>
44 1.12 pooka #include <unistd.h>
45 1.1 pooka
46 1.8 pooka #include "puffs_priv.h"
47 1.8 pooka
48 1.1 pooka #if 0
49 1.1 pooka int
50 1.16 pooka puffs_inval_namecache_node(struct puffs_usermount *pu, puffs_cookie_t cookie,
51 1.1 pooka const char *name)
52 1.1 pooka {
53 1.1 pooka
54 1.1 pooka return EOPNOTSUPP;
55 1.1 pooka }
56 1.1 pooka #endif
57 1.1 pooka
58 1.12 pooka static int
59 1.16 pooka doflush(struct puffs_usermount *pu, puffs_cookie_t cookie, int op,
60 1.12 pooka off_t start, off_t end)
61 1.1 pooka {
62 1.14 pooka struct puffs_framebuf *pb;
63 1.14 pooka struct puffs_flush *pf;
64 1.14 pooka size_t winlen;
65 1.15 pooka int rv;
66 1.14 pooka
67 1.14 pooka pb = puffs_framebuf_make();
68 1.14 pooka if (pb == NULL)
69 1.14 pooka return ENOMEM;
70 1.14 pooka
71 1.14 pooka winlen = sizeof(struct puffs_flush);
72 1.15 pooka if ((rv = puffs_framebuf_getwindow(pb, 0, (void *)&pf, &winlen)) == -1)
73 1.15 pooka goto out;
74 1.14 pooka assert(winlen == sizeof(struct puffs_flush));
75 1.14 pooka
76 1.14 pooka pf->pf_req.preq_buflen = sizeof(struct puffs_flush);
77 1.14 pooka pf->pf_req.preq_opclass = PUFFSOP_FLUSH;
78 1.14 pooka pf->pf_req.preq_id = puffs__nextreq(pu);
79 1.14 pooka
80 1.14 pooka pf->pf_op = op;
81 1.14 pooka pf->pf_cookie = cookie;
82 1.14 pooka pf->pf_start = start;
83 1.14 pooka pf->pf_end = end;
84 1.12 pooka
85 1.15 pooka rv = puffs_framev_enqueue_cc(puffs_cc_getcc(pu),
86 1.14 pooka puffs_getselectable(pu), pb, 0);
87 1.15 pooka
88 1.15 pooka out:
89 1.15 pooka puffs_framebuf_destroy(pb);
90 1.15 pooka return rv;
91 1.12 pooka }
92 1.12 pooka
93 1.12 pooka int
94 1.16 pooka puffs_inval_namecache_dir(struct puffs_usermount *pu, puffs_cookie_t cookie)
95 1.12 pooka {
96 1.1 pooka
97 1.12 pooka return doflush(pu, cookie, PUFFS_INVAL_NAMECACHE_DIR, 0, 0);
98 1.1 pooka }
99 1.1 pooka
100 1.1 pooka int
101 1.2 pooka puffs_inval_namecache_all(struct puffs_usermount *pu)
102 1.1 pooka {
103 1.1 pooka
104 1.12 pooka return doflush(pu, NULL, PUFFS_INVAL_NAMECACHE_ALL, 0, 0);
105 1.1 pooka }
106 1.3 pooka
107 1.3 pooka int
108 1.16 pooka puffs_inval_pagecache_node(struct puffs_usermount *pu, puffs_cookie_t cookie)
109 1.3 pooka {
110 1.3 pooka
111 1.12 pooka return doflush(pu, cookie, PUFFS_INVAL_PAGECACHE_NODE_RANGE, 0, 0);
112 1.3 pooka }
113 1.5 pooka
114 1.5 pooka int
115 1.16 pooka puffs_inval_pagecache_node_range(struct puffs_usermount *pu,
116 1.16 pooka puffs_cookie_t cookie, off_t start, off_t end)
117 1.5 pooka {
118 1.5 pooka
119 1.12 pooka return doflush(pu, cookie, PUFFS_INVAL_PAGECACHE_NODE_RANGE, start,end);
120 1.5 pooka }
121 1.7 pooka
122 1.7 pooka int
123 1.16 pooka puffs_flush_pagecache_node(struct puffs_usermount *pu, puffs_cookie_t cookie)
124 1.7 pooka {
125 1.7 pooka
126 1.12 pooka return doflush(pu, cookie, PUFFS_FLUSH_PAGECACHE_NODE_RANGE, 0, 0);
127 1.7 pooka }
128 1.7 pooka
129 1.7 pooka int
130 1.16 pooka puffs_flush_pagecache_node_range(struct puffs_usermount *pu,
131 1.16 pooka puffs_cookie_t cookie, off_t start, off_t end)
132 1.7 pooka {
133 1.7 pooka
134 1.12 pooka return doflush(pu, cookie, PUFFS_FLUSH_PAGECACHE_NODE_RANGE, start,end);
135 1.7 pooka }
136