2007-04-27 02:49:28 +04:00
/* AFS client file system
2005-04-17 02:20:36 +04:00
*
2009-04-03 19:42:41 +04:00
* Copyright ( C ) 2002 , 5 Red Hat , Inc . All Rights Reserved .
2005-04-17 02:20:36 +04: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-17 02:20:36 +04:00
# include "internal.h"
MODULE_DESCRIPTION ( " AFS Client File System " ) ;
MODULE_AUTHOR ( " Red Hat, Inc. " ) ;
MODULE_LICENSE ( " GPL " ) ;
2007-04-27 02:55:03 +04:00
unsigned afs_debug ;
module_param_named ( debug , afs_debug , uint , S_IWUSR | S_IRUGO ) ;
2008-04-16 14:08:22 +04:00
MODULE_PARM_DESC ( debug , " AFS debugging mask " ) ;
2007-04-27 02:55:03 +04:00
2005-04-17 02:20:36 +04: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-27 02:58:17 +04:00
struct afs_uuid afs_uuid ;
2011-01-14 18:56:37 +03:00
struct workqueue_struct * afs_wq ;
2007-04-27 02:58:17 +04: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 14:29:41 +04:00
ret = afs_get_MAC_address ( afs_uuid . node , sizeof ( afs_uuid . node ) ) ;
2007-04-27 02:58:17 +04: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-17 02:20:36 +04:00
/*
* initialise the AFS client FS module
*/
static int __init afs_init ( void )
{
2007-04-27 02:55:03 +04:00
int ret ;
2005-04-17 02:20:36 +04:00
printk ( KERN_INFO " kAFS: Red Hat AFS client v0.1 registering. \n " ) ;
2007-04-27 02:58:17 +04:00
ret = afs_get_client_UUID ( ) ;
if ( ret < 0 )
return ret ;
2011-01-14 18:56:37 +03:00
/* create workqueue */
ret = - ENOMEM ;
afs_wq = alloc_workqueue ( " afs " , 0 , 0 ) ;
if ( ! afs_wq )
return ret ;
2005-04-17 02:20:36 +04:00
/* register the /proc stuff */
ret = afs_proc_init ( ) ;
if ( ret < 0 )
2011-01-14 18:56:37 +03:00
goto error_proc ;
2005-04-17 02:20:36 +04:00
2009-04-03 19:42:41 +04:00
# ifdef CONFIG_AFS_FSCACHE
2005-04-17 02:20:36 +04:00
/* we want to be able to cache */
2009-04-03 19:42:41 +04:00
ret = fscache_register_netfs ( & afs_cache_netfs ) ;
2005-04-17 02:20:36 +04:00
if ( ret < 0 )
goto error_cache ;
# endif
/* initialise the cell DB */
ret = afs_cell_init ( rootcell ) ;
if ( ret < 0 )
2007-04-27 02:49:28 +04:00
goto error_cell_init ;
2005-04-17 02:20:36 +04:00
2007-04-27 02:55:03 +04:00
/* initialise the VL update process */
ret = afs_vlocation_update_init ( ) ;
2005-04-17 02:20:36 +04:00
if ( ret < 0 )
2007-04-27 02:55:03 +04:00
goto error_vl_update_init ;
2005-04-17 02:20:36 +04:00
2007-04-27 02:55:03 +04:00
/* initialise the callback update process */
ret = afs_callback_update_init ( ) ;
2010-08-06 20:26:48 +04:00
if ( ret < 0 )
goto error_callback_update_init ;
2005-04-17 02:20:36 +04:00
/* create the RxRPC transport */
2007-04-27 02:55:03 +04:00
ret = afs_open_socket ( ) ;
2005-04-17 02:20:36 +04:00
if ( ret < 0 )
2007-04-27 02:55:03 +04:00
goto error_open_socket ;
2005-04-17 02:20:36 +04:00
/* register the filesystems */
ret = afs_fs_init ( ) ;
if ( ret < 0 )
2007-04-27 02:49:28 +04:00
goto error_fs ;
2005-04-17 02:20:36 +04:00
return ret ;
2007-04-27 02:49:28 +04:00
error_fs :
2007-04-27 02:55:03 +04:00
afs_close_socket ( ) ;
error_open_socket :
2010-08-06 20:26:48 +04:00
afs_callback_update_kill ( ) ;
error_callback_update_init :
afs_vlocation_purge ( ) ;
2007-04-27 02:55:03 +04:00
error_vl_update_init :
2010-08-06 20:26:48 +04:00
afs_cell_purge ( ) ;
2007-04-27 02:49:28 +04:00
error_cell_init :
2009-04-03 19:42:41 +04:00
# ifdef CONFIG_AFS_FSCACHE
fscache_unregister_netfs ( & afs_cache_netfs ) ;
2007-04-27 02:49:28 +04:00
error_cache :
2005-04-17 02:20:36 +04:00
# endif
afs_proc_cleanup ( ) ;
2011-01-14 18:56:37 +03:00
error_proc :
destroy_workqueue ( afs_wq ) ;
2007-05-09 13:33:45 +04:00
rcu_barrier ( ) ;
2005-04-17 02:20:36 +04:00
printk ( KERN_ERR " kAFS: failed to register: %d \n " , ret ) ;
return ret ;
2007-04-27 02:49:28 +04:00
}
2005-04-17 02:20:36 +04: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-27 02:49:28 +04:00
2005-04-17 02:20:36 +04: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-16 10:40:12 +04:00
afs_kill_lock_manager ( ) ;
2007-04-27 02:55:03 +04:00
afs_close_socket ( ) ;
afs_purge_servers ( ) ;
afs_callback_update_kill ( ) ;
afs_vlocation_purge ( ) ;
2011-01-14 18:56:37 +03:00
destroy_workqueue ( afs_wq ) ;
2005-04-17 02:20:36 +04:00
afs_cell_purge ( ) ;
2009-04-03 19:42:41 +04:00
# ifdef CONFIG_AFS_FSCACHE
fscache_unregister_netfs ( & afs_cache_netfs ) ;
2005-04-17 02:20:36 +04:00
# endif
afs_proc_cleanup ( ) ;
2007-05-09 13:33:45 +04:00
rcu_barrier ( ) ;
2007-04-27 02:49:28 +04:00
}
2005-04-17 02:20:36 +04:00
module_exit ( afs_exit ) ;