Lines Matching +full:key +full:- +full:release
1 // SPDX-License-Identifier: GPL-2.0-or-later
29 * Layout of the key for an NFS server cache object.
45 * Get the per-client index cookie for an NFS client if the appropriate mount
47 * - We always try and get an index cookie for the client, but get filehandle
48 * cookies on a per-superblock basis, depending on the mount flags
52 const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) &clp->cl_addr; in nfs_fscache_get_client_cookie()
53 const struct sockaddr_in *sin = (struct sockaddr_in *) &clp->cl_addr; in nfs_fscache_get_client_cookie()
54 struct nfs_server_key key; in nfs_fscache_get_client_cookie() local
55 uint16_t len = sizeof(key.hdr); in nfs_fscache_get_client_cookie()
57 memset(&key, 0, sizeof(key)); in nfs_fscache_get_client_cookie()
58 key.hdr.nfsversion = clp->rpc_ops->version; in nfs_fscache_get_client_cookie()
59 key.hdr.minorversion = clp->cl_minorversion; in nfs_fscache_get_client_cookie()
60 key.hdr.family = clp->cl_addr.ss_family; in nfs_fscache_get_client_cookie()
62 switch (clp->cl_addr.ss_family) { in nfs_fscache_get_client_cookie()
64 key.hdr.port = sin->sin_port; in nfs_fscache_get_client_cookie()
65 key.ipv4_addr = sin->sin_addr; in nfs_fscache_get_client_cookie()
66 len += sizeof(key.ipv4_addr); in nfs_fscache_get_client_cookie()
70 key.hdr.port = sin6->sin6_port; in nfs_fscache_get_client_cookie()
71 key.ipv6_addr = sin6->sin6_addr; in nfs_fscache_get_client_cookie()
72 len += sizeof(key.ipv6_addr); in nfs_fscache_get_client_cookie()
77 clp->cl_addr.ss_family); in nfs_fscache_get_client_cookie()
78 clp->fscache = NULL; in nfs_fscache_get_client_cookie()
83 clp->fscache = fscache_acquire_cookie(nfs_fscache_netfs.primary_index, in nfs_fscache_get_client_cookie()
85 &key, len, in nfs_fscache_get_client_cookie()
89 clp, clp->fscache); in nfs_fscache_get_client_cookie()
93 * Dispose of a per-client cookie
98 clp, clp->fscache); in nfs_fscache_release_client_cookie()
100 fscache_relinquish_cookie(clp->fscache, NULL, false); in nfs_fscache_release_client_cookie()
101 clp->fscache = NULL; in nfs_fscache_release_client_cookie()
114 struct nfs_fscache_key *key, *xkey; in nfs_fscache_get_super_cookie() local
119 nfss->fscache_key = NULL; in nfs_fscache_get_super_cookie()
120 nfss->fscache = NULL; in nfs_fscache_get_super_cookie()
126 key = kzalloc(sizeof(*key) + ulen, GFP_KERNEL); in nfs_fscache_get_super_cookie()
127 if (!key) in nfs_fscache_get_super_cookie()
130 key->nfs_client = nfss->nfs_client; in nfs_fscache_get_super_cookie()
131 key->key.super.s_flags = sb->s_flags & NFS_SB_MASK; in nfs_fscache_get_super_cookie()
132 key->key.nfs_server.flags = nfss->flags; in nfs_fscache_get_super_cookie()
133 key->key.nfs_server.rsize = nfss->rsize; in nfs_fscache_get_super_cookie()
134 key->key.nfs_server.wsize = nfss->wsize; in nfs_fscache_get_super_cookie()
135 key->key.nfs_server.acregmin = nfss->acregmin; in nfs_fscache_get_super_cookie()
136 key->key.nfs_server.acregmax = nfss->acregmax; in nfs_fscache_get_super_cookie()
137 key->key.nfs_server.acdirmin = nfss->acdirmin; in nfs_fscache_get_super_cookie()
138 key->key.nfs_server.acdirmax = nfss->acdirmax; in nfs_fscache_get_super_cookie()
139 key->key.nfs_server.fsid = nfss->fsid; in nfs_fscache_get_super_cookie()
140 key->key.rpc_auth.au_flavor = nfss->client->cl_auth->au_flavor; in nfs_fscache_get_super_cookie()
142 key->key.uniq_len = ulen; in nfs_fscache_get_super_cookie()
143 memcpy(key->key.uniquifier, uniq, ulen); in nfs_fscache_get_super_cookie()
152 if (key->nfs_client < xkey->nfs_client) in nfs_fscache_get_super_cookie()
154 if (key->nfs_client > xkey->nfs_client) in nfs_fscache_get_super_cookie()
157 diff = memcmp(&key->key, &xkey->key, sizeof(key->key)); in nfs_fscache_get_super_cookie()
163 if (key->key.uniq_len == 0) in nfs_fscache_get_super_cookie()
165 diff = memcmp(key->key.uniquifier, in nfs_fscache_get_super_cookie()
166 xkey->key.uniquifier, in nfs_fscache_get_super_cookie()
167 key->key.uniq_len); in nfs_fscache_get_super_cookie()
175 p = &(*p)->rb_left; in nfs_fscache_get_super_cookie()
178 p = &(*p)->rb_right; in nfs_fscache_get_super_cookie()
181 rb_link_node(&key->node, parent, p); in nfs_fscache_get_super_cookie()
182 rb_insert_color(&key->node, &nfs_fscache_keys); in nfs_fscache_get_super_cookie()
184 nfss->fscache_key = key; in nfs_fscache_get_super_cookie()
187 nfss->fscache = fscache_acquire_cookie(nfss->nfs_client->fscache, in nfs_fscache_get_super_cookie()
189 &key->key, in nfs_fscache_get_super_cookie()
190 sizeof(key->key) + ulen, in nfs_fscache_get_super_cookie()
194 nfss, nfss->fscache); in nfs_fscache_get_super_cookie()
199 kfree(key); in nfs_fscache_get_super_cookie()
200 nfss->fscache_key = NULL; in nfs_fscache_get_super_cookie()
201 nfss->fscache = NULL; in nfs_fscache_get_super_cookie()
203 " Cache request denied due to non-unique superblock keys\n"); in nfs_fscache_get_super_cookie()
207 * release a per-superblock cookie
214 nfss, nfss->fscache); in nfs_fscache_release_super_cookie()
216 fscache_relinquish_cookie(nfss->fscache, NULL, false); in nfs_fscache_release_super_cookie()
217 nfss->fscache = NULL; in nfs_fscache_release_super_cookie()
219 if (nfss->fscache_key) { in nfs_fscache_release_super_cookie()
221 rb_erase(&nfss->fscache_key->node, &nfs_fscache_keys); in nfs_fscache_release_super_cookie()
223 kfree(nfss->fscache_key); in nfs_fscache_release_super_cookie()
224 nfss->fscache_key = NULL; in nfs_fscache_release_super_cookie()
232 auxdata->mtime_sec = nfsi->vfs_inode.i_mtime.tv_sec; in nfs_fscache_update_auxdata()
233 auxdata->mtime_nsec = nfsi->vfs_inode.i_mtime.tv_nsec; in nfs_fscache_update_auxdata()
234 auxdata->ctime_sec = nfsi->vfs_inode.i_ctime.tv_sec; in nfs_fscache_update_auxdata()
235 auxdata->ctime_nsec = nfsi->vfs_inode.i_ctime.tv_nsec; in nfs_fscache_update_auxdata()
237 if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4) in nfs_fscache_update_auxdata()
238 auxdata->change_attr = inode_peek_iversion_raw(&nfsi->vfs_inode); in nfs_fscache_update_auxdata()
242 * Initialise the per-inode cache cookie pointer for an NFS inode.
250 nfsi->fscache = NULL; in nfs_fscache_init_inode()
251 if (!(nfss->fscache && S_ISREG(inode->i_mode))) in nfs_fscache_init_inode()
256 nfsi->fscache = fscache_acquire_cookie(NFS_SB(inode->i_sb)->fscache, in nfs_fscache_init_inode()
258 nfsi->fh.data, nfsi->fh.size, in nfs_fscache_init_inode()
260 nfsi, nfsi->vfs_inode.i_size, false); in nfs_fscache_init_inode()
264 * Release a per-inode cookie.
276 nfsi->fscache = NULL; in nfs_fscache_clear_inode()
289 * that time. Enablement is deferred to file-open time to avoid stat() and
292 * For now, with NFS, only regular files that are open read-only will be able
295 * We enable the cache for an inode if we open it read-only and it isn't
297 * write-only.
318 clear_bit(NFS_INO_FSCACHE, &nfsi->flags); in nfs_fscache_open_file()
323 fscache_enable_cookie(cookie, &auxdata, nfsi->vfs_inode.i_size, in nfs_fscache_open_file()
326 set_bit(NFS_INO_FSCACHE, &NFS_I(inode)->flags); in nfs_fscache_open_file()
332 * Release the caching state associated with a page, if the page isn't busy
334 * - Returns true (can release page) or false (page busy).
339 struct fscache_cookie *cookie = nfs_i_fscache(page->mapping->host); in nfs_fscache_release_page()
343 cookie, page, NFS_I(page->mapping->host)); in nfs_fscache_release_page()
348 nfs_inc_fscache_stats(page->mapping->host, in nfs_fscache_release_page()
356 * Release the caching state associated with a page if undergoing complete page
372 nfs_inc_fscache_stats(page->mapping->host, in __nfs_fscache_invalidate_page()
378 * - Called in process (keventd) context.
394 error = nfs_readpage_async(context, page->mapping->host, page); in nfs_readpage_from_fscache_complete()
410 nfs_i_fscache(inode), page, page->index, page->flags, inode); in __nfs_readpage_from_fscache()
425 case -ENOBUFS: /* inode not in cache */ in __nfs_readpage_from_fscache()
426 case -ENODATA: /* page not in cache */ in __nfs_readpage_from_fscache()
475 case -ENOBUFS: /* some pages aren't cached and can't be */ in __nfs_readpages_from_fscache()
476 case -ENODATA: /* some pages aren't cached */ in __nfs_readpages_from_fscache()
491 * - PG_fscache must be set on the page
499 nfs_i_fscache(inode), page, page->index, page->flags, sync); in __nfs_readpage_to_fscache()
502 inode->i_size, GFP_KERNEL); in __nfs_readpage_to_fscache()
505 page, page->index, page->flags, ret); in __nfs_readpage_to_fscache()