2874c5fd28426 (Thomas Gleixner 2019-05-27 08:55:01 +0200 1) // SPDX-License-Identifier: GPL-2.0-or-later
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 2) /* Filesystem index definition
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 3) *
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 4) * Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved.
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 5) * Written by David Howells (dhowells@redhat.com)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 6) */
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 7)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 8) #define FSCACHE_DEBUG_LEVEL CACHE
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 9) #include <linux/module.h>
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 10) #include "internal.h"
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 11)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 12) static
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 13) enum fscache_checkaux fscache_fsdef_netfs_check_aux(void *cookie_netfs_data,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 14) const void *data,
ee1235a9a0681 (David Howells 2018-04-04 13:41:28 +0100 15) uint16_t datalen,
ee1235a9a0681 (David Howells 2018-04-04 13:41:28 +0100 16) loff_t object_size);
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 17)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 18) /*
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 19) * The root index is owned by FS-Cache itself.
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 20) *
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 21) * When a netfs requests caching facilities, FS-Cache will, if one doesn't
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 22) * already exist, create an entry in the root index with the key being the name
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 23) * of the netfs ("AFS" for example), and the auxiliary data holding the index
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 24) * structure version supplied by the netfs:
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 25) *
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 26) * FSDEF
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 27) * |
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 28) * +-----------+
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 29) * | |
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 30) * NFS AFS
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 31) * [v=1] [v=1]
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 32) *
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 33) * If an entry with the appropriate name does already exist, the version is
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 34) * compared. If the version is different, the entire subtree from that entry
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 35) * will be discarded and a new entry created.
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 36) *
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 37) * The new entry will be an index, and a cookie referring to it will be passed
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 38) * to the netfs. This is then the root handle by which the netfs accesses the
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 39) * cache. It can create whatever objects it likes in that index, including
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 40) * further indices.
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 41) */
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 42) static struct fscache_cookie_def fscache_fsdef_index_def = {
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 43) .name = ".FS-Cache",
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 44) .type = FSCACHE_COOKIE_TYPE_INDEX,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 45) };
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 46)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 47) struct fscache_cookie fscache_fsdef_index = {
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 48) .usage = ATOMIC_INIT(1),
1362729b169b7 (David Howells 2013-05-10 19:50:26 +0100 49) .n_active = ATOMIC_INIT(1),
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 50) .lock = __SPIN_LOCK_UNLOCKED(fscache_fsdef_index.lock),
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 51) .backing_objects = HLIST_HEAD_INIT,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 52) .def = &fscache_fsdef_index_def,
94d30ae90a00c (David Howells 2013-09-21 00:09:31 +0100 53) .flags = 1 << FSCACHE_COOKIE_ENABLED,
402cb8dda949d (David Howells 2018-04-04 13:41:28 +0100 54) .type = FSCACHE_COOKIE_TYPE_INDEX,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 55) };
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 56) EXPORT_SYMBOL(fscache_fsdef_index);
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 57)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 58) /*
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 59) * Definition of an entry in the root index. Each entry is an index, keyed to
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 60) * a specific netfs and only applicable to a particular version of the index
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 61) * structure used by that netfs.
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 62) */
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 63) struct fscache_cookie_def fscache_fsdef_netfs_def = {
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 64) .name = "FSDEF.netfs",
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 65) .type = FSCACHE_COOKIE_TYPE_INDEX,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 66) .check_aux = fscache_fsdef_netfs_check_aux,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 67) };
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 68)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 69) /*
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 70) * check that the index structure version number stored in the auxiliary data
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 71) * matches the one the netfs gave us
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 72) */
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 73) static enum fscache_checkaux fscache_fsdef_netfs_check_aux(
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 74) void *cookie_netfs_data,
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 75) const void *data,
ee1235a9a0681 (David Howells 2018-04-04 13:41:28 +0100 76) uint16_t datalen,
ee1235a9a0681 (David Howells 2018-04-04 13:41:28 +0100 77) loff_t object_size)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 78) {
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 79) struct fscache_netfs *netfs = cookie_netfs_data;
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 80) uint32_t version;
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 81)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 82) _enter("{%s},,%hu", netfs->name, datalen);
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 83)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 84) if (datalen != sizeof(version)) {
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 85) _leave(" = OBSOLETE [dl=%d v=%zu]", datalen, sizeof(version));
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 86) return FSCACHE_CHECKAUX_OBSOLETE;
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 87) }
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 88)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 89) memcpy(&version, data, sizeof(version));
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 90) if (version != netfs->version) {
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 91) _leave(" = OBSOLETE [ver=%x net=%x]", version, netfs->version);
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 92) return FSCACHE_CHECKAUX_OBSOLETE;
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 93) }
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 94)
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 95) _leave(" = OKAY");
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 96) return FSCACHE_CHECKAUX_OKAY;
a6891645cf2dd (David Howells 2009-04-03 16:42:37 +0100 97) }