Blame view
fs/afs/main.c
4.39 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> |
e0661dfc5 afs: Need linux/r... |
17 |
#include <linux/random.h> |
1da177e4c Linux-2.6.12-rc2 |
18 |
#include "internal.h" |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 |
MODULE_DESCRIPTION("AFS Client File System"); MODULE_AUTHOR("Red Hat, Inc."); MODULE_LICENSE("GPL"); |
08e0e7c82 [AF_RXRPC]: Make ... |
22 23 |
unsigned afs_debug; module_param_named(debug, afs_debug, uint, S_IWUSR | S_IRUGO); |
424b00e2c AFS: Do not descr... |
24 |
MODULE_PARM_DESC(debug, "AFS debugging mask"); |
08e0e7c82 [AF_RXRPC]: Make ... |
25 |
|
1da177e4c Linux-2.6.12-rc2 |
26 27 28 29 |
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... |
30 |
struct afs_uuid afs_uuid; |
0ad53eeef afs: add afs_wq a... |
31 |
struct workqueue_struct *afs_wq; |
b908fe6b2 [AFS]: Add suppor... |
32 33 34 35 36 37 38 39 40 41 42 43 44 |
/* * 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... |
45 |
ret = afs_get_MAC_address(afs_uuid.node, sizeof(afs_uuid.node)); |
b908fe6b2 [AFS]: Add suppor... |
46 47 48 49 50 51 52 53 54 55 |
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; |
0ef135152 AFS: Correctly as... |
56 |
afs_uuid.time_hi_and_version |= AFS_UUID_VERSION_TIME; |
b908fe6b2 [AFS]: Add suppor... |
57 58 59 60 61 |
get_random_bytes(&clockseq, 2); afs_uuid.clock_seq_low = clockseq; afs_uuid.clock_seq_hi_and_reserved = (clockseq >> 8) & AFS_UUID_CLOCKHI_MASK; |
0ef135152 AFS: Correctly as... |
62 |
afs_uuid.clock_seq_hi_and_reserved |= AFS_UUID_VARIANT_STD; |
b908fe6b2 [AFS]: Add suppor... |
63 64 65 66 67 68 69 70 71 72 73 74 |
_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 |
75 76 77 78 79 |
/* * initialise the AFS client FS module */ static int __init afs_init(void) { |
08e0e7c82 [AF_RXRPC]: Make ... |
80 |
int ret; |
1da177e4c Linux-2.6.12-rc2 |
81 82 83 |
printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering. "); |
b908fe6b2 [AFS]: Add suppor... |
84 85 86 |
ret = afs_get_client_UUID(); if (ret < 0) return ret; |
0ad53eeef afs: add afs_wq a... |
87 88 89 90 91 |
/* create workqueue */ ret = -ENOMEM; afs_wq = alloc_workqueue("afs", 0, 0); if (!afs_wq) return ret; |
1da177e4c Linux-2.6.12-rc2 |
92 93 94 |
/* register the /proc stuff */ ret = afs_proc_init(); if (ret < 0) |
0ad53eeef afs: add afs_wq a... |
95 |
goto error_proc; |
1da177e4c Linux-2.6.12-rc2 |
96 |
|
9b3f26c91 FS-Cache: Make kA... |
97 |
#ifdef CONFIG_AFS_FSCACHE |
1da177e4c Linux-2.6.12-rc2 |
98 |
/* we want to be able to cache */ |
9b3f26c91 FS-Cache: Make kA... |
99 |
ret = fscache_register_netfs(&afs_cache_netfs); |
1da177e4c Linux-2.6.12-rc2 |
100 |
if (ret < 0) |
1da177e4c Linux-2.6.12-rc2 |
101 102 103 104 105 106 |
goto error_cache; #endif /* initialise the cell DB */ ret = afs_cell_init(rootcell); if (ret < 0) |
ec26815ad [AFS]: Clean up t... |
107 |
goto error_cell_init; |
1da177e4c Linux-2.6.12-rc2 |
108 |
|
08e0e7c82 [AF_RXRPC]: Make ... |
109 110 |
/* initialise the VL update process */ ret = afs_vlocation_update_init(); |
1da177e4c Linux-2.6.12-rc2 |
111 |
if (ret < 0) |
08e0e7c82 [AF_RXRPC]: Make ... |
112 |
goto error_vl_update_init; |
1da177e4c Linux-2.6.12-rc2 |
113 |
|
08e0e7c82 [AF_RXRPC]: Make ... |
114 115 |
/* initialise the callback update process */ ret = afs_callback_update_init(); |
df44f9f4f AFS: Fix the modu... |
116 117 |
if (ret < 0) goto error_callback_update_init; |
1da177e4c Linux-2.6.12-rc2 |
118 119 |
/* create the RxRPC transport */ |
08e0e7c82 [AF_RXRPC]: Make ... |
120 |
ret = afs_open_socket(); |
1da177e4c Linux-2.6.12-rc2 |
121 |
if (ret < 0) |
08e0e7c82 [AF_RXRPC]: Make ... |
122 |
goto error_open_socket; |
1da177e4c Linux-2.6.12-rc2 |
123 124 125 126 |
/* register the filesystems */ ret = afs_fs_init(); if (ret < 0) |
ec26815ad [AFS]: Clean up t... |
127 |
goto error_fs; |
1da177e4c Linux-2.6.12-rc2 |
128 129 |
return ret; |
ec26815ad [AFS]: Clean up t... |
130 |
error_fs: |
08e0e7c82 [AF_RXRPC]: Make ... |
131 132 |
afs_close_socket(); error_open_socket: |
df44f9f4f AFS: Fix the modu... |
133 134 135 |
afs_callback_update_kill(); error_callback_update_init: afs_vlocation_purge(); |
08e0e7c82 [AF_RXRPC]: Make ... |
136 |
error_vl_update_init: |
df44f9f4f AFS: Fix the modu... |
137 |
afs_cell_purge(); |
ec26815ad [AFS]: Clean up t... |
138 |
error_cell_init: |
9b3f26c91 FS-Cache: Make kA... |
139 140 |
#ifdef CONFIG_AFS_FSCACHE fscache_unregister_netfs(&afs_cache_netfs); |
ec26815ad [AFS]: Clean up t... |
141 |
error_cache: |
1da177e4c Linux-2.6.12-rc2 |
142 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
143 |
afs_proc_cleanup(); |
0ad53eeef afs: add afs_wq a... |
144 145 |
error_proc: destroy_workqueue(afs_wq); |
416351f28 AFS: AFS fixups |
146 |
rcu_barrier(); |
1da177e4c Linux-2.6.12-rc2 |
147 148 149 |
printk(KERN_ERR "kAFS: failed to register: %d ", ret); return ret; |
ec26815ad [AFS]: Clean up t... |
150 |
} |
1da177e4c Linux-2.6.12-rc2 |
151 152 153 154 155 |
/* 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... |
156 |
|
1da177e4c Linux-2.6.12-rc2 |
157 158 159 160 161 162 163 164 165 |
/* * 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... |
166 |
afs_kill_lock_manager(); |
08e0e7c82 [AF_RXRPC]: Make ... |
167 168 169 170 |
afs_close_socket(); afs_purge_servers(); afs_callback_update_kill(); afs_vlocation_purge(); |
0ad53eeef afs: add afs_wq a... |
171 |
destroy_workqueue(afs_wq); |
1da177e4c Linux-2.6.12-rc2 |
172 |
afs_cell_purge(); |
9b3f26c91 FS-Cache: Make kA... |
173 174 |
#ifdef CONFIG_AFS_FSCACHE fscache_unregister_netfs(&afs_cache_netfs); |
1da177e4c Linux-2.6.12-rc2 |
175 176 |
#endif afs_proc_cleanup(); |
416351f28 AFS: AFS fixups |
177 |
rcu_barrier(); |
ec26815ad [AFS]: Clean up t... |
178 |
} |
1da177e4c Linux-2.6.12-rc2 |
179 180 |
module_exit(afs_exit); |