| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  linux/fs/9p/vfs_dentry.c | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file contians vfs dentry ops for the 9P2000 protocol. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> | 
					
						
							|  |  |  |  *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  This program is free software; you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2006-03-25 03:07:28 -08:00
										 |  |  |  *  it under the terms of the GNU General Public License version 2 | 
					
						
							|  |  |  |  *  as published by the Free Software Foundation. | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  *  This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  *  GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  *  along with this program; if not, write to: | 
					
						
							|  |  |  |  *  Free Software Foundation | 
					
						
							|  |  |  |  *  51 Franklin Street, Fifth Floor | 
					
						
							|  |  |  |  *  Boston, MA  02111-1301  USA | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/module.h>
 | 
					
						
							|  |  |  | #include <linux/errno.h>
 | 
					
						
							|  |  |  | #include <linux/fs.h>
 | 
					
						
							|  |  |  | #include <linux/file.h>
 | 
					
						
							|  |  |  | #include <linux/pagemap.h>
 | 
					
						
							|  |  |  | #include <linux/stat.h>
 | 
					
						
							|  |  |  | #include <linux/string.h>
 | 
					
						
							|  |  |  | #include <linux/inet.h>
 | 
					
						
							|  |  |  | #include <linux/namei.h>
 | 
					
						
							|  |  |  | #include <linux/idr.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>
 | 
					
						
							| 
									
										
										
										
											2007-07-10 17:57:28 -05:00
										 |  |  | #include <net/9p/9p.h>
 | 
					
						
							|  |  |  | #include <net/9p/client.h>
 | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "v9fs.h"
 | 
					
						
							|  |  |  | #include "v9fs_vfs.h"
 | 
					
						
							|  |  |  | #include "fid.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2006-03-02 02:54:33 -08:00
										 |  |  |  * v9fs_dentry_delete - called when dentry refcount equals 0 | 
					
						
							|  |  |  |  * @dentry:  dentry in question | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-03-02 02:54:33 -08:00
										 |  |  |  * By returning 1 here we should remove cacheing of unused | 
					
						
							|  |  |  |  * dentry components. | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-25 03:07:25 -08:00
										 |  |  | static int v9fs_dentry_delete(struct dentry *dentry) | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-19 16:47:40 -06:00
										 |  |  | 	P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_name.name, | 
					
						
							|  |  |  | 									dentry); | 
					
						
							| 
									
										
										
										
											2007-02-11 13:21:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-02 02:54:33 -08:00
										 |  |  | 	return 1; | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-11 13:21:39 -06:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * v9fs_cached_dentry_delete - called when dentry refcount equals 0 | 
					
						
							|  |  |  |  * @dentry:  dentry in question | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Only return 1 if our inode is invalid.  Only non-synthetic files | 
					
						
							|  |  |  |  * (ones without mtime == 0) should be calling this function. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int v9fs_cached_dentry_delete(struct dentry *dentry) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct inode *inode = dentry->d_inode; | 
					
						
							| 
									
										
										
										
											2008-12-19 16:47:40 -06:00
										 |  |  | 	P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_name.name, | 
					
						
							|  |  |  | 									dentry); | 
					
						
							| 
									
										
										
										
											2007-02-11 13:21:39 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if(!inode) | 
					
						
							|  |  |  | 		return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * v9fs_dentry_release - called when dentry is going to be freed | 
					
						
							|  |  |  |  * @dentry:  dentry that is being release | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void v9fs_dentry_release(struct dentry *dentry) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-07-10 17:57:28 -05:00
										 |  |  | 	struct v9fs_dentry *dent; | 
					
						
							|  |  |  | 	struct p9_fid *temp, *current_fid; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-19 16:47:40 -06:00
										 |  |  | 	P9_DPRINTK(P9_DEBUG_VFS, " dentry: %s (%p)\n", dentry->d_name.name, | 
					
						
							|  |  |  | 									dentry); | 
					
						
							| 
									
										
										
										
											2007-07-10 17:57:28 -05:00
										 |  |  | 	dent = dentry->d_fsdata; | 
					
						
							|  |  |  | 	if (dent) { | 
					
						
							|  |  |  | 		list_for_each_entry_safe(current_fid, temp, &dent->fidlist, | 
					
						
							|  |  |  | 									dlist) { | 
					
						
							|  |  |  | 			p9_client_clunk(current_fid); | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-10 17:57:28 -05:00
										 |  |  | 		kfree(dent); | 
					
						
							|  |  |  | 		dentry->d_fsdata = NULL; | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 05:55:46 +00:00
										 |  |  | const struct dentry_operations v9fs_cached_dentry_operations = { | 
					
						
							| 
									
										
										
										
											2007-02-11 13:21:39 -06:00
										 |  |  | 	.d_delete = v9fs_cached_dentry_delete, | 
					
						
							|  |  |  | 	.d_release = v9fs_dentry_release, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-20 05:55:46 +00:00
										 |  |  | const struct dentry_operations v9fs_dentry_operations = { | 
					
						
							| 
									
										
										
										
											2006-03-02 02:54:33 -08:00
										 |  |  | 	.d_delete = v9fs_dentry_delete, | 
					
						
							| 
									
										
										
										
											2005-09-09 13:04:18 -07:00
										 |  |  | 	.d_release = v9fs_dentry_release, | 
					
						
							|  |  |  | }; |