1*ff423327Spooka /* $NetBSD: flush.c,v 1.16 2008/08/12 19:44:39 pooka Exp $ */
203a190dcSpooka
303a190dcSpooka /*
403a190dcSpooka * Copyright (c) 2007 Antti Kantee. All Rights Reserved.
503a190dcSpooka *
603a190dcSpooka * Redistribution and use in source and binary forms, with or without
703a190dcSpooka * modification, are permitted provided that the following conditions
803a190dcSpooka * are met:
903a190dcSpooka * 1. Redistributions of source code must retain the above copyright
1003a190dcSpooka * notice, this list of conditions and the following disclaimer.
1103a190dcSpooka * 2. Redistributions in binary form must reproduce the above copyright
1203a190dcSpooka * notice, this list of conditions and the following disclaimer in the
1303a190dcSpooka * documentation and/or other materials provided with the distribution.
1403a190dcSpooka *
1503a190dcSpooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
1603a190dcSpooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1703a190dcSpooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1803a190dcSpooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1903a190dcSpooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2003a190dcSpooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2103a190dcSpooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2203a190dcSpooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2303a190dcSpooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2403a190dcSpooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2503a190dcSpooka * SUCH DAMAGE.
2603a190dcSpooka */
2703a190dcSpooka
2803a190dcSpooka #include <sys/cdefs.h>
2903a190dcSpooka #if !defined(lint)
30*ff423327Spooka __RCSID("$NetBSD: flush.c,v 1.16 2008/08/12 19:44:39 pooka Exp $");
3103a190dcSpooka #endif /* !lint */
3203a190dcSpooka
3303a190dcSpooka /*
3403a190dcSpooka * Flushing / invalidation routines
3503a190dcSpooka */
3603a190dcSpooka
3703a190dcSpooka #include <sys/types.h>
3803a190dcSpooka
3933c91738Spooka #include <assert.h>
405c0f0bcfSpooka #include <err.h>
4103a190dcSpooka #include <errno.h>
4203a190dcSpooka #include <puffs.h>
435c0f0bcfSpooka #include <stdio.h>
4433c91738Spooka #include <unistd.h>
4503a190dcSpooka
4695a18d20Spooka #include "puffs_priv.h"
4795a18d20Spooka
4803a190dcSpooka #if 0
4903a190dcSpooka int
50*ff423327Spooka puffs_inval_namecache_node(struct puffs_usermount *pu, puffs_cookie_t cookie,
5103a190dcSpooka const char *name)
5203a190dcSpooka {
5303a190dcSpooka
5403a190dcSpooka return EOPNOTSUPP;
5503a190dcSpooka }
5603a190dcSpooka #endif
5703a190dcSpooka
5833c91738Spooka static int
doflush(struct puffs_usermount * pu,puffs_cookie_t cookie,int op,off_t start,off_t end)59*ff423327Spooka doflush(struct puffs_usermount *pu, puffs_cookie_t cookie, int op,
6033c91738Spooka off_t start, off_t end)
6133c91738Spooka {
627d5d7f4fSpooka struct puffs_framebuf *pb;
637d5d7f4fSpooka struct puffs_flush *pf;
647d5d7f4fSpooka size_t winlen;
659bc20deaSpooka int rv;
6633c91738Spooka
677d5d7f4fSpooka pb = puffs_framebuf_make();
687d5d7f4fSpooka if (pb == NULL)
697d5d7f4fSpooka return ENOMEM;
7033c91738Spooka
717d5d7f4fSpooka winlen = sizeof(struct puffs_flush);
729bc20deaSpooka if ((rv = puffs_framebuf_getwindow(pb, 0, (void *)&pf, &winlen)) == -1)
739bc20deaSpooka goto out;
747d5d7f4fSpooka assert(winlen == sizeof(struct puffs_flush));
7533c91738Spooka
767d5d7f4fSpooka pf->pf_req.preq_buflen = sizeof(struct puffs_flush);
777d5d7f4fSpooka pf->pf_req.preq_opclass = PUFFSOP_FLUSH;
787d5d7f4fSpooka pf->pf_req.preq_id = puffs__nextreq(pu);
7933c91738Spooka
807d5d7f4fSpooka pf->pf_op = op;
817d5d7f4fSpooka pf->pf_cookie = cookie;
827d5d7f4fSpooka pf->pf_start = start;
837d5d7f4fSpooka pf->pf_end = end;
847d5d7f4fSpooka
859bc20deaSpooka rv = puffs_framev_enqueue_cc(puffs_cc_getcc(pu),
867d5d7f4fSpooka puffs_getselectable(pu), pb, 0);
879bc20deaSpooka
889bc20deaSpooka out:
899bc20deaSpooka puffs_framebuf_destroy(pb);
909bc20deaSpooka return rv;
9133c91738Spooka }
9233c91738Spooka
9303a190dcSpooka int
puffs_inval_namecache_dir(struct puffs_usermount * pu,puffs_cookie_t cookie)94*ff423327Spooka puffs_inval_namecache_dir(struct puffs_usermount *pu, puffs_cookie_t cookie)
9503a190dcSpooka {
9603a190dcSpooka
9733c91738Spooka return doflush(pu, cookie, PUFFS_INVAL_NAMECACHE_DIR, 0, 0);
9803a190dcSpooka }
9903a190dcSpooka
10003a190dcSpooka int
puffs_inval_namecache_all(struct puffs_usermount * pu)10171ddd8dfSpooka puffs_inval_namecache_all(struct puffs_usermount *pu)
10203a190dcSpooka {
10303a190dcSpooka
10433c91738Spooka return doflush(pu, NULL, PUFFS_INVAL_NAMECACHE_ALL, 0, 0);
10503a190dcSpooka }
1065c0f0bcfSpooka
1075c0f0bcfSpooka int
puffs_inval_pagecache_node(struct puffs_usermount * pu,puffs_cookie_t cookie)108*ff423327Spooka puffs_inval_pagecache_node(struct puffs_usermount *pu, puffs_cookie_t cookie)
1095c0f0bcfSpooka {
1105c0f0bcfSpooka
11133c91738Spooka return doflush(pu, cookie, PUFFS_INVAL_PAGECACHE_NODE_RANGE, 0, 0);
1125c0f0bcfSpooka }
113fa10fe8fSpooka
114fa10fe8fSpooka int
puffs_inval_pagecache_node_range(struct puffs_usermount * pu,puffs_cookie_t cookie,off_t start,off_t end)115*ff423327Spooka puffs_inval_pagecache_node_range(struct puffs_usermount *pu,
116*ff423327Spooka puffs_cookie_t cookie, off_t start, off_t end)
117fa10fe8fSpooka {
118fa10fe8fSpooka
11933c91738Spooka return doflush(pu, cookie, PUFFS_INVAL_PAGECACHE_NODE_RANGE, start,end);
120fa10fe8fSpooka }
1216cc35b91Spooka
1226cc35b91Spooka int
puffs_flush_pagecache_node(struct puffs_usermount * pu,puffs_cookie_t cookie)123*ff423327Spooka puffs_flush_pagecache_node(struct puffs_usermount *pu, puffs_cookie_t cookie)
1246cc35b91Spooka {
1256cc35b91Spooka
12633c91738Spooka return doflush(pu, cookie, PUFFS_FLUSH_PAGECACHE_NODE_RANGE, 0, 0);
1276cc35b91Spooka }
1286cc35b91Spooka
1296cc35b91Spooka int
puffs_flush_pagecache_node_range(struct puffs_usermount * pu,puffs_cookie_t cookie,off_t start,off_t end)130*ff423327Spooka puffs_flush_pagecache_node_range(struct puffs_usermount *pu,
131*ff423327Spooka puffs_cookie_t cookie, off_t start, off_t end)
1326cc35b91Spooka {
1336cc35b91Spooka
13433c91738Spooka return doflush(pu, cookie, PUFFS_FLUSH_PAGECACHE_NODE_RANGE, start,end);
1356cc35b91Spooka }
136