1/* FS-Cache netfs (client) registration 2 * 3 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11 12#define FSCACHE_DEBUG_LEVEL COOKIE 13#include <linux/module.h> 14#include <linux/slab.h> 15#include "internal.h" 16 17static LIST_HEAD(fscache_netfs_list); 18 19/* 20 * register a network filesystem for caching 21 */ 22int __fscache_register_netfs(struct fscache_netfs *netfs) 23{ 24 struct fscache_netfs *ptr; 25 int ret; 26 27 _enter("{%s}", netfs->name); 28 29 INIT_LIST_HEAD(&netfs->link); 30 31 /* allocate a cookie for the primary index */ 32 netfs->primary_index = 33 kmem_cache_zalloc(fscache_cookie_jar, GFP_KERNEL); 34 35 if (!netfs->primary_index) { 36 _leave(" = -ENOMEM"); 37 return -ENOMEM; 38 } 39 40 /* initialise the primary index cookie */ 41 atomic_set(&netfs->primary_index->usage, 1); 42 atomic_set(&netfs->primary_index->n_children, 0); 43 44 netfs->primary_index->def = &fscache_fsdef_netfs_def; 45 netfs->primary_index->parent = &fscache_fsdef_index; 46 netfs->primary_index->netfs_data = netfs; 47 48 atomic_inc(&netfs->primary_index->parent->usage); 49 atomic_inc(&netfs->primary_index->parent->n_children); 50 51 spin_lock_init(&netfs->primary_index->lock); 52 INIT_HLIST_HEAD(&netfs->primary_index->backing_objects); 53 54 /* check the netfs type is not already present */ 55 down_write(&fscache_addremove_sem); 56 57 ret = -EEXIST; 58 list_for_each_entry(ptr, &fscache_netfs_list, link) { 59 if (strcmp(ptr->name, netfs->name) == 0) 60 goto already_registered; 61 } 62 63 list_add(&netfs->link, &fscache_netfs_list); 64 ret = 0; 65 66 printk(KERN_NOTICE "FS-Cache: Netfs '%s' registered for caching\n", 67 netfs->name); 68 69already_registered: 70 up_write(&fscache_addremove_sem); 71 72 if (ret < 0) { 73 netfs->primary_index->parent = NULL; 74 __fscache_cookie_put(netfs->primary_index); 75 netfs->primary_index = NULL; 76 } 77 78 _leave(" = %d", ret); 79 return ret; 80} 81EXPORT_SYMBOL(__fscache_register_netfs); 82 83/* 84 * unregister a network filesystem from the cache 85 * - all cookies must have been released first 86 */ 87void __fscache_unregister_netfs(struct fscache_netfs *netfs) 88{ 89 _enter("{%s.%u}", netfs->name, netfs->version); 90 91 down_write(&fscache_addremove_sem); 92 93 list_del(&netfs->link); 94 fscache_relinquish_cookie(netfs->primary_index, 0); 95 96 up_write(&fscache_addremove_sem); 97 98 printk(KERN_NOTICE "FS-Cache: Netfs '%s' unregistered from caching\n", 99 netfs->name); 100 101 _leave(""); 102} 103EXPORT_SYMBOL(__fscache_unregister_netfs); 104