b4d0d230ccfb5 (Thomas Gleixner 2019-05-20 19:08:01 +0200 1) // SPDX-License-Identifier: GPL-2.0-or-later
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 2) /* FS-Cache netfs (client) registration
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 3) *
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 4) * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 5) * Written by David Howells (dhowells@redhat.com)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 6) */
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 7)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 8) #define FSCACHE_DEBUG_LEVEL COOKIE
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 9) #include <linux/module.h>
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 10) #include <linux/slab.h>
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 11) #include "internal.h"
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 12)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 13) /*
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 14) * register a network filesystem for caching
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 15) */
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 16) int __fscache_register_netfs(struct fscache_netfs *netfs)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 17) {
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 18) struct fscache_cookie *candidate, *cookie;
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 19)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 20) _enter("{%s}", netfs->name);
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 21)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 22) /* allocate a cookie for the primary index */
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 23) candidate = fscache_alloc_cookie(&fscache_fsdef_index,
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 24) &fscache_fsdef_netfs_def,
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 25) netfs->name, strlen(netfs->name),
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 26) &netfs->version, sizeof(netfs->version),
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 27) netfs, 0);
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 28) if (!candidate) {
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 29) _leave(" = -ENOMEM");
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 30) return -ENOMEM;
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 31) }
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 32)
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 33) candidate->flags = 1 << FSCACHE_COOKIE_ENABLED;
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 34)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 35) /* check the netfs type is not already present */
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 36) cookie = fscache_hash_cookie(candidate);
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 37) if (!cookie)
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 38) goto already_registered;
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 39) if (cookie != candidate) {
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 40) trace_fscache_cookie(candidate, fscache_cookie_discard, 1);
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 41) fscache_free_cookie(candidate);
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 42) }
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 43)
a18feb55769b7 (David Howells 2018-04-04 13:41:27 +0100 44) fscache_cookie_get(cookie->parent, fscache_cookie_get_register_netfs);
b130ed5998e62 (Kinglong Mee 2015-11-04 15:20:24 +0000 45) atomic_inc(&cookie->parent->n_children);
86108c2e34a26 (Kinglong Mee 2015-11-04 15:20:15 +0000 46)
b130ed5998e62 (Kinglong Mee 2015-11-04 15:20:24 +0000 47) netfs->primary_index = cookie;
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 48)
36dfd116edd48 (Fabian Frederick 2014-06-04 16:05:38 -0700 49) pr_notice("Netfs '%s' registered for caching\n", netfs->name);
a18feb55769b7 (David Howells 2018-04-04 13:41:27 +0100 50) trace_fscache_netfs(netfs);
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 51) _leave(" = 0");
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 52) return 0;
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 53)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 54) already_registered:
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 55) fscache_cookie_put(candidate, fscache_cookie_put_dup_netfs);
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 56) _leave(" = -EEXIST");
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 57) return -EEXIST;
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 58) }
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 59) EXPORT_SYMBOL(__fscache_register_netfs);
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 60)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 61) /*
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 62) * unregister a network filesystem from the cache
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 63) * - all cookies must have been released first
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 64) */
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 65) void __fscache_unregister_netfs(struct fscache_netfs *netfs)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 66) {
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 67) _enter("{%s.%u}", netfs->name, netfs->version);
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 68)
402cb8dda949d (David Howells 2018-04-04 13:41:28 +0100 69) fscache_relinquish_cookie(netfs->primary_index, NULL, false);
ec0328e46d6e5 (David Howells 2018-04-04 13:41:28 +0100 70) pr_notice("Netfs '%s' unregistered from caching\n", netfs->name);
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 71)
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 72) _leave("");
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 73) }
726dd7ff10c21 (David Howells 2009-04-03 16:42:38 +0100 74) EXPORT_SYMBOL(__fscache_unregister_netfs);