Blame view

fs/nfs/fscache-index.c 4.03 KB
b4d0d230c   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
8ec442ae4   David Howells   NFS: Register NFS...
2
3
4
5
  /* NFS FS-Cache index structure definition
   *
   * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
8ec442ae4   David Howells   NFS: Register NFS...
6
7
8
9
10
11
12
13
14
   */
  
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/sched.h>
  #include <linux/mm.h>
  #include <linux/nfs_fs.h>
  #include <linux/nfs_fs_sb.h>
  #include <linux/in6.h>
1eb5d98f1   Jeff Layton   nfs: convert to n...
15
  #include <linux/iversion.h>
8ec442ae4   David Howells   NFS: Register NFS...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  
  #include "internal.h"
  #include "fscache.h"
  
  #define NFSDBG_FACILITY		NFSDBG_FSCACHE
  
  /*
   * Define the NFS filesystem for FS-Cache.  Upon registration FS-Cache sticks
   * the cookie for the top-level index object for NFS into here.  The top-level
   * index can than have other cache objects inserted into it.
   */
  struct fscache_netfs nfs_fscache_netfs = {
  	.name		= "nfs",
  	.version	= 0,
  };
  
  /*
   * Register NFS for caching
   */
  int nfs_fscache_register(void)
  {
  	return fscache_register_netfs(&nfs_fscache_netfs);
  }
  
  /*
   * Unregister NFS for caching
   */
  void nfs_fscache_unregister(void)
  {
  	fscache_unregister_netfs(&nfs_fscache_netfs);
  }
147272813   David Howells   NFS: Define and c...
47
48
  
  /*
147272813   David Howells   NFS: Define and c...
49
50
51
52
53
54
55
   * Define the server object for FS-Cache.  This is used to describe a server
   * object to fscache_acquire_cookie().  It is keyed by the NFS protocol and
   * server address parameters.
   */
  const struct fscache_cookie_def nfs_fscache_server_index_def = {
  	.name		= "NFS.server",
  	.type 		= FSCACHE_COOKIE_TYPE_INDEX,
147272813   David Howells   NFS: Define and c...
56
  };
08734048b   David Howells   NFS: Define and c...
57
58
  
  /*
08734048b   David Howells   NFS: Define and c...
59
60
61
62
63
64
65
   * Define the superblock object for FS-Cache.  This is used to describe a
   * superblock object to fscache_acquire_cookie().  It is keyed by all the NFS
   * parameters that might cause a separate superblock.
   */
  const struct fscache_cookie_def nfs_fscache_super_index_def = {
  	.name		= "NFS.super",
  	.type 		= FSCACHE_COOKIE_TYPE_INDEX,
08734048b   David Howells   NFS: Define and c...
66
  };
10329a5d4   David Howells   NFS: Define and c...
67
68
  
  /*
10329a5d4   David Howells   NFS: Define and c...
69
70
71
72
73
74
75
76
   * Consult the netfs about the state of an object
   * - This function can be absent if the index carries no state data
   * - The netfs data from the cookie being used as the target is
   *   presented, as is the auxiliary data
   */
  static
  enum fscache_checkaux nfs_fscache_inode_check_aux(void *cookie_netfs_data,
  						  const void *data,
ee1235a9a   David Howells   fscache: Pass obj...
77
78
  						  uint16_t datalen,
  						  loff_t object_size)
10329a5d4   David Howells   NFS: Define and c...
79
80
81
82
83
84
85
86
  {
  	struct nfs_fscache_inode_auxdata auxdata;
  	struct nfs_inode *nfsi = cookie_netfs_data;
  
  	if (datalen != sizeof(auxdata))
  		return FSCACHE_CHECKAUX_OBSOLETE;
  
  	memset(&auxdata, 0, sizeof(auxdata));
6e31ded68   Arnd Bergmann   nfs: fscache: use...
87
88
89
90
  	auxdata.mtime_sec  = nfsi->vfs_inode.i_mtime.tv_sec;
  	auxdata.mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec;
  	auxdata.ctime_sec  = nfsi->vfs_inode.i_ctime.tv_sec;
  	auxdata.ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec;
10329a5d4   David Howells   NFS: Define and c...
91
92
  
  	if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4)
1eb5d98f1   Jeff Layton   nfs: convert to n...
93
  		auxdata.change_attr = inode_peek_iversion_raw(&nfsi->vfs_inode);
10329a5d4   David Howells   NFS: Define and c...
94
95
96
97
98
99
100
101
  
  	if (memcmp(data, &auxdata, datalen) != 0)
  		return FSCACHE_CHECKAUX_OBSOLETE;
  
  	return FSCACHE_CHECKAUX_OKAY;
  }
  
  /*
1fcdf5348   David Howells   NFS: Add read con...
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
   * Get an extra reference on a read context.
   * - This function can be absent if the completion function doesn't require a
   *   context.
   * - The read context is passed back to NFS in the event that a data read on the
   *   cache fails with EIO - in which case the server must be contacted to
   *   retrieve the data, which requires the read context for security.
   */
  static void nfs_fh_get_context(void *cookie_netfs_data, void *context)
  {
  	get_nfs_open_context(context);
  }
  
  /*
   * Release an extra reference on a read context.
   * - This function can be absent if the completion function doesn't require a
   *   context.
   */
  static void nfs_fh_put_context(void *cookie_netfs_data, void *context)
  {
  	if (context)
  		put_nfs_open_context(context);
  }
  
  /*
10329a5d4   David Howells   NFS: Define and c...
126
127
128
129
130
131
132
133
134
135
136
   * Define the inode object for FS-Cache.  This is used to describe an inode
   * object to fscache_acquire_cookie().  It is keyed by the NFS file handle for
   * an inode.
   *
   * Coherency is managed by comparing the copies of i_size, i_mtime and i_ctime
   * held in the cache auxiliary data for the data storage object with those in
   * the inode struct in memory.
   */
  const struct fscache_cookie_def nfs_fscache_inode_object_def = {
  	.name		= "NFS.fh",
  	.type		= FSCACHE_COOKIE_TYPE_DATAFILE,
10329a5d4   David Howells   NFS: Define and c...
137
  	.check_aux	= nfs_fscache_inode_check_aux,
1fcdf5348   David Howells   NFS: Add read con...
138
139
  	.get_context	= nfs_fh_get_context,
  	.put_context	= nfs_fh_put_context,
10329a5d4   David Howells   NFS: Define and c...
140
  };