1 /* nbdkit
2  * Copyright (C) 2018-2020 Red Hat Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * * Neither the name of Red Hat nor the names of its contributors may be
16  * used to endorse or promote products derived from this software without
17  * specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #include <config.h>
34 
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <stdint.h>
38 #include <string.h>
39 #include <stdbool.h>
40 #include <assert.h>
41 
42 #include <nbdkit-filter.h>
43 
44 #include "minmax.h"
45 
46 static enum CacheMode {
47   NONE,
48   EMULATE,
49   NOP,
50 } cachemode;
51 
52 static int
nocache_config(nbdkit_next_config * next,void * nxdata,const char * key,const char * value)53 nocache_config (nbdkit_next_config *next, void *nxdata,
54                 const char *key, const char *value)
55 {
56   if (strcmp (key, "cachemode") == 0) {
57     if (strcmp (value, "emulate") == 0)
58       cachemode = EMULATE;
59     else if (strcmp (value, "nop") == 0 ||
60              strcmp (value, "no-op") == 0)
61       cachemode = NOP;
62     else if (strcmp (value, "none") != 0) {
63       nbdkit_error ("unknown cachemode '%s'", value);
64       return -1;
65     }
66     return 0;
67   }
68   return next (nxdata, key, value);
69 }
70 
71 #define nocache_config_help \
72   "cachemode=<MODE>     Either 'none' (default), 'emulate', or 'nop'.\n" \
73 
74 /* Advertise desired FLAG_SEND_CACHE mode. */
75 static int
nocache_can_cache(struct nbdkit_next_ops * next_ops,void * nxdata,void * handle)76 nocache_can_cache (struct nbdkit_next_ops *next_ops, void *nxdata,
77                    void *handle)
78 {
79   switch (cachemode) {
80   case NONE:
81     return NBDKIT_CACHE_NONE;
82   case EMULATE:
83     return NBDKIT_CACHE_EMULATE;
84   case NOP:
85     return NBDKIT_CACHE_NATIVE;
86   }
87   abort ();
88 }
89 
90 static int
nocache_cache(struct nbdkit_next_ops * next_ops,void * nxdata,void * handle,uint32_t count,uint64_t offs,uint32_t flags,int * err)91 nocache_cache (struct nbdkit_next_ops *next_ops, void *nxdata,
92                void *handle, uint32_t count, uint64_t offs, uint32_t flags,
93                int *err)
94 {
95   assert (cachemode == NOP);
96   assert (!flags);
97 
98   return 0;
99 }
100 
101 static struct nbdkit_filter filter = {
102   .name              = "nocache",
103   .longname          = "nbdkit nocache filter",
104   .config            = nocache_config,
105   .config_help       = nocache_config_help,
106   .can_cache         = nocache_can_cache,
107   .cache             = nocache_cache,
108 };
109 
110 NBDKIT_REGISTER_FILTER(filter)
111