linux/fs/nfsd/cache.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Request reply cache. This was heavily inspired by the
   4 * implementation in 4.3BSD/4.4BSD.
   5 *
   6 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
   7 */
   8
   9#ifndef NFSCACHE_H
  10#define NFSCACHE_H
  11
  12#include <linux/sunrpc/svc.h>
  13#include "netns.h"
  14
  15/*
  16 * Representation of a reply cache entry.
  17 *
  18 * Note that we use a sockaddr_in6 to hold the address instead of the more
  19 * typical sockaddr_storage. This is for space reasons, since sockaddr_storage
  20 * is much larger than a sockaddr_in6.
  21 */
  22struct svc_cacherep {
  23        struct {
  24                /* Keep often-read xid, csum in the same cache line: */
  25                __be32                  k_xid;
  26                __wsum                  k_csum;
  27                u32                     k_proc;
  28                u32                     k_prot;
  29                u32                     k_vers;
  30                unsigned int            k_len;
  31                struct sockaddr_in6     k_addr;
  32        } c_key;
  33
  34        struct rb_node          c_node;
  35        struct list_head        c_lru;
  36        unsigned char           c_state,        /* unused, inprog, done */
  37                                c_type,         /* status, buffer */
  38                                c_secure : 1;   /* req came from port < 1024 */
  39        unsigned long           c_timestamp;
  40        union {
  41                struct kvec     u_vec;
  42                __be32          u_status;
  43        }                       c_u;
  44};
  45
  46#define c_replvec               c_u.u_vec
  47#define c_replstat              c_u.u_status
  48
  49/* cache entry states */
  50enum {
  51        RC_UNUSED,
  52        RC_INPROG,
  53        RC_DONE
  54};
  55
  56/* return values */
  57enum {
  58        RC_DROPIT,
  59        RC_REPLY,
  60        RC_DOIT
  61};
  62
  63/*
  64 * Cache types.
  65 * We may want to add more types one day, e.g. for diropres and
  66 * attrstat replies. Using cache entries with fixed length instead
  67 * of buffer pointers may be more efficient.
  68 */
  69enum {
  70        RC_NOCACHE,
  71        RC_REPLSTAT,
  72        RC_REPLBUFF,
  73};
  74
  75/* Cache entries expire after this time period */
  76#define RC_EXPIRE               (120 * HZ)
  77
  78/* Checksum this amount of the request */
  79#define RC_CSUMLEN              (256U)
  80
  81int     nfsd_reply_cache_init(struct nfsd_net *);
  82void    nfsd_reply_cache_shutdown(struct nfsd_net *);
  83int     nfsd_cache_lookup(struct svc_rqst *);
  84void    nfsd_cache_update(struct svc_rqst *, int, __be32 *);
  85int     nfsd_reply_cache_stats_open(struct inode *, struct file *);
  86
  87#endif /* NFSCACHE_H */
  88