diff options
Diffstat (limited to 'fs/afs/main.c')
| -rw-r--r-- | fs/afs/main.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/afs/main.c b/fs/afs/main.c index cfd1cbe25b2..35de0c04729 100644 --- a/fs/afs/main.c +++ b/fs/afs/main.c @@ -30,6 +30,7 @@ module_param(rootcell, charp, 0);  MODULE_PARM_DESC(rootcell, "root AFS cell name and VL server IP addr list");  struct afs_uuid afs_uuid; +struct workqueue_struct *afs_wq;  /*   * get a client UUID @@ -54,13 +55,13 @@ static int __init afs_get_client_UUID(void)  	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; +	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; +	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, @@ -87,10 +88,16 @@ static int __init afs_init(void)  	if (ret < 0)  		return ret; +	/* create workqueue */ +	ret = -ENOMEM; +	afs_wq = alloc_workqueue("afs", 0, 0); +	if (!afs_wq) +		return ret; +  	/* register the /proc stuff */  	ret = afs_proc_init();  	if (ret < 0) -		return ret; +		goto error_proc;  #ifdef CONFIG_AFS_FSCACHE  	/* we want to be able to cache */ @@ -140,6 +147,8 @@ error_cell_init:  error_cache:  #endif  	afs_proc_cleanup(); +error_proc: +	destroy_workqueue(afs_wq);  	rcu_barrier();  	printk(KERN_ERR "kAFS: failed to register: %d\n", ret);  	return ret; @@ -163,7 +172,7 @@ static void __exit afs_exit(void)  	afs_purge_servers();  	afs_callback_update_kill();  	afs_vlocation_purge(); -	flush_scheduled_work(); +	destroy_workqueue(afs_wq);  	afs_cell_purge();  #ifdef CONFIG_AFS_FSCACHE  	fscache_unregister_netfs(&afs_cache_netfs);  | 
