VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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) }