Blame view
fs/afs/main.c
4.37 KB
ec26815ad [AFS]: Clean up t... |
1 |
/* AFS client file system |
1da177e4c Linux-2.6.12-rc2 |
2 |
* |
9b3f26c91 FS-Cache: Make kA... |
3 |
* Copyright (C) 2002,5 Red Hat, Inc. All Rights Reserved. |
1da177e4c Linux-2.6.12-rc2 |
4 5 6 7 8 9 10 11 12 13 14 |
* Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> |
1da177e4c Linux-2.6.12-rc2 |
15 |
#include <linux/completion.h> |
e8edc6e03 Detach sched.h fr... |
16 |
#include <linux/sched.h> |
1da177e4c Linux-2.6.12-rc2 |
17 |
#include "internal.h" |
1da177e4c Linux-2.6.12-rc2 |
18 19 20 |
MODULE_DESCRIPTION("AFS Client File System"); MODULE_AUTHOR("Red Hat, Inc."); MODULE_LICENSE("GPL"); |
08e0e7c82 [AF_RXRPC]: Make ... |
21 22 |
unsigned afs_debug; module_param_named(debug, afs_debug, uint, S_IWUSR | S_IRUGO); |
424b00e2c AFS: Do not descr... |
23 |
MODULE_PARM_DESC(debug, "AFS debugging mask"); |
08e0e7c82 [AF_RXRPC]: Make ... |
24 |
|
1da177e4c Linux-2.6.12-rc2 |
25 26 27 28 |
static char *rootcell; module_param(rootcell, charp, 0); MODULE_PARM_DESC(rootcell, "root AFS cell name and VL server IP addr list"); |
b908fe6b2 [AFS]: Add suppor... |
29 |
struct afs_uuid afs_uuid; |
0ad53eeef afs: add afs_wq a... |
30 |
struct workqueue_struct *afs_wq; |
b908fe6b2 [AFS]: Add suppor... |
31 32 33 34 35 36 37 38 39 40 41 42 43 |
/* * get a client UUID */ static int __init afs_get_client_UUID(void) { struct timespec ts; u64 uuidtime; u16 clockseq; int ret; /* read the MAC address of one of the external interfaces and construct * a UUID from it */ |
ec9c94854 [AFS]: Adjust the... |
44 |
ret = afs_get_MAC_address(afs_uuid.node, sizeof(afs_uuid.node)); |
b908fe6b2 [AFS]: Add suppor... |
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
if (ret < 0) return ret; getnstimeofday(&ts); uuidtime = (u64) ts.tv_sec * 1000 * 1000 * 10; uuidtime += ts.tv_nsec / 100; uuidtime += AFS_UUID_TO_UNIX_TIME; afs_uuid.time_low = uuidtime; afs_uuid.time_mid = uuidtime >> 32; afs_uuid.time_hi_and_version = (uuidtime >> 48) & AFS_UUID_TIMEHI_MASK; afs_uuid.time_hi_and_version = AFS_UUID_VERSION_TIME; get_random_bytes(&clockseq, 2); afs_uuid.clock_seq_low = clockseq; afs_uuid.clock_seq_hi_and_reserved = (clockseq >> 8) & AFS_UUID_CLOCKHI_MASK; afs_uuid.clock_seq_hi_and_reserved = AFS_UUID_VARIANT_STD; _debug("AFS UUID: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", afs_uuid.time_low, afs_uuid.time_mid, afs_uuid.time_hi_and_version, afs_uuid.clock_seq_hi_and_reserved, afs_uuid.clock_seq_low, afs_uuid.node[0], afs_uuid.node[1], afs_uuid.node[2], afs_uuid.node[3], afs_uuid.node[4], afs_uuid.node[5]); return 0; } |
1da177e4c Linux-2.6.12-rc2 |
74 75 76 77 78 |
/* * initialise the AFS client FS module */ static int __init afs_init(void) { |
08e0e7c82 [AF_RXRPC]: Make ... |
79 |
int ret; |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 |
printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering. "); |
b908fe6b2 [AFS]: Add suppor... |
83 84 85 |
ret = afs_get_client_UUID(); if (ret < 0) return ret; |
0ad53eeef afs: add afs_wq a... |
86 87 88 89 90 |
/* create workqueue */ ret = -ENOMEM; afs_wq = alloc_workqueue("afs", 0, 0); if (!afs_wq) return ret; |
1da177e4c Linux-2.6.12-rc2 |
91 92 93 |
/* register the /proc stuff */ ret = afs_proc_init(); if (ret < 0) |
0ad53eeef afs: add afs_wq a... |
94 |
goto error_proc; |
1da177e4c Linux-2.6.12-rc2 |
95 |
|
9b3f26c91 FS-Cache: Make kA... |
96 |
#ifdef CONFIG_AFS_FSCACHE |
1da177e4c Linux-2.6.12-rc2 |
97 |
/* we want to be able to cache */ |
9b3f26c91 FS-Cache: Make kA... |
98 |
ret = fscache_register_netfs(&afs_cache_netfs); |
1da177e4c Linux-2.6.12-rc2 |
99 |
if (ret < 0) |
1da177e4c Linux-2.6.12-rc2 |
100 101 102 103 104 105 |
goto error_cache; #endif /* initialise the cell DB */ ret = afs_cell_init(rootcell); if (ret < 0) |
ec26815ad [AFS]: Clean up t... |
106 |
goto error_cell_init; |
1da177e4c Linux-2.6.12-rc2 |
107 |
|
08e0e7c82 [AF_RXRPC]: Make ... |
108 109 |
/* initialise the VL update process */ ret = afs_vlocation_update_init(); |
1da177e4c Linux-2.6.12-rc2 |
110 |
if (ret < 0) |
08e0e7c82 [AF_RXRPC]: Make ... |
111 |
goto error_vl_update_init; |
1da177e4c Linux-2.6.12-rc2 |
112 |
|
08e0e7c82 [AF_RXRPC]: Make ... |
113 114 |
/* initialise the callback update process */ ret = afs_callback_update_init(); |
df44f9f4f AFS: Fix the modu... |
115 116 |
if (ret < 0) goto error_callback_update_init; |
1da177e4c Linux-2.6.12-rc2 |
117 118 |
/* create the RxRPC transport */ |
08e0e7c82 [AF_RXRPC]: Make ... |
119 |
ret = afs_open_socket(); |
1da177e4c Linux-2.6.12-rc2 |
120 |
if (ret < 0) |
08e0e7c82 [AF_RXRPC]: Make ... |
121 |
goto error_open_socket; |
1da177e4c Linux-2.6.12-rc2 |
122 123 124 125 |
/* register the filesystems */ ret = afs_fs_init(); if (ret < 0) |
ec26815ad [AFS]: Clean up t... |
126 |
goto error_fs; |
1da177e4c Linux-2.6.12-rc2 |
127 128 |
return ret; |
ec26815ad [AFS]: Clean up t... |
129 |
error_fs: |
08e0e7c82 [AF_RXRPC]: Make ... |
130 131 |
afs_close_socket(); error_open_socket: |
df44f9f4f AFS: Fix the modu... |
132 133 134 |
afs_callback_update_kill(); error_callback_update_init: afs_vlocation_purge(); |
08e0e7c82 [AF_RXRPC]: Make ... |
135 |
error_vl_update_init: |
df44f9f4f AFS: Fix the modu... |
136 |
afs_cell_purge(); |
ec26815ad [AFS]: Clean up t... |
137 |
error_cell_init: |
9b3f26c91 FS-Cache: Make kA... |
138 139 |
#ifdef CONFIG_AFS_FSCACHE fscache_unregister_netfs(&afs_cache_netfs); |
ec26815ad [AFS]: Clean up t... |
140 |
error_cache: |
1da177e4c Linux-2.6.12-rc2 |
141 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
142 |
afs_proc_cleanup(); |
0ad53eeef afs: add afs_wq a... |
143 144 |
error_proc: destroy_workqueue(afs_wq); |
416351f28 AFS: AFS fixups |
145 |
rcu_barrier(); |
1da177e4c Linux-2.6.12-rc2 |
146 147 148 |
printk(KERN_ERR "kAFS: failed to register: %d ", ret); return ret; |
ec26815ad [AFS]: Clean up t... |
149 |
} |
1da177e4c Linux-2.6.12-rc2 |
150 151 152 153 154 |
/* XXX late_initcall is kludgy, but the only alternative seems to create * a transport upon the first mount, which is worse. Or is it? */ late_initcall(afs_init); /* must be called after net/ to create socket */ |
ec26815ad [AFS]: Clean up t... |
155 |
|
1da177e4c Linux-2.6.12-rc2 |
156 157 158 159 160 161 162 163 164 |
/* * clean up on module removal */ static void __exit afs_exit(void) { printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 unregistering. "); afs_fs_exit(); |
e8d6c5541 AFS: implement fi... |
165 |
afs_kill_lock_manager(); |
08e0e7c82 [AF_RXRPC]: Make ... |
166 167 168 169 |
afs_close_socket(); afs_purge_servers(); afs_callback_update_kill(); afs_vlocation_purge(); |
0ad53eeef afs: add afs_wq a... |
170 |
destroy_workqueue(afs_wq); |
1da177e4c Linux-2.6.12-rc2 |
171 |
afs_cell_purge(); |
9b3f26c91 FS-Cache: Make kA... |
172 173 |
#ifdef CONFIG_AFS_FSCACHE fscache_unregister_netfs(&afs_cache_netfs); |
1da177e4c Linux-2.6.12-rc2 |
174 175 |
#endif afs_proc_cleanup(); |
416351f28 AFS: AFS fixups |
176 |
rcu_barrier(); |
ec26815ad [AFS]: Clean up t... |
177 |
} |
1da177e4c Linux-2.6.12-rc2 |
178 179 |
module_exit(afs_exit); |