Blame view

fs/afs/main.c 4.37 KB
ec26815ad   David Howells   [AFS]: Clean up t...
1
  /* AFS client file system
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
   *
9b3f26c91   David Howells   FS-Cache: Make kA...
3
   * Copyright (C) 2002,5 Red Hat, Inc. All Rights Reserved.
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
15
  #include <linux/completion.h>
e8edc6e03   Alexey Dobriyan   Detach sched.h fr...
16
  #include <linux/sched.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
  MODULE_DESCRIPTION("AFS Client File System");
  MODULE_AUTHOR("Red Hat, Inc.");
  MODULE_LICENSE("GPL");
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
21
22
  unsigned afs_debug;
  module_param_named(debug, afs_debug, uint, S_IWUSR | S_IRUGO);
424b00e2c   Paul Bolle   AFS: Do not descr...
23
  MODULE_PARM_DESC(debug, "AFS debugging mask");
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
24

1da177e4c   Linus Torvalds   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   David Howells   [AFS]: Add suppor...
29
  struct afs_uuid afs_uuid;
0ad53eeef   Tejun Heo   afs: add afs_wq a...
30
  struct workqueue_struct *afs_wq;
b908fe6b2   David Howells   [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   David Howells   [AFS]: Adjust the...
44
  	ret = afs_get_MAC_address(afs_uuid.node, sizeof(afs_uuid.node));
b908fe6b2   David Howells   [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   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
77
78
  /*
   * initialise the AFS client FS module
   */
  static int __init afs_init(void)
  {
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
79
  	int ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
  
  	printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering.
  ");
b908fe6b2   David Howells   [AFS]: Add suppor...
83
84
85
  	ret = afs_get_client_UUID();
  	if (ret < 0)
  		return ret;
0ad53eeef   Tejun Heo   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   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
  	/* register the /proc stuff */
  	ret = afs_proc_init();
  	if (ret < 0)
0ad53eeef   Tejun Heo   afs: add afs_wq a...
94
  		goto error_proc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95

9b3f26c91   David Howells   FS-Cache: Make kA...
96
  #ifdef CONFIG_AFS_FSCACHE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
  	/* we want to be able to cache */
9b3f26c91   David Howells   FS-Cache: Make kA...
98
  	ret = fscache_register_netfs(&afs_cache_netfs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  	if (ret < 0)
1da177e4c   Linus Torvalds   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   David Howells   [AFS]: Clean up t...
106
  		goto error_cell_init;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107

08e0e7c82   David Howells   [AF_RXRPC]: Make ...
108
109
  	/* initialise the VL update process */
  	ret = afs_vlocation_update_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
  	if (ret < 0)
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
111
  		goto error_vl_update_init;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112

08e0e7c82   David Howells   [AF_RXRPC]: Make ...
113
114
  	/* initialise the callback update process */
  	ret = afs_callback_update_init();
df44f9f4f   David Howells   AFS: Fix the modu...
115
116
  	if (ret < 0)
  		goto error_callback_update_init;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
  
  	/* create the RxRPC transport */
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
119
  	ret = afs_open_socket();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  	if (ret < 0)
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
121
  		goto error_open_socket;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
124
125
  
  	/* register the filesystems */
  	ret = afs_fs_init();
  	if (ret < 0)
ec26815ad   David Howells   [AFS]: Clean up t...
126
  		goto error_fs;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
  
  	return ret;
ec26815ad   David Howells   [AFS]: Clean up t...
129
  error_fs:
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
130
131
  	afs_close_socket();
  error_open_socket:
df44f9f4f   David Howells   AFS: Fix the modu...
132
133
134
  	afs_callback_update_kill();
  error_callback_update_init:
  	afs_vlocation_purge();
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
135
  error_vl_update_init:
df44f9f4f   David Howells   AFS: Fix the modu...
136
  	afs_cell_purge();
ec26815ad   David Howells   [AFS]: Clean up t...
137
  error_cell_init:
9b3f26c91   David Howells   FS-Cache: Make kA...
138
139
  #ifdef CONFIG_AFS_FSCACHE
  	fscache_unregister_netfs(&afs_cache_netfs);
ec26815ad   David Howells   [AFS]: Clean up t...
140
  error_cache:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  	afs_proc_cleanup();
0ad53eeef   Tejun Heo   afs: add afs_wq a...
143
144
  error_proc:
  	destroy_workqueue(afs_wq);
416351f28   David Howells   AFS: AFS fixups
145
  	rcu_barrier();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
147
148
  	printk(KERN_ERR "kAFS: failed to register: %d
  ", ret);
  	return ret;
ec26815ad   David Howells   [AFS]: Clean up t...
149
  }
1da177e4c   Linus Torvalds   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   David Howells   [AFS]: Clean up t...
155

1da177e4c   Linus Torvalds   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   David Howells   AFS: implement fi...
165
  	afs_kill_lock_manager();
08e0e7c82   David Howells   [AF_RXRPC]: Make ...
166
167
168
169
  	afs_close_socket();
  	afs_purge_servers();
  	afs_callback_update_kill();
  	afs_vlocation_purge();
0ad53eeef   Tejun Heo   afs: add afs_wq a...
170
  	destroy_workqueue(afs_wq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  	afs_cell_purge();
9b3f26c91   David Howells   FS-Cache: Make kA...
172
173
  #ifdef CONFIG_AFS_FSCACHE
  	fscache_unregister_netfs(&afs_cache_netfs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
  #endif
  	afs_proc_cleanup();
416351f28   David Howells   AFS: AFS fixups
176
  	rcu_barrier();
ec26815ad   David Howells   [AFS]: Clean up t...
177
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
  
  module_exit(afs_exit);