| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | /* AFS client file system
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-04-03 16:42:41 +01:00
										 |  |  |  * Copyright (C) 2002,5 Red Hat, Inc. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * 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>
 | 
					
						
							|  |  |  | #include <linux/completion.h>
 | 
					
						
							| 
									
										
											  
											
												Detach sched.h from mm.h
First thing mm.h does is including sched.h solely for can_do_mlock() inline
function which has "current" dereference inside. By dealing with can_do_mlock()
mm.h can be detached from sched.h which is good. See below, why.
This patch
a) removes unconditional inclusion of sched.h from mm.h
b) makes can_do_mlock() normal function in mm/mlock.c
c) exports can_do_mlock() to not break compilation
d) adds sched.h inclusions back to files that were getting it indirectly.
e) adds less bloated headers to some files (asm/signal.h, jiffies.h) that were
   getting them indirectly
Net result is:
a) mm.h users would get less code to open, read, preprocess, parse, ... if
   they don't need sched.h
b) sched.h stops being dependency for significant number of files:
   on x86_64 allmodconfig touching sched.h results in recompile of 4083 files,
   after patch it's only 3744 (-8.3%).
Cross-compile tested on
	all arm defconfigs, all mips defconfigs, all powerpc defconfigs,
	alpha alpha-up
	arm
	i386 i386-up i386-defconfig i386-allnoconfig
	ia64 ia64-up
	m68k
	mips
	parisc parisc-up
	powerpc powerpc-up
	s390 s390-up
	sparc sparc-up
	sparc64 sparc64-up
	um-x86_64
	x86_64 x86_64-up x86_64-defconfig x86_64-allnoconfig
as well as my two usual configs.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
											
										 
											2007-05-21 01:22:52 +04:00
										 |  |  | #include <linux/sched.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include "internal.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MODULE_DESCRIPTION("AFS Client File System"); | 
					
						
							|  |  |  | MODULE_AUTHOR("Red Hat, Inc."); | 
					
						
							|  |  |  | MODULE_LICENSE("GPL"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | unsigned afs_debug; | 
					
						
							|  |  |  | module_param_named(debug, afs_debug, uint, S_IWUSR | S_IRUGO); | 
					
						
							| 
									
										
										
										
											2008-04-16 11:08:22 +01:00
										 |  |  | MODULE_PARM_DESC(debug, "AFS debugging mask"); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | static char *rootcell; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module_param(rootcell, charp, 0); | 
					
						
							|  |  |  | MODULE_PARM_DESC(rootcell, "root AFS cell name and VL server IP addr list"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 15:58:17 -07:00
										 |  |  | struct afs_uuid afs_uuid; | 
					
						
							| 
									
										
										
										
											2011-01-14 15:56:37 +00:00
										 |  |  | struct workqueue_struct *afs_wq; | 
					
						
							| 
									
										
										
										
											2007-04-26 15:58:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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 */ | 
					
						
							| 
									
										
										
										
											2007-05-03 03:29:41 -07:00
										 |  |  | 	ret = afs_get_MAC_address(afs_uuid.node, sizeof(afs_uuid.node)); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:58:17 -07:00
										 |  |  | 	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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * initialise the AFS client FS module | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static int __init afs_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 	int ret; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering.\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 15:58:17 -07:00
										 |  |  | 	ret = afs_get_client_UUID(); | 
					
						
							|  |  |  | 	if (ret < 0) | 
					
						
							|  |  |  | 		return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-14 15:56:37 +00:00
										 |  |  | 	/* create workqueue */ | 
					
						
							|  |  |  | 	ret = -ENOMEM; | 
					
						
							|  |  |  | 	afs_wq = alloc_workqueue("afs", 0, 0); | 
					
						
							|  |  |  | 	if (!afs_wq) | 
					
						
							|  |  |  | 		return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	/* register the /proc stuff */ | 
					
						
							|  |  |  | 	ret = afs_proc_init(); | 
					
						
							|  |  |  | 	if (ret < 0) | 
					
						
							| 
									
										
										
										
											2011-01-14 15:56:37 +00:00
										 |  |  | 		goto error_proc; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-03 16:42:41 +01:00
										 |  |  | #ifdef CONFIG_AFS_FSCACHE
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	/* we want to be able to cache */ | 
					
						
							| 
									
										
										
										
											2009-04-03 16:42:41 +01:00
										 |  |  | 	ret = fscache_register_netfs(&afs_cache_netfs); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	if (ret < 0) | 
					
						
							|  |  |  | 		goto error_cache; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* initialise the cell DB */ | 
					
						
							|  |  |  | 	ret = afs_cell_init(rootcell); | 
					
						
							|  |  |  | 	if (ret < 0) | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | 		goto error_cell_init; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 	/* initialise the VL update process */ | 
					
						
							|  |  |  | 	ret = afs_vlocation_update_init(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	if (ret < 0) | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 		goto error_vl_update_init; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 	/* initialise the callback update process */ | 
					
						
							|  |  |  | 	ret = afs_callback_update_init(); | 
					
						
							| 
									
										
										
										
											2010-08-06 17:26:48 +01:00
										 |  |  | 	if (ret < 0) | 
					
						
							|  |  |  | 		goto error_callback_update_init; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* create the RxRPC transport */ | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 	ret = afs_open_socket(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	if (ret < 0) | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 		goto error_open_socket; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* register the filesystems */ | 
					
						
							|  |  |  | 	ret = afs_fs_init(); | 
					
						
							|  |  |  | 	if (ret < 0) | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | 		goto error_fs; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | error_fs: | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 	afs_close_socket(); | 
					
						
							|  |  |  | error_open_socket: | 
					
						
							| 
									
										
										
										
											2010-08-06 17:26:48 +01:00
										 |  |  | 	afs_callback_update_kill(); | 
					
						
							|  |  |  | error_callback_update_init: | 
					
						
							|  |  |  | 	afs_vlocation_purge(); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | error_vl_update_init: | 
					
						
							| 
									
										
										
										
											2010-08-06 17:26:48 +01:00
										 |  |  | 	afs_cell_purge(); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | error_cell_init: | 
					
						
							| 
									
										
										
										
											2009-04-03 16:42:41 +01:00
										 |  |  | #ifdef CONFIG_AFS_FSCACHE
 | 
					
						
							|  |  |  | 	fscache_unregister_netfs(&afs_cache_netfs); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | error_cache: | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 	afs_proc_cleanup(); | 
					
						
							| 
									
										
										
										
											2011-01-14 15:56:37 +00:00
										 |  |  | error_proc: | 
					
						
							|  |  |  | 	destroy_workqueue(afs_wq); | 
					
						
							| 
									
										
										
										
											2007-05-09 02:33:45 -07:00
										 |  |  | 	rcu_barrier(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	printk(KERN_ERR "kAFS: failed to register: %d\n", ret); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* 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 */ | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * clean up on module removal | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static void __exit afs_exit(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 unregistering.\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	afs_fs_exit(); | 
					
						
							| 
									
										
										
										
											2007-07-15 23:40:12 -07:00
										 |  |  | 	afs_kill_lock_manager(); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:55:03 -07:00
										 |  |  | 	afs_close_socket(); | 
					
						
							|  |  |  | 	afs_purge_servers(); | 
					
						
							|  |  |  | 	afs_callback_update_kill(); | 
					
						
							|  |  |  | 	afs_vlocation_purge(); | 
					
						
							| 
									
										
										
										
											2011-01-14 15:56:37 +00:00
										 |  |  | 	destroy_workqueue(afs_wq); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	afs_cell_purge(); | 
					
						
							| 
									
										
										
										
											2009-04-03 16:42:41 +01:00
										 |  |  | #ifdef CONFIG_AFS_FSCACHE
 | 
					
						
							|  |  |  | 	fscache_unregister_netfs(&afs_cache_netfs); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 	afs_proc_cleanup(); | 
					
						
							| 
									
										
										
										
											2007-05-09 02:33:45 -07:00
										 |  |  | 	rcu_barrier(); | 
					
						
							| 
									
										
										
										
											2007-04-26 15:49:28 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | module_exit(afs_exit); |