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