diff options
383 files changed, 1276 insertions, 1423 deletions
| diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index f48e0c6b4c4..0706d32a61e 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -10,6 +10,7 @@ be able to use diff(1).  --------------------------- dentry_operations --------------------------  prototypes:  	int (*d_revalidate)(struct dentry *, unsigned int); +	int (*d_weak_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *, @@ -25,6 +26,7 @@ prototypes:  locking rules:  		rename_lock	->d_lock	may block	rcu-walk  d_revalidate:	no		no		yes (ref-walk)	maybe +d_weak_revalidate:no		no		yes	 	no  d_hash		no		no		no		maybe  d_compare:	yes		no		no		maybe  d_delete:	no		yes		no		no diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index 0472c31c163..4db22f6491e 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -441,3 +441,7 @@ d_make_root() drops the reference to inode if dentry allocation fails.  two, it gets "is it an O_EXCL or equivalent?" boolean argument.  Note that  local filesystems can ignore tha argument - they are guaranteed that the  object doesn't exist.  It's remote/distributed ones that might care... +-- +[mandatory] +	FS_REVAL_DOT is gone; if you used to have it, add ->d_weak_revalidate() +in your dentry operations instead. diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index e3869098163..bc4b06b3160 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -900,6 +900,7 @@ defined:  struct dentry_operations {  	int (*d_revalidate)(struct dentry *, unsigned int); +	int (*d_weak_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *, @@ -915,8 +916,13 @@ struct dentry_operations {    d_revalidate: called when the VFS needs to revalidate a dentry. This  	is called whenever a name look-up finds a dentry in the -	dcache. Most filesystems leave this as NULL, because all their -	dentries in the dcache are valid +	dcache. Most local filesystems leave this as NULL, because all their +	dentries in the dcache are valid. Network filesystems are different +	since things can change on the server without the client necessarily +	being aware of it. + +	This function should return a positive value if the dentry is still +	valid, and zero or a negative error code if it isn't.  	d_revalidate may be called in rcu-walk mode (flags & LOOKUP_RCU).  	If in rcu-walk mode, the filesystem must revalidate the dentry without @@ -927,6 +933,20 @@ struct dentry_operations {  	If a situation is encountered that rcu-walk cannot handle, return  	-ECHILD and it will be called again in ref-walk mode. + d_weak_revalidate: called when the VFS needs to revalidate a "jumped" dentry. +	This is called when a path-walk ends at dentry that was not acquired by +	doing a lookup in the parent directory. This includes "/", "." and "..", +	as well as procfs-style symlinks and mountpoint traversal. + +	In this case, we are less concerned with whether the dentry is still +	fully correct, but rather that the inode is still valid. As with +	d_revalidate, most local filesystems will set this to NULL since their +	dcache entries are always valid. + +	This function has the same return code semantics as d_revalidate. + +	d_weak_revalidate is only called after leaving rcu-walk mode. +    d_hash: called when the VFS adds a dentry to the hash table. The first  	dentry passed to d_hash is the parent directory that the name is  	to be hashed into. The inode is the dentry's inode. diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c index b9fc6c309d2..e64559f0a82 100644 --- a/arch/alpha/kernel/srm_env.c +++ b/arch/alpha/kernel/srm_env.c @@ -111,7 +111,7 @@ static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,  				  size_t count, loff_t *pos)  {  	int res; -	srm_env_t	*entry = PDE(file->f_path.dentry->d_inode)->data; +	srm_env_t	*entry = PDE(file_inode(file))->data;  	char		*buf = (char *) __get_free_page(GFP_USER);  	unsigned long	ret1, ret2; diff --git a/arch/avr32/include/asm/elf.h b/arch/avr32/include/asm/elf.h index e2c32873980..d232888b99d 100644 --- a/arch/avr32/include/asm/elf.h +++ b/arch/avr32/include/asm/elf.h @@ -102,7 +102,4 @@ typedef struct user_fpu_struct elf_fpregset_t;  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK))) -  #endif /* __ASM_AVR32_ELF_H */ diff --git a/arch/blackfin/include/asm/elf.h b/arch/blackfin/include/asm/elf.h index 14bc98ff668..d15cb9b5d52 100644 --- a/arch/blackfin/include/asm/elf.h +++ b/arch/blackfin/include/asm/elf.h @@ -132,7 +132,4 @@ do {											\  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif diff --git a/arch/blackfin/kernel/cplbinfo.c b/arch/blackfin/kernel/cplbinfo.c index 0bdaa517a50..e1d0b24c607 100644 --- a/arch/blackfin/kernel/cplbinfo.c +++ b/arch/blackfin/kernel/cplbinfo.c @@ -116,7 +116,7 @@ static const struct seq_operations cplbinfo_sops = {  static int cplbinfo_open(struct inode *inode, struct file *file)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	char cplb_type;  	unsigned int cpu;  	int ret; diff --git a/arch/c6x/include/asm/elf.h b/arch/c6x/include/asm/elf.h index 32b997126ad..9a4dfc5eb24 100644 --- a/arch/c6x/include/asm/elf.h +++ b/arch/c6x/include/asm/elf.h @@ -77,9 +77,6 @@ do {								\  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  /* C6X specific section types */  #define SHT_C6000_UNWIND	0x70000001  #define SHT_C6000_PREEMPTMAP	0x70000002 diff --git a/arch/cris/arch-v10/drivers/sync_serial.c b/arch/cris/arch-v10/drivers/sync_serial.c index c4b71710fb0..a1c498d18d3 100644 --- a/arch/cris/arch-v10/drivers/sync_serial.c +++ b/arch/cris/arch-v10/drivers/sync_serial.c @@ -654,7 +654,7 @@ static int sync_serial_release(struct inode *inode, struct file *file)  static unsigned int sync_serial_poll(struct file *file, poll_table *wait)  { -	int dev = MINOR(file->f_dentry->d_inode->i_rdev); +	int dev = MINOR(file_inode(file)->i_rdev);  	unsigned int mask = 0;  	struct sync_port *port;  	DEBUGPOLL(static unsigned int prev_mask = 0); @@ -685,7 +685,7 @@ static int sync_serial_ioctl_unlocked(struct file *file,  	int return_val = 0;  	unsigned long flags; -	int dev = MINOR(file->f_dentry->d_inode->i_rdev); +	int dev = MINOR(file_inode(file)->i_rdev);  	struct sync_port *port;  	if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) { @@ -973,7 +973,7 @@ static long sync_serial_ioctl(struct file *file,  static ssize_t sync_serial_write(struct file *file, const char *buf,  	size_t count, loff_t *ppos)  { -	int dev = MINOR(file->f_dentry->d_inode->i_rdev); +	int dev = MINOR(file_inode(file)->i_rdev);  	DECLARE_WAITQUEUE(wait, current);  	struct sync_port *port;  	unsigned long flags; @@ -1097,7 +1097,7 @@ static ssize_t sync_serial_write(struct file *file, const char *buf,  static ssize_t sync_serial_read(struct file *file, char *buf,  				size_t count, loff_t *ppos)  { -	int dev = MINOR(file->f_dentry->d_inode->i_rdev); +	int dev = MINOR(file_inode(file)->i_rdev);  	int avail;  	struct sync_port *port;  	unsigned char *start; diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index f8476d9e856..877da190823 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c @@ -3135,11 +3135,10 @@ static long cryptocop_ioctl_unlocked(struct inode *inode,  static long  cryptocop_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -       struct inode *inode = file->f_path.dentry->d_inode;         long ret;         mutex_lock(&cryptocop_mutex); -       ret = cryptocop_ioctl_unlocked(inode, filp, cmd, arg); +       ret = cryptocop_ioctl_unlocked(file_inode(filp), filp, cmd, arg);         mutex_unlock(&cryptocop_mutex);         return ret; diff --git a/arch/cris/arch-v32/drivers/sync_serial.c b/arch/cris/arch-v32/drivers/sync_serial.c index a6a180bc566..219f704e322 100644 --- a/arch/cris/arch-v32/drivers/sync_serial.c +++ b/arch/cris/arch-v32/drivers/sync_serial.c @@ -609,7 +609,7 @@ static int sync_serial_release(struct inode *inode, struct file *file)  static unsigned int sync_serial_poll(struct file *file, poll_table *wait)  { -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	unsigned int mask = 0;  	sync_port *port;  	DEBUGPOLL( static unsigned int prev_mask = 0; ); @@ -657,7 +657,7 @@ static int sync_serial_ioctl(struct file *file,  {  	int return_val = 0;  	int dma_w_size = regk_dma_set_w_size1; -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	sync_port *port;  	reg_sser_rw_tr_cfg tr_cfg;  	reg_sser_rw_rec_cfg rec_cfg; @@ -979,7 +979,7 @@ static long sync_serial_ioctl(struct file *file,  static ssize_t sync_serial_write(struct file *file, const char *buf,  				 size_t count, loff_t *ppos)  { -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	DECLARE_WAITQUEUE(wait, current);  	struct sync_port *port;  	int trunc_count; @@ -1102,7 +1102,7 @@ static ssize_t sync_serial_write(struct file *file, const char *buf,  static ssize_t sync_serial_read(struct file * file, char * buf,  				size_t count, loff_t *ppos)  { -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	int avail;  	sync_port *port;  	unsigned char* start; diff --git a/arch/cris/include/asm/elf.h b/arch/cris/include/asm/elf.h index 8182f2dc89d..30ded8fbf59 100644 --- a/arch/cris/include/asm/elf.h +++ b/arch/cris/include/asm/elf.h @@ -86,7 +86,4 @@ typedef unsigned long elf_fpregset_t;  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif diff --git a/arch/frv/include/asm/elf.h b/arch/frv/include/asm/elf.h index 9ccbc80f0b1..2bac6446db4 100644 --- a/arch/frv/include/asm/elf.h +++ b/arch/frv/include/asm/elf.h @@ -137,7 +137,4 @@ do {											\  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif diff --git a/arch/h8300/include/asm/elf.h b/arch/h8300/include/asm/elf.h index 41193c396bf..6db71248a82 100644 --- a/arch/h8300/include/asm/elf.h +++ b/arch/h8300/include/asm/elf.h @@ -54,9 +54,6 @@ typedef unsigned long elf_fpregset_t;  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #define R_H8_NONE       0  #define R_H8_DIR32      1  #define R_H8_DIR32_28   2 diff --git a/arch/hexagon/include/asm/elf.h b/arch/hexagon/include/asm/elf.h index 1ba4b3bff5e..1f14e082588 100644 --- a/arch/hexagon/include/asm/elf.h +++ b/arch/hexagon/include/asm/elf.h @@ -216,11 +216,6 @@ do {					\   */  #define ELF_PLATFORM  (NULL) -#ifdef __KERNEL__ -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -#endif -  #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1  struct linux_binprm;  extern int arch_setup_additional_pages(struct linux_binprm *bprm, diff --git a/arch/ia64/include/asm/elf.h b/arch/ia64/include/asm/elf.h index b5298eb09ad..5a83c5cc3dc 100644 --- a/arch/ia64/include/asm/elf.h +++ b/arch/ia64/include/asm/elf.h @@ -201,9 +201,6 @@ extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst);     relevant until we have real hardware to play with... */  #define ELF_PLATFORM	NULL -#define SET_PERSONALITY(ex)	\ -	set_personality((current->personality & ~PER_MASK) | PER_LINUX) -  #define elf_read_implies_exec(ex, executable_stack)					\  	((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0) diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index ea39eba61ef..433f5e8a2cd 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c @@ -2221,9 +2221,9 @@ pfm_alloc_file(pfm_context_t *ctx)  	d_add(path.dentry, inode);  	file = alloc_file(&path, FMODE_READ, &pfm_file_ops); -	if (!file) { +	if (IS_ERR(file)) {  		path_put(&path); -		return ERR_PTR(-ENFILE); +		return file;  	}  	file->f_flags = O_RDONLY; diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c index 79802e540e5..aa527d7e91f 100644 --- a/arch/ia64/kernel/salinfo.c +++ b/arch/ia64/kernel/salinfo.c @@ -301,7 +301,7 @@ salinfo_event_open(struct inode *inode, struct file *file)  static ssize_t  salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct proc_dir_entry *entry = PDE(inode);  	struct salinfo_data *data = entry->data;  	char cmd[32]; @@ -463,7 +463,7 @@ retry:  static ssize_t  salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct proc_dir_entry *entry = PDE(inode);  	struct salinfo_data *data = entry->data;  	u8 *buf; @@ -524,7 +524,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu)  static ssize_t  salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct proc_dir_entry *entry = PDE(inode);  	struct salinfo_data *data = entry->data;  	char cmd[32]; diff --git a/arch/m32r/include/asm/elf.h b/arch/m32r/include/asm/elf.h index 70896161c63..8acc9da9a15 100644 --- a/arch/m32r/include/asm/elf.h +++ b/arch/m32r/include/asm/elf.h @@ -128,7 +128,4 @@ typedef elf_fpreg_t elf_fpregset_t;     intent than poking at uname or /proc/cpuinfo.  */  #define ELF_PLATFORM	(NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif  /* _ASM_M32R__ELF_H */ diff --git a/arch/m68k/include/asm/elf.h b/arch/m68k/include/asm/elf.h index f83c1d0a87c..b1c26de438b 100644 --- a/arch/m68k/include/asm/elf.h +++ b/arch/m68k/include/asm/elf.h @@ -113,7 +113,4 @@ typedef struct user_m68kfp_struct elf_fpregset_t;  #define ELF_PLATFORM  (NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index b8c18dcdd2c..88f7b50d541 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c @@ -399,11 +399,9 @@ static int file_release(struct inode *inode, struct file *filp)  static unsigned int file_poll(struct file *file, poll_table * wait)  { -	int minor; +	int minor = iminor(file_inode(file));  	unsigned int mask = 0; -	minor = iminor(file->f_path.dentry->d_inode); -  	poll_wait(file, &channel_wqs[minor].rt_queue, wait);  	poll_wait(file, &channel_wqs[minor].lx_queue, wait); @@ -424,7 +422,7 @@ static unsigned int file_poll(struct file *file, poll_table * wait)  static ssize_t file_read(struct file *file, char __user * buffer, size_t count,  			 loff_t * ppos)  { -	int minor = iminor(file->f_path.dentry->d_inode); +	int minor = iminor(file_inode(file));  	/* data available? */  	if (!rtlx_read_poll(minor, (file->f_flags & O_NONBLOCK) ? 0 : 1)) { @@ -437,11 +435,8 @@ static ssize_t file_read(struct file *file, char __user * buffer, size_t count,  static ssize_t file_write(struct file *file, const char __user * buffer,  			  size_t count, loff_t * ppos)  { -	int minor; -	struct rtlx_channel *rt; - -	minor = iminor(file->f_path.dentry->d_inode); -	rt = &rtlx->channel[minor]; +	int minor = iminor(file_inode(file)); +	struct rtlx_channel *rt = &rtlx->channel[minor];  	/* any space left... */  	if (!rtlx_write_poll(minor)) { diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 147cec19621..29933652ff4 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c @@ -1149,7 +1149,7 @@ static ssize_t vpe_write(struct file *file, const char __user * buffer,  	size_t ret = count;  	struct vpe *v; -	if (iminor(file->f_path.dentry->d_inode) != minor) +	if (iminor(file_inode(file)) != minor)  		return -ENODEV;  	v = get_vpe(tclimit); diff --git a/arch/mips/lasat/picvue_proc.c b/arch/mips/lasat/picvue_proc.c index 8e388da1926..c592bc8b8c9 100644 --- a/arch/mips/lasat/picvue_proc.c +++ b/arch/mips/lasat/picvue_proc.c @@ -64,7 +64,7 @@ static int pvc_line_proc_open(struct inode *inode, struct file *file)  static ssize_t pvc_line_proc_write(struct file *file, const char __user *buf,  				   size_t count, loff_t *pos)  { -	int lineno = *(int *)PDE(file->f_path.dentry->d_inode)->data; +	int lineno = *(int *)PDE(file_inode(file))->data;  	char kbuf[PVC_LINELEN];  	size_t len; diff --git a/arch/mn10300/include/asm/elf.h b/arch/mn10300/include/asm/elf.h index 4ebd6b3a0a1..f592d7a9f03 100644 --- a/arch/mn10300/include/asm/elf.h +++ b/arch/mn10300/include/asm/elf.h @@ -150,9 +150,4 @@ do {						\   */  #define ELF_PLATFORM  (NULL) -#ifdef __KERNEL__ -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -#endif -  #endif /* _ASM_ELF_H */ diff --git a/arch/openrisc/include/asm/elf.h b/arch/openrisc/include/asm/elf.h index f4aa8a542a2..d334e204bbd 100644 --- a/arch/openrisc/include/asm/elf.h +++ b/arch/openrisc/include/asm/elf.h @@ -62,7 +62,4 @@ extern void dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt);  #define ELF_PLATFORM	(NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index 6abf0a16323..ac9790fc383 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h @@ -103,8 +103,6 @@ do {								\  # define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \  		(exec_stk == EXSTACK_DEFAULT) : 0)  #else  -# define SET_PERSONALITY(ex) \ -  set_personality(PER_LINUX | (current->personality & (~PER_MASK)))  # define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)  #endif /* __powerpc64__ */ diff --git a/arch/powerpc/kernel/proc_powerpc.c b/arch/powerpc/kernel/proc_powerpc.c index c8ae3714e79..f19d0bdc324 100644 --- a/arch/powerpc/kernel/proc_powerpc.c +++ b/arch/powerpc/kernel/proc_powerpc.c @@ -32,7 +32,7 @@  static loff_t page_map_seek( struct file *file, loff_t off, int whence)  {  	loff_t new; -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	switch(whence) {  	case 0: @@ -55,13 +55,13 @@ static loff_t page_map_seek( struct file *file, loff_t off, int whence)  static ssize_t page_map_read( struct file *file, char __user *buf, size_t nbytes,  			      loff_t *ppos)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	return simple_read_from_buffer(buf, nbytes, ppos, dp->data, dp->size);  }  static int page_map_mmap( struct file *file, struct vm_area_struct *vma )  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	if ((vma->vm_end - vma->vm_start) > dp->size)  		return -EINVAL; diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c index 8329190312c..c642f013298 100644 --- a/arch/powerpc/kernel/rtas_flash.c +++ b/arch/powerpc/kernel/rtas_flash.c @@ -191,7 +191,7 @@ static void free_flash_list(struct flash_block_list *f)  static int rtas_flash_release(struct inode *inode, struct file *file)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_update_flash_t *uf;  	uf = (struct rtas_update_flash_t *) dp->data; @@ -253,7 +253,7 @@ static void get_flash_status_msg(int status, char *buf)  static ssize_t rtas_flash_read(struct file *file, char __user *buf,  			       size_t count, loff_t *ppos)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_update_flash_t *uf;  	char msg[RTAS_MSG_MAXLEN]; @@ -282,7 +282,7 @@ void rtas_block_ctor(void *ptr)  static ssize_t rtas_flash_write(struct file *file, const char __user *buffer,  				size_t count, loff_t *off)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_update_flash_t *uf;  	char *p;  	int next_free; @@ -374,7 +374,7 @@ static void manage_flash(struct rtas_manage_flash_t *args_buf)  static ssize_t manage_flash_read(struct file *file, char __user *buf,  			       size_t count, loff_t *ppos)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_manage_flash_t *args_buf;  	char msg[RTAS_MSG_MAXLEN];  	int msglen; @@ -391,7 +391,7 @@ static ssize_t manage_flash_read(struct file *file, char __user *buf,  static ssize_t manage_flash_write(struct file *file, const char __user *buf,  				size_t count, loff_t *off)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_manage_flash_t *args_buf;  	const char reject_str[] = "0";  	const char commit_str[] = "1"; @@ -462,7 +462,7 @@ static int get_validate_flash_msg(struct rtas_validate_flash_t *args_buf,  static ssize_t validate_flash_read(struct file *file, char __user *buf,  			       size_t count, loff_t *ppos)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_validate_flash_t *args_buf;  	char msg[RTAS_MSG_MAXLEN];  	int msglen; @@ -477,7 +477,7 @@ static ssize_t validate_flash_read(struct file *file, char __user *buf,  static ssize_t validate_flash_write(struct file *file, const char __user *buf,  				    size_t count, loff_t *off)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_validate_flash_t *args_buf;  	int rc; @@ -526,7 +526,7 @@ done:  static int validate_flash_release(struct inode *inode, struct file *file)  { -	struct proc_dir_entry *dp = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *dp = PDE(file_inode(file));  	struct rtas_validate_flash_t *args_buf;  	args_buf = (struct rtas_validate_flash_t *) dp->data; diff --git a/arch/powerpc/platforms/cell/spufs/coredump.c b/arch/powerpc/platforms/cell/spufs/coredump.c index 657e3f233a6..c9500ea7be2 100644 --- a/arch/powerpc/platforms/cell/spufs/coredump.c +++ b/arch/powerpc/platforms/cell/spufs/coredump.c @@ -111,7 +111,7 @@ static int match_context(const void *v, struct file *file, unsigned fd)  	struct spu_context *ctx;  	if (file->f_op != &spufs_context_fops)  		return 0; -	ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx; +	ctx = SPUFS_I(file_inode(file))->i_ctx;  	if (ctx->flags & SPU_CREATE_NOSCHED)  		return 0;  	return fd + 1; @@ -137,7 +137,7 @@ static struct spu_context *coredump_next_context(int *fd)  		return NULL;  	*fd = n - 1;  	file = fcheck(*fd); -	return SPUFS_I(file->f_dentry->d_inode)->i_ctx; +	return SPUFS_I(file_inode(file))->i_ctx;  }  int spufs_coredump_extra_notes_size(void) diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 0cfece4cf6e..68c57d38745 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c @@ -1852,7 +1852,7 @@ out:  static int spufs_mfc_fsync(struct file *file, loff_t start, loff_t end, int datasync)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int err = filemap_write_and_wait_range(inode->i_mapping, start, end);  	if (!err) {  		mutex_lock(&inode->i_mutex); @@ -2501,7 +2501,7 @@ static int switch_log_sprint(struct spu_context *ctx, char *tbuf, int n)  static ssize_t spufs_switch_log_read(struct file *file, char __user *buf,  			     size_t len, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct spu_context *ctx = SPUFS_I(inode)->i_ctx;  	int error = 0, cnt = 0; @@ -2571,7 +2571,7 @@ static ssize_t spufs_switch_log_read(struct file *file, char __user *buf,  static unsigned int spufs_switch_log_poll(struct file *file, poll_table *wait)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct spu_context *ctx = SPUFS_I(inode)->i_ctx;  	unsigned int mask = 0;  	int rc; diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c index dba1ce235da..863184b182f 100644 --- a/arch/powerpc/platforms/cell/spufs/inode.c +++ b/arch/powerpc/platforms/cell/spufs/inode.c @@ -199,37 +199,18 @@ static int spufs_fill_dir(struct dentry *dir,  		const struct spufs_tree_descr *files, umode_t mode,  		struct spu_context *ctx)  { -	struct dentry *dentry, *tmp; -	int ret; -  	while (files->name && files->name[0]) { -		ret = -ENOMEM; -		dentry = d_alloc_name(dir, files->name); +		int ret; +		struct dentry *dentry = d_alloc_name(dir, files->name);  		if (!dentry) -			goto out; +			return -ENOMEM;  		ret = spufs_new_file(dir->d_sb, dentry, files->ops,  					files->mode & mode, files->size, ctx);  		if (ret) -			goto out; +			return ret;  		files++;  	}  	return 0; -out: -	/* -	 * remove all children from dir. dir->inode is not set so don't -	 * just simply use spufs_prune_dir() and panic afterwards :) -	 * dput() looks like it will do the right thing: -	 * - dec parent's ref counter -	 * - remove child from parent's child list -	 * - free child's inode if possible -	 * - free child -	 */ -	list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_u.d_child) { -		dput(dentry); -	} - -	shrink_dcache_parent(dir); -	return ret;  }  static int spufs_dir_close(struct inode *inode, struct file *file) @@ -269,10 +250,9 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags,  	struct inode *inode;  	struct spu_context *ctx; -	ret = -ENOSPC;  	inode = spufs_new_inode(dir->i_sb, mode | S_IFDIR);  	if (!inode) -		goto out; +		return -ENOSPC;  	if (dir->i_mode & S_ISGID) {  		inode->i_gid = dir->i_gid; @@ -280,40 +260,38 @@ spufs_mkdir(struct inode *dir, struct dentry *dentry, unsigned int flags,  	}  	ctx = alloc_spu_context(SPUFS_I(dir)->i_gang); /* XXX gang */  	SPUFS_I(inode)->i_ctx = ctx; -	if (!ctx) -		goto out_iput; +	if (!ctx) { +		iput(inode); +		return -ENOSPC; +	}  	ctx->flags = flags;  	inode->i_op = &simple_dir_inode_operations;  	inode->i_fop = &simple_dir_operations; + +	mutex_lock(&inode->i_mutex); + +	dget(dentry); +	inc_nlink(dir); +	inc_nlink(inode); + +	d_instantiate(dentry, inode); +  	if (flags & SPU_CREATE_NOSCHED)  		ret = spufs_fill_dir(dentry, spufs_dir_nosched_contents,  					 mode, ctx);  	else  		ret = spufs_fill_dir(dentry, spufs_dir_contents, mode, ctx); -	if (ret) -		goto out_free_ctx; - -	if (spufs_get_sb_info(dir->i_sb)->debug) +	if (!ret && spufs_get_sb_info(dir->i_sb)->debug)  		ret = spufs_fill_dir(dentry, spufs_dir_debug_contents,  				mode, ctx);  	if (ret) -		goto out_free_ctx; +		spufs_rmdir(dir, dentry); -	d_instantiate(dentry, inode); -	dget(dentry); -	inc_nlink(dir); -	inc_nlink(dentry->d_inode); -	goto out; +	mutex_unlock(&inode->i_mutex); -out_free_ctx: -	spu_forget(ctx); -	put_spu_context(ctx); -out_iput: -	iput(inode); -out:  	return ret;  } @@ -368,7 +346,7 @@ spufs_assert_affinity(unsigned int flags, struct spu_gang *gang,  			return ERR_PTR(-EINVAL);  		neighbor = get_spu_context( -				SPUFS_I(filp->f_dentry->d_inode)->i_ctx); +				SPUFS_I(file_inode(filp))->i_ctx);  		if (!list_empty(&neighbor->aff_list) && !(neighbor->aff_head) &&  		    !list_is_last(&neighbor->aff_list, &gang->aff_list_head) && diff --git a/arch/powerpc/platforms/cell/spufs/syscalls.c b/arch/powerpc/platforms/cell/spufs/syscalls.c index baee994fe81..b045fdda484 100644 --- a/arch/powerpc/platforms/cell/spufs/syscalls.c +++ b/arch/powerpc/platforms/cell/spufs/syscalls.c @@ -47,7 +47,7 @@ static long do_spu_run(struct file *filp,  	if (filp->f_op != &spufs_context_fops)  		goto out; -	i = SPUFS_I(filp->f_path.dentry->d_inode); +	i = SPUFS_I(file_inode(filp));  	ret = spufs_run_spu(i->i_ctx, &npc, &status);  	if (put_user(npc, unpc)) diff --git a/arch/powerpc/platforms/pseries/hvCall_inst.c b/arch/powerpc/platforms/pseries/hvCall_inst.c index c9311cfdfca..cf4e7736e4f 100644 --- a/arch/powerpc/platforms/pseries/hvCall_inst.c +++ b/arch/powerpc/platforms/pseries/hvCall_inst.c @@ -86,7 +86,7 @@ static int hcall_inst_seq_open(struct inode *inode, struct file *file)  	rc = seq_open(file, &hcall_inst_seq_ops);  	seq = file->private_data; -	seq->private = file->f_path.dentry->d_inode->i_private; +	seq->private = file_inode(file)->i_private;  	return rc;  } diff --git a/arch/powerpc/platforms/pseries/scanlog.c b/arch/powerpc/platforms/pseries/scanlog.c index 554457294a2..47f3cda2a68 100644 --- a/arch/powerpc/platforms/pseries/scanlog.c +++ b/arch/powerpc/platforms/pseries/scanlog.c @@ -46,16 +46,12 @@ static struct proc_dir_entry *proc_ppc64_scan_log_dump;	/* The proc file */  static ssize_t scanlog_read(struct file *file, char __user *buf,  			    size_t count, loff_t *ppos)  { -        struct inode * inode = file->f_path.dentry->d_inode; -	struct proc_dir_entry *dp; -	unsigned int *data; +	struct proc_dir_entry *dp = PDE(file_inode(file)); +	unsigned int *data = (unsigned int *)dp->data;  	int status;  	unsigned long len, off;  	unsigned int wait_time; -        dp = PDE(inode); - 	data = (unsigned int *)dp->data; -  	if (count > RTAS_DATA_BUF_SIZE)  		count = RTAS_DATA_BUF_SIZE; diff --git a/arch/s390/hypfs/hypfs_dbfs.c b/arch/s390/hypfs/hypfs_dbfs.c index 13e76dabbe8..9fd4a40c675 100644 --- a/arch/s390/hypfs/hypfs_dbfs.c +++ b/arch/s390/hypfs/hypfs_dbfs.c @@ -54,7 +54,7 @@ static ssize_t dbfs_read(struct file *file, char __user *buf,  	if (*ppos != 0)  		return 0; -	df = file->f_path.dentry->d_inode->i_private; +	df = file_inode(file)->i_private;  	mutex_lock(&df->lock);  	if (!df->data) {  		data = hypfs_dbfs_data_alloc(df); diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c index 06ea69bd387..280ded8b79b 100644 --- a/arch/s390/hypfs/inode.c +++ b/arch/s390/hypfs/inode.c @@ -119,7 +119,7 @@ static void hypfs_evict_inode(struct inode *inode)  static int hypfs_open(struct inode *inode, struct file *filp)  { -	char *data = filp->f_path.dentry->d_inode->i_private; +	char *data = file_inode(filp)->i_private;  	struct hypfs_sb_info *fs_info;  	if (filp->f_mode & FMODE_WRITE) { diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h index 178ff966a8b..1bfdf24b85a 100644 --- a/arch/s390/include/asm/elf.h +++ b/arch/s390/include/asm/elf.h @@ -180,10 +180,7 @@ extern unsigned long elf_hwcap;  extern char elf_platform[];  #define ELF_PLATFORM (elf_platform) -#ifndef CONFIG_64BIT -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -#else /* CONFIG_64BIT */ +#ifdef CONFIG_64BIT  #define SET_PERSONALITY(ex)					\  do {								\  	if (personality(current->personality) != PER_LINUX32)	\ diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index 09a94cd9deb..f1279dc2e1b 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c @@ -611,7 +611,7 @@ debug_open(struct inode *inode, struct file *file)  	debug_info_t *debug_info, *debug_info_snapshot;  	mutex_lock(&debug_mutex); -	debug_info = file->f_path.dentry->d_inode->i_private; +	debug_info = file_inode(file)->i_private;  	/* find debug view */  	for (i = 0; i < DEBUG_MAX_VIEWS; i++) {  		if (!debug_info->views[i]) diff --git a/arch/s390/pci/pci_debug.c b/arch/s390/pci/pci_debug.c index a303c95346c..a5d07bc2a54 100644 --- a/arch/s390/pci/pci_debug.c +++ b/arch/s390/pci/pci_debug.c @@ -99,7 +99,7 @@ static ssize_t pci_perf_seq_write(struct file *file, const char __user *ubuf,  static int pci_perf_seq_open(struct inode *inode, struct file *filp)  {  	return single_open(filp, pci_perf_show, -			   filp->f_path.dentry->d_inode->i_private); +			   file_inode(filp)->i_private);  }  static const struct file_operations debugfs_pci_perf_fops = { @@ -121,7 +121,7 @@ static int pci_debug_show(struct seq_file *m, void *v)  static int pci_debug_seq_open(struct inode *inode, struct file *filp)  {  	return single_open(filp, pci_debug_show, -			   filp->f_path.dentry->d_inode->i_private); +			   file_inode(filp)->i_private);  }  static const struct file_operations debugfs_pci_debug_fops = { diff --git a/arch/score/include/asm/elf.h b/arch/score/include/asm/elf.h index 5d566c7a0af..6a9421c693c 100644 --- a/arch/score/include/asm/elf.h +++ b/arch/score/include/asm/elf.h @@ -52,11 +52,6 @@ typedef elf_fpreg_t	elf_fpregset_t;  #define ELF_DATA	ELFDATA2LSB  #define ELF_ARCH	EM_SCORE7 -#define SET_PERSONALITY(ex)					\ -do {								\ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))); \ -} while (0) -  struct task_struct;  struct pt_regs; diff --git a/arch/sh/mm/alignment.c b/arch/sh/mm/alignment.c index 620fa7ff9ee..aea14855e65 100644 --- a/arch/sh/mm/alignment.c +++ b/arch/sh/mm/alignment.c @@ -140,7 +140,7 @@ static int alignment_proc_open(struct inode *inode, struct file *file)  static ssize_t alignment_proc_write(struct file *file,  		const char __user *buffer, size_t count, loff_t *pos)  { -	int *data = PDE(file->f_path.dentry->d_inode)->data; +	int *data = PDE(file_inode(file))->data;  	char mode;  	if (count > 0) { diff --git a/arch/sparc/include/asm/elf_32.h b/arch/sparc/include/asm/elf_32.h index ac74a2c98e6..a24e41fcdde 100644 --- a/arch/sparc/include/asm/elf_32.h +++ b/arch/sparc/include/asm/elf_32.h @@ -128,7 +128,4 @@ typedef struct {  #define ELF_PLATFORM	(NULL) -#define SET_PERSONALITY(ex) \ -	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) -  #endif /* !(__ASMSPARC_ELF_H) */ diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index a703af19c28..03abf9b7001 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c @@ -271,7 +271,7 @@ static int load_aout_binary(struct linux_binprm *bprm)  	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&  	     N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||  	    N_TRSIZE(ex) || N_DRSIZE(ex) || -	    i_size_read(bprm->file->f_path.dentry->d_inode) < +	    i_size_read(file_inode(bprm->file)) <  	    ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {  		return -ENOEXEC;  	} @@ -425,12 +425,10 @@ beyond_if:  static int load_aout_library(struct file *file)  { -	struct inode *inode;  	unsigned long bss, start_addr, len, error;  	int retval;  	struct exec ex; -	inode = file->f_path.dentry->d_inode;  	retval = -ENOEXEC;  	error = kernel_read(file, 0, (char *) &ex, sizeof(ex)); @@ -440,7 +438,7 @@ static int load_aout_library(struct file *file)  	/* We come in here for the regular a.out style of shared libraries */  	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) ||  	    N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) || -	    i_size_read(inode) < +	    i_size_read(file_inode(file)) <  	    ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {  		goto out;  	} diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index 60c78917190..1e4dbcfe6d3 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c @@ -85,7 +85,7 @@ static ssize_t cpuid_read(struct file *file, char __user *buf,  {  	char __user *tmp = buf;  	struct cpuid_regs cmd; -	int cpu = iminor(file->f_path.dentry->d_inode); +	int cpu = iminor(file_inode(file));  	u64 pos = *ppos;  	ssize_t bytes = 0;  	int err = 0; @@ -116,7 +116,7 @@ static int cpuid_open(struct inode *inode, struct file *file)  	unsigned int cpu;  	struct cpuinfo_x86 *c; -	cpu = iminor(file->f_path.dentry->d_inode); +	cpu = iminor(file_inode(file));  	if (cpu >= nr_cpu_ids || !cpu_online(cpu))  		return -ENXIO;	/* No such CPU */ diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index 17cf7cad601..01fc5b07f95 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -302,7 +302,8 @@ static int handle_remove(const char *nodename, struct device *dev)  	if (dentry->d_inode) {  		struct kstat stat; -		err = vfs_getattr(parent.mnt, dentry, &stat); +		struct path p = {.mnt = parent.mnt, .dentry = dentry}; +		err = vfs_getattr(&p, &stat);  		if (!err && dev_mynode(dev, dentry->d_inode, &stat)) {  			struct iattr newattrs;  			/* diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 4a223fedcd7..4b1f9265887 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -279,7 +279,7 @@ MODULE_PARM_DESC(path, "customized firmware image search path with a higher prio  static noinline_for_stack long fw_file_size(struct file *file)  {  	struct kstat st; -	if (vfs_getattr(file->f_path.mnt, file->f_path.dentry, &st)) +	if (vfs_getattr(&file->f_path, &st))  		return -1;  	if (!S_ISREG(st.mode))  		return -1; diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index 9a13e889837..8f12dc78a84 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c @@ -6547,7 +6547,7 @@ static ssize_t dac960_user_command_proc_write(struct file *file,  				       const char __user *Buffer,  				       size_t Count, loff_t *pos)  { -  DAC960_Controller_T *Controller = (DAC960_Controller_T *) PDE(file->f_path.dentry->d_inode)->data; +  DAC960_Controller_T *Controller = (DAC960_Controller_T *) PDE(file_inode(file))->data;    unsigned char CommandBuffer[80];    int Length;    if (Count > sizeof(CommandBuffer)-1) return -EINVAL; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index ae125127062..8031a8cdd69 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1139,7 +1139,7 @@ loop_get_status(struct loop_device *lo, struct loop_info64 *info)  	if (lo->lo_state != Lo_bound)  		return -ENXIO; -	error = vfs_getattr(file->f_path.mnt, file->f_path.dentry, &stat); +	error = vfs_getattr(&file->f_path, &stat);  	if (error)  		return error;  	memset(info, 0, sizeof(*info)); diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 043ddcca4ab..ade146bf65e 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -625,7 +625,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd,  			return -EBUSY;  		file = fget(arg);  		if (file) { -			struct inode *inode = file->f_path.dentry->d_inode; +			struct inode *inode = file_inode(file);  			if (S_ISSOCK(inode->i_mode)) {  				nbd->file = file;  				nbd->sock = SOCKET_I(inode); diff --git a/drivers/char/dsp56k.c b/drivers/char/dsp56k.c index 052797b32bd..01a5ca7425d 100644 --- a/drivers/char/dsp56k.c +++ b/drivers/char/dsp56k.c @@ -181,7 +181,7 @@ static int dsp56k_upload(u_char __user *bin, int len)  static ssize_t dsp56k_read(struct file *file, char __user *buf, size_t count,  			   loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int dev = iminor(inode) & 0x0f;  	switch(dev) @@ -244,7 +244,7 @@ static ssize_t dsp56k_read(struct file *file, char __user *buf, size_t count,  static ssize_t dsp56k_write(struct file *file, const char __user *buf, size_t count,  			    loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int dev = iminor(inode) & 0x0f;  	switch(dev) @@ -306,7 +306,7 @@ static ssize_t dsp56k_write(struct file *file, const char __user *buf, size_t co  static long dsp56k_ioctl(struct file *file, unsigned int cmd,  			 unsigned long arg)  { -	int dev = iminor(file->f_path.dentry->d_inode) & 0x0f; +	int dev = iminor(file_inode(file)) & 0x0f;  	void __user *argp = (void __user *)arg;  	switch(dev) @@ -408,7 +408,7 @@ static long dsp56k_ioctl(struct file *file, unsigned int cmd,  #if 0  static unsigned int dsp56k_poll(struct file *file, poll_table *wait)  { -	int dev = iminor(file->f_path.dentry->d_inode) & 0x0f; +	int dev = iminor(file_inode(file)) & 0x0f;  	switch(dev)  	{ diff --git a/drivers/char/dtlk.c b/drivers/char/dtlk.c index 85156dd0cae..65a8d96c0e9 100644 --- a/drivers/char/dtlk.c +++ b/drivers/char/dtlk.c @@ -125,7 +125,7 @@ static char dtlk_write_tts(char);  static ssize_t dtlk_read(struct file *file, char __user *buf,  			 size_t count, loff_t * ppos)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	char ch;  	int i = 0, retries; @@ -177,7 +177,7 @@ static ssize_t dtlk_write(struct file *file, const char __user *buf,  	}  #endif -	if (iminor(file->f_path.dentry->d_inode) != DTLK_MINOR) +	if (iminor(file_inode(file)) != DTLK_MINOR)  		return -EINVAL;  	while (1) { diff --git a/drivers/char/lp.c b/drivers/char/lp.c index a741e418b45..dafd9ac6428 100644 --- a/drivers/char/lp.c +++ b/drivers/char/lp.c @@ -294,7 +294,7 @@ static int lp_wait_ready(int minor, int nonblock)  static ssize_t lp_write(struct file * file, const char __user * buf,  		        size_t count, loff_t *ppos)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct parport *port = lp_table[minor].dev->port;  	char *kbuf = lp_table[minor].lp_buffer;  	ssize_t retv = 0; @@ -413,7 +413,7 @@ static ssize_t lp_read(struct file * file, char __user * buf,  		       size_t count, loff_t *ppos)  {  	DEFINE_WAIT(wait); -	unsigned int minor=iminor(file->f_path.dentry->d_inode); +	unsigned int minor=iminor(file_inode(file));  	struct parport *port = lp_table[minor].dev->port;  	ssize_t retval = 0;  	char *kbuf = lp_table[minor].lp_buffer; @@ -679,7 +679,7 @@ static long lp_ioctl(struct file *file, unsigned int cmd,  	struct timeval par_timeout;  	int ret; -	minor = iminor(file->f_path.dentry->d_inode); +	minor = iminor(file_inode(file));  	mutex_lock(&lp_mutex);  	switch (cmd) {  	case LPSETTIMEOUT: @@ -707,7 +707,7 @@ static long lp_compat_ioctl(struct file *file, unsigned int cmd,  	struct timeval par_timeout;  	int ret; -	minor = iminor(file->f_path.dentry->d_inode); +	minor = iminor(file_inode(file));  	mutex_lock(&lp_mutex);  	switch (cmd) {  	case LPSETTIMEOUT: diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 6f6e92a3102..2c644afbcdd 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -708,7 +708,7 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig)  {  	loff_t ret; -	mutex_lock(&file->f_path.dentry->d_inode->i_mutex); +	mutex_lock(&file_inode(file)->i_mutex);  	switch (orig) {  	case SEEK_CUR:  		offset += file->f_pos; @@ -725,7 +725,7 @@ static loff_t memory_lseek(struct file *file, loff_t offset, int orig)  	default:  		ret = -EINVAL;  	} -	mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); +	mutex_unlock(&file_inode(file)->i_mutex);  	return ret;  } diff --git a/drivers/char/nsc_gpio.c b/drivers/char/nsc_gpio.c index 808d44e9a32..b07b119ae57 100644 --- a/drivers/char/nsc_gpio.c +++ b/drivers/char/nsc_gpio.c @@ -41,7 +41,7 @@ void nsc_gpio_dump(struct nsc_gpio_ops *amp, unsigned index)  ssize_t nsc_gpio_write(struct file *file, const char __user *data,  		       size_t len, loff_t *ppos)  { -	unsigned m = iminor(file->f_path.dentry->d_inode); +	unsigned m = iminor(file_inode(file));  	struct nsc_gpio_ops *amp = file->private_data;  	struct device *dev = amp->dev;  	size_t i; @@ -104,7 +104,7 @@ ssize_t nsc_gpio_write(struct file *file, const char __user *data,  ssize_t nsc_gpio_read(struct file *file, char __user * buf,  		      size_t len, loff_t * ppos)  { -	unsigned m = iminor(file->f_path.dentry->d_inode); +	unsigned m = iminor(file_inode(file));  	int value;  	struct nsc_gpio_ops *amp = file->private_data; diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c index a7584860e9a..c115217c79a 100644 --- a/drivers/char/pcmcia/cm4000_cs.c +++ b/drivers/char/pcmcia/cm4000_cs.c @@ -1400,7 +1400,7 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  {  	struct cm4000_dev *dev = filp->private_data;  	unsigned int iobase = dev->p_dev->resource[0]->start; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct pcmcia_device *link;  	int size;  	int rc; diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c index 1cd49241e60..ae0b42b66e5 100644 --- a/drivers/char/ppdev.c +++ b/drivers/char/ppdev.c @@ -107,7 +107,7 @@ static inline void pp_enable_irq (struct pp_struct *pp)  static ssize_t pp_read (struct file * file, char __user * buf, size_t count,  			loff_t * ppos)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct pp_struct *pp = file->private_data;  	char * kbuffer;  	ssize_t bytes_read = 0; @@ -189,7 +189,7 @@ static ssize_t pp_read (struct file * file, char __user * buf, size_t count,  static ssize_t pp_write (struct file * file, const char __user * buf,  			 size_t count, loff_t * ppos)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct pp_struct *pp = file->private_data;  	char * kbuffer;  	ssize_t bytes_written = 0; @@ -324,7 +324,7 @@ static enum ieee1284_phase init_phase (int mode)  static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct pp_struct *pp = file->private_data;  	struct parport * port;  	void __user *argp = (void __user *)arg; diff --git a/drivers/char/ps3flash.c b/drivers/char/ps3flash.c index 588063ac951..8cafa9ccd43 100644 --- a/drivers/char/ps3flash.c +++ b/drivers/char/ps3flash.c @@ -312,7 +312,7 @@ static int ps3flash_flush(struct file *file, fl_owner_t id)  static int ps3flash_fsync(struct file *file, loff_t start, loff_t end, int datasync)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int err;  	mutex_lock(&inode->i_mutex);  	err = ps3flash_writeback(ps3flash_dev); diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 54a3a6d0981..f3223aac4df 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c @@ -80,7 +80,7 @@ static int raw_open(struct inode *inode, struct file *filp)  	filp->f_flags |= O_DIRECT;  	filp->f_mapping = bdev->bd_inode->i_mapping;  	if (++raw_devices[minor].inuse == 1) -		filp->f_path.dentry->d_inode->i_mapping = +		file_inode(filp)->i_mapping =  			bdev->bd_inode->i_mapping;  	filp->private_data = bdev;  	mutex_unlock(&raw_mutex); diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c index 6386a98e43c..bf2349dbbf7 100644 --- a/drivers/char/sonypi.c +++ b/drivers/char/sonypi.c @@ -938,7 +938,7 @@ static ssize_t sonypi_misc_read(struct file *file, char __user *buf,  	}  	if (ret > 0) { -		struct inode *inode = file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(file);  		inode->i_atime = current_fs_time(inode->i_sb);  	} diff --git a/drivers/char/tb0219.c b/drivers/char/tb0219.c index 34c63f85104..47b9fdfcf08 100644 --- a/drivers/char/tb0219.c +++ b/drivers/char/tb0219.c @@ -164,7 +164,7 @@ static ssize_t tanbac_tb0219_read(struct file *file, char __user *buf, size_t le  	unsigned int minor;  	char value; -	minor = iminor(file->f_path.dentry->d_inode); +	minor = iminor(file_inode(file));  	switch (minor) {  	case 0:  		value = get_led(); @@ -200,7 +200,7 @@ static ssize_t tanbac_tb0219_write(struct file *file, const char __user *data,  	int retval = 0;  	char c; -	minor = iminor(file->f_path.dentry->d_inode); +	minor = iminor(file_inode(file));  	switch (minor) {  	case 0:  		type = TYPE_LED; diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 04a371aceb3..054e26e769e 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c @@ -202,7 +202,7 @@ static int psb_gtt_attach_pages(struct gtt_range *gt)  	WARN_ON(gt->pages);  	/* This is the shared memory object that backs the GEM resource */ -	inode = gt->gem.filp->f_path.dentry->d_inode; +	inode = file_inode(gt->gem.filp);  	mapping = inode->i_mapping;  	gt->pages = kmalloc(pages * sizeof(struct page *), GFP_KERNEL); diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 8413ffced81..0e207e6e0df 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1618,7 +1618,7 @@ i915_gem_object_truncate(struct drm_i915_gem_object *obj)  	 * To do this we must instruct the shmfs to drop all of its  	 * backing pages, *now*.  	 */ -	inode = obj->base.filp->f_path.dentry->d_inode; +	inode = file_inode(obj->base.filp);  	shmem_truncate_range(inode, 0, (loff_t)-1);  	obj->madv = __I915_MADV_PURGED; @@ -1783,7 +1783,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)  	 *  	 * Fail silently without starting the shrinker  	 */ -	mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; +	mapping = file_inode(obj->base.filp)->i_mapping;  	gfp = mapping_gfp_mask(mapping);  	gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;  	gfp &= ~(__GFP_IO | __GFP_WAIT); @@ -3747,7 +3747,7 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,  		mask |= __GFP_DMA32;  	} -	mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; +	mapping = file_inode(obj->base.filp)->i_mapping;  	mapping_set_gfp_mask(mapping, mask);  	i915_gem_object_init(obj, &i915_gem_object_ops); @@ -4232,7 +4232,7 @@ void i915_gem_free_all_phys_object(struct drm_device *dev)  void i915_gem_detach_phys_object(struct drm_device *dev,  				 struct drm_i915_gem_object *obj)  { -	struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; +	struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;  	char *vaddr;  	int i;  	int page_count; @@ -4268,7 +4268,7 @@ i915_gem_attach_phys_object(struct drm_device *dev,  			    int id,  			    int align)  { -	struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; +	struct address_space *mapping = file_inode(obj->base.filp)->i_mapping;  	drm_i915_private_t *dev_priv = dev->dev_private;  	int ret = 0;  	int page_count; diff --git a/drivers/gpu/drm/omapdrm/omap_gem_helpers.c b/drivers/gpu/drm/omapdrm/omap_gem_helpers.c index e4a66a35fc6..f9eb679eb79 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem_helpers.c +++ b/drivers/gpu/drm/omapdrm/omap_gem_helpers.c @@ -40,7 +40,7 @@ struct page **_drm_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask)  	int i, npages;  	/* This is the shared memory object that backs the GEM resource */ -	inode = obj->filp->f_path.dentry->d_inode; +	inode = file_inode(obj->filp);  	mapping = inode->i_mapping;  	npages = obj->size >> PAGE_SHIFT; diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 7d759a43029..5e93a52d4f2 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -296,7 +296,7 @@ int ttm_tt_swapin(struct ttm_tt *ttm)  	swap_storage = ttm->swap_storage;  	BUG_ON(swap_storage == NULL); -	swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; +	swap_space = file_inode(swap_storage)->i_mapping;  	for (i = 0; i < ttm->num_pages; ++i) {  		from_page = shmem_read_mapping_page(swap_space, i); @@ -345,7 +345,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)  	} else  		swap_storage = persistent_swap_storage; -	swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; +	swap_space = file_inode(swap_storage)->i_mapping;  	for (i = 0; i < ttm->num_pages; ++i) {  		from_page = ttm->pages[i]; diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index afd212c9921..3816270ba49 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c @@ -137,7 +137,7 @@ static int udl_gem_get_pages(struct udl_gem_object *obj, gfp_t gfpmask)  	if (obj->pages == NULL)  		return -ENOMEM; -	inode = obj->base.filp->f_path.dentry->d_inode; +	inode = file_inode(obj->base.filp);  	mapping = inode->i_mapping;  	gfpmask |= mapping_gfp_mask(mapping); diff --git a/drivers/hid/hid-roccat.c b/drivers/hid/hid-roccat.c index b685b04dbf9..d7437ef5c69 100644 --- a/drivers/hid/hid-roccat.c +++ b/drivers/hid/hid-roccat.c @@ -378,7 +378,7 @@ EXPORT_SYMBOL_GPL(roccat_disconnect);  static long roccat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct roccat_device *device;  	unsigned int minor = iminor(inode);  	long retval = 0; diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index f3bbbce8353..a7451632ceb 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c @@ -108,7 +108,7 @@ out:   * This function is to be called with the minors_lock mutex held */  static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, size_t count, unsigned char report_type)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct hid_device *dev;  	__u8 *buf;  	int ret = 0; @@ -176,7 +176,7 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t   *  mutex held. */  static ssize_t hidraw_get_report(struct file *file, char __user *buffer, size_t count, unsigned char report_type)  { -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	struct hid_device *dev;  	__u8 *buf;  	int ret = 0, len; @@ -340,7 +340,7 @@ unlock:  static long hidraw_ioctl(struct file *file, unsigned int cmd,  							unsigned long arg)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	unsigned int minor = iminor(inode);  	long ret = 0;  	struct hidraw *dev; diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 5ec2261574e..c3ccdea3d18 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c @@ -148,7 +148,7 @@ static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count,  		return -ENOMEM;  	pr_debug("i2c-dev: i2c-%d reading %zu bytes.\n", -		iminor(file->f_path.dentry->d_inode), count); +		iminor(file_inode(file)), count);  	ret = i2c_master_recv(client, tmp, count);  	if (ret >= 0) @@ -172,7 +172,7 @@ static ssize_t i2cdev_write(struct file *file, const char __user *buf,  		return PTR_ERR(tmp);  	pr_debug("i2c-dev: i2c-%d writing %zu bytes.\n", -		iminor(file->f_path.dentry->d_inode), count); +		iminor(file_inode(file)), count);  	ret = i2c_master_send(client, tmp, count);  	kfree(tmp); diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index a3133d7b2a0..2abcc4790f1 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c @@ -333,7 +333,7 @@ static int ide_settings_proc_open(struct inode *inode, struct file *file)  static ssize_t ide_settings_proc_write(struct file *file, const char __user *buffer,  				       size_t count, loff_t *pos)  { -	ide_drive_t	*drive = (ide_drive_t *) PDE(file->f_path.dentry->d_inode)->data; +	ide_drive_t	*drive = (ide_drive_t *) PDE(file_inode(file))->data;  	char		name[MAX_LEN + 1];  	int		for_real = 0, mul_factor, div_factor;  	unsigned long	n; @@ -558,7 +558,7 @@ static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)  static ssize_t ide_driver_proc_write(struct file *file, const char __user *buffer,  				     size_t count, loff_t *pos)  { -	ide_drive_t	*drive = (ide_drive_t *) PDE(file->f_path.dentry->d_inode)->data; +	ide_drive_t	*drive = (ide_drive_t *) PDE(file_inode(file))->data;  	char name[32];  	if (!capable(CAP_SYS_ADMIN)) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 3983a055277..e71d834c922 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -731,7 +731,7 @@ ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file,  			goto err_tree_mutex_unlock;  		} -		inode = f.file->f_path.dentry->d_inode; +		inode = file_inode(f.file);  		xrcd = find_xrcd(file->device, inode);  		if (!xrcd && !(cmd.oflags & O_CREAT)) {  			/* no file descriptor. Need CREATE flag */ diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c index 3eb7e454849..aed8afee56d 100644 --- a/drivers/infiniband/hw/ipath/ipath_file_ops.c +++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c @@ -1864,9 +1864,9 @@ static int ipath_assign_port(struct file *fp,  		goto done_chk_sdma;  	} -	i_minor = iminor(fp->f_path.dentry->d_inode) - IPATH_USER_MINOR_BASE; +	i_minor = iminor(file_inode(fp)) - IPATH_USER_MINOR_BASE;  	ipath_cdbg(VERBOSE, "open on dev %lx (minor %d)\n", -		   (long)fp->f_path.dentry->d_inode->i_rdev, i_minor); +		   (long)file_inode(fp)->i_rdev, i_minor);  	if (i_minor)  		ret = find_free_port(i_minor - 1, fp, uinfo); diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c index a4de9d58e9b..a479375a8fd 100644 --- a/drivers/infiniband/hw/ipath/ipath_fs.c +++ b/drivers/infiniband/hw/ipath/ipath_fs.c @@ -113,7 +113,7 @@ static ssize_t atomic_counters_read(struct file *file, char __user *buf,  	struct infinipath_counters counters;  	struct ipath_devdata *dd; -	dd = file->f_path.dentry->d_inode->i_private; +	dd = file_inode(file)->i_private;  	dd->ipath_f_read_counters(dd, &counters);  	return simple_read_from_buffer(buf, count, ppos, &counters, @@ -154,7 +154,7 @@ static ssize_t flash_read(struct file *file, char __user *buf,  		goto bail;  	} -	dd = file->f_path.dentry->d_inode->i_private; +	dd = file_inode(file)->i_private;  	if (ipath_eeprom_read(dd, pos, tmp, count)) {  		ipath_dev_err(dd, "failed to read from flash\n");  		ret = -ENXIO; @@ -207,7 +207,7 @@ static ssize_t flash_write(struct file *file, const char __user *buf,  		goto bail_tmp;  	} -	dd = file->f_path.dentry->d_inode->i_private; +	dd = file_inode(file)->i_private;  	if (ipath_eeprom_write(dd, pos, tmp, count)) {  		ret = -ENXIO;  		ipath_dev_err(dd, "failed to write to flash\n"); diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c index 959a5c4ff81..4f7aa301b3b 100644 --- a/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/drivers/infiniband/hw/qib/qib_file_ops.c @@ -1524,7 +1524,7 @@ static int qib_assign_ctxt(struct file *fp, const struct qib_user_info *uinfo)  		}  	} -	i_minor = iminor(fp->f_dentry->d_inode) - QIB_USER_MINOR_BASE; +	i_minor = iminor(file_inode(fp)) - QIB_USER_MINOR_BASE;  	if (i_minor)  		ret = find_free_ctxt(i_minor - 1, fp, uinfo);  	else diff --git a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c index 65a2a23f6f8..644bd6f6467 100644 --- a/drivers/infiniband/hw/qib/qib_fs.c +++ b/drivers/infiniband/hw/qib/qib_fs.c @@ -45,7 +45,7 @@  static struct super_block *qib_super; -#define private2dd(file) ((file)->f_dentry->d_inode->i_private) +#define private2dd(file) (file_inode(file)->i_private)  static int qibfs_mknod(struct inode *dir, struct dentry *dentry,  		       umode_t mode, const struct file_operations *fops, @@ -171,7 +171,7 @@ static const struct file_operations cntr_ops[] = {  };  /* - * Could use file->f_dentry->d_inode->i_ino to figure out which file, + * Could use file_inode(file)->i_ino to figure out which file,   * instead of separate routine for each, but for now, this works...   */ diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c index eb0109f9894..b34e5fd7fd9 100644 --- a/drivers/iommu/tegra-smmu.c +++ b/drivers/iommu/tegra-smmu.c @@ -968,7 +968,6 @@ static ssize_t smmu_debugfs_stats_write(struct file *file,  {  	struct smmu_debugfs_info *info;  	struct smmu_device *smmu; -	struct dentry *dent;  	int i;  	enum {  		_OFF = 0, @@ -996,8 +995,7 @@ static ssize_t smmu_debugfs_stats_write(struct file *file,  	if (i == ARRAY_SIZE(command))  		return -EINVAL; -	dent = file->f_dentry; -	info = dent->d_inode->i_private; +	info = file_inode(file)->i_private;  	smmu = info->smmu;  	offs = SMMU_CACHE_CONFIG(info->cache); @@ -1032,15 +1030,11 @@ static ssize_t smmu_debugfs_stats_write(struct file *file,  static int smmu_debugfs_stats_show(struct seq_file *s, void *v)  { -	struct smmu_debugfs_info *info; -	struct smmu_device *smmu; -	struct dentry *dent; +	struct smmu_debugfs_info *info = s->private; +	struct smmu_device *smmu = info->smmu;  	int i;  	const char * const stats[] = { "hit", "miss", }; -	dent = d_find_alias(s->private); -	info = dent->d_inode->i_private; -	smmu = info->smmu;  	for (i = 0; i < ARRAY_SIZE(stats); i++) {  		u32 val; @@ -1054,14 +1048,12 @@ static int smmu_debugfs_stats_show(struct seq_file *s, void *v)  			stats[i], val, offs);  	}  	seq_printf(s, "\n"); -	dput(dent); -  	return 0;  }  static int smmu_debugfs_stats_open(struct inode *inode, struct file *file)  { -	return single_open(file, smmu_debugfs_stats_show, inode); +	return single_open(file, smmu_debugfs_stats_show, inode->i_private);  }  static const struct file_operations smmu_debugfs_stats_fops = { diff --git a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c index af4fd3d036c..3a4165c6119 100644 --- a/drivers/isdn/hardware/eicon/divasproc.c +++ b/drivers/isdn/hardware/eicon/divasproc.c @@ -145,7 +145,7 @@ void remove_divas_proc(void)  static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,  				  size_t count, loff_t *pos)  { -	diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data; +	diva_os_xdi_adapter_t *a = PDE(file_inode(file))->data;  	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];  	if ((count == 1) || (count == 2)) { @@ -172,7 +172,7 @@ static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,  static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer,  				    size_t count, loff_t *pos)  { -	diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data; +	diva_os_xdi_adapter_t *a = PDE(file_inode(file))->data;  	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];  	if ((count == 1) || (count == 2)) { @@ -251,7 +251,7 @@ static const struct file_operations grp_opt_proc_fops = {  static ssize_t info_proc_write(struct file *file, const char __user *buffer,  			       size_t count, loff_t *pos)  { -	diva_os_xdi_adapter_t *a = PDE(file->f_path.dentry->d_inode)->data; +	diva_os_xdi_adapter_t *a = PDE(file_inode(file))->data;  	PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];  	char c[4]; diff --git a/drivers/isdn/hysdn/hysdn_proclog.c b/drivers/isdn/hysdn/hysdn_proclog.c index 88e4f0ee073..9a3ce93665c 100644 --- a/drivers/isdn/hysdn/hysdn_proclog.c +++ b/drivers/isdn/hysdn/hysdn_proclog.c @@ -173,7 +173,7 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)  {  	struct log_data *inf;  	int len; -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	struct procdata *pd = NULL;  	hysdn_card *card; @@ -319,7 +319,7 @@ static unsigned int  hysdn_log_poll(struct file *file, poll_table *wait)  {  	unsigned int mask = 0; -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	hysdn_card *card;  	struct procdata *pd = NULL; diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c index b87d9e577be..9bb12ba3191 100644 --- a/drivers/isdn/i4l/isdn_common.c +++ b/drivers/isdn/i4l/isdn_common.c @@ -1058,7 +1058,7 @@ isdn_info_update(void)  static ssize_t  isdn_read(struct file *file, char __user *buf, size_t count, loff_t *off)  { -	uint minor = iminor(file->f_path.dentry->d_inode); +	uint minor = iminor(file_inode(file));  	int len = 0;  	int drvidx;  	int chidx; @@ -1165,7 +1165,7 @@ out:  static ssize_t  isdn_write(struct file *file, const char __user *buf, size_t count, loff_t *off)  { -	uint minor = iminor(file->f_path.dentry->d_inode); +	uint minor = iminor(file_inode(file));  	int drvidx;  	int chidx;  	int retval; @@ -1228,7 +1228,7 @@ static unsigned int  isdn_poll(struct file *file, poll_table *wait)  {  	unsigned int mask = 0; -	unsigned int minor = iminor(file->f_path.dentry->d_inode); +	unsigned int minor = iminor(file_inode(file));  	int drvidx = isdn_minor2drv(minor - ISDN_MINOR_CTRL);  	mutex_lock(&isdn_mutex); @@ -1269,7 +1269,7 @@ out:  static int  isdn_ioctl(struct file *file, uint cmd, ulong arg)  { -	uint minor = iminor(file->f_path.dentry->d_inode); +	uint minor = iminor(file_inode(file));  	isdn_ctrl c;  	int drvidx;  	int ret; diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index 61d78fa03b1..38ceac5053a 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c @@ -668,7 +668,7 @@ isdn_ppp_poll(struct file *file, poll_table *wait)  	if (is->debug & 0x2)  		printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n", -		       iminor(file->f_path.dentry->d_inode)); +		       iminor(file_inode(file)));  	/* just registers wait_queue hook. This doesn't really wait. */  	poll_wait(file, &is->wq, wait); diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 7155945f8eb..4fd9d6aeff6 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -337,7 +337,7 @@ static int read_page(struct file *file, unsigned long index,  		     struct page *page)  {  	int ret = 0; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct buffer_head *bh;  	sector_t block; @@ -755,7 +755,7 @@ static void bitmap_file_unmap(struct bitmap_storage *store)  		free_buffers(sb_page);  	if (file) { -		struct inode *inode = file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(file);  		invalidate_mapping_pages(inode->i_mapping, 0, -1);  		fput(file);  	} diff --git a/drivers/media/pci/zoran/zoran_procfs.c b/drivers/media/pci/zoran/zoran_procfs.c index f1423b777db..e084b0a21b1 100644 --- a/drivers/media/pci/zoran/zoran_procfs.c +++ b/drivers/media/pci/zoran/zoran_procfs.c @@ -137,7 +137,7 @@ static int zoran_open(struct inode *inode, struct file *file)  static ssize_t zoran_write(struct file *file, const char __user *buffer,  			size_t count, loff_t *ppos)  { -	struct zoran *zr = PDE(file->f_path.dentry->d_inode)->data; +	struct zoran *zr = PDE(file_inode(file))->data;  	char *string, *sp;  	char *line, *ldelim, *varname, *svar, *tdelim; diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c index ca12d3289bf..5247d94fea2 100644 --- a/drivers/media/rc/lirc_dev.c +++ b/drivers/media/rc/lirc_dev.c @@ -531,7 +531,7 @@ EXPORT_SYMBOL(lirc_dev_fop_close);  unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait)  { -	struct irctl *ir = irctls[iminor(file->f_dentry->d_inode)]; +	struct irctl *ir = irctls[iminor(file_inode(file))];  	unsigned int ret;  	if (!ir) { @@ -565,7 +565,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  {  	__u32 mode;  	int result = 0; -	struct irctl *ir = irctls[iminor(file->f_dentry->d_inode)]; +	struct irctl *ir = irctls[iminor(file_inode(file))];  	if (!ir) {  		printk(KERN_ERR "lirc_dev: %s: no irctl found!\n", __func__); @@ -650,7 +650,7 @@ ssize_t lirc_dev_fop_read(struct file *file,  			  size_t length,  			  loff_t *ppos)  { -	struct irctl *ir = irctls[iminor(file->f_dentry->d_inode)]; +	struct irctl *ir = irctls[iminor(file_inode(file))];  	unsigned char *buf;  	int ret = 0, written = 0;  	DECLARE_WAITQUEUE(wait, current); @@ -752,16 +752,7 @@ EXPORT_SYMBOL(lirc_dev_fop_read);  void *lirc_get_pdata(struct file *file)  { -	void *data = NULL; - -	if (file && file->f_dentry && file->f_dentry->d_inode && -	    file->f_dentry->d_inode->i_rdev) { -		struct irctl *ir; -		ir = irctls[iminor(file->f_dentry->d_inode)]; -		data = ir->d.data; -	} - -	return data; +	return irctls[iminor(file_inode(file))]->d.data;  }  EXPORT_SYMBOL(lirc_get_pdata); @@ -769,7 +760,7 @@ EXPORT_SYMBOL(lirc_get_pdata);  ssize_t lirc_dev_fop_write(struct file *file, const char __user *buffer,  			   size_t length, loff_t *ppos)  { -	struct irctl *ir = irctls[iminor(file->f_dentry->d_inode)]; +	struct irctl *ir = irctls[iminor(file_inode(file))];  	if (!ir) {  		printk(KERN_ERR "%s: called with invalid irctl\n", __func__); diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 51b3a7713dc..de1e9ab7db9 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c @@ -222,7 +222,7 @@ static struct class video_class = {  struct video_device *video_devdata(struct file *file)  { -	return video_device[iminor(file->f_path.dentry->d_inode)]; +	return video_device[iminor(file_inode(file))];  }  EXPORT_SYMBOL(video_devdata); diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c index 818b65c85d1..8f30d385bfa 100644 --- a/drivers/mtd/nand/nandsim.c +++ b/drivers/mtd/nand/nandsim.c @@ -1408,40 +1408,32 @@ static void clear_memalloc(int memalloc)  		current->flags &= ~PF_MEMALLOC;  } -static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t *pos) +static ssize_t read_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t pos)  { -	mm_segment_t old_fs;  	ssize_t tx;  	int err, memalloc; -	err = get_pages(ns, file, count, *pos); +	err = get_pages(ns, file, count, pos);  	if (err)  		return err; -	old_fs = get_fs(); -	set_fs(get_ds());  	memalloc = set_memalloc(); -	tx = vfs_read(file, (char __user *)buf, count, pos); +	tx = kernel_read(file, pos, buf, count);  	clear_memalloc(memalloc); -	set_fs(old_fs);  	put_pages(ns);  	return tx;  } -static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t *pos) +static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size_t count, loff_t pos)  { -	mm_segment_t old_fs;  	ssize_t tx;  	int err, memalloc; -	err = get_pages(ns, file, count, *pos); +	err = get_pages(ns, file, count, pos);  	if (err)  		return err; -	old_fs = get_fs(); -	set_fs(get_ds());  	memalloc = set_memalloc(); -	tx = vfs_write(file, (char __user *)buf, count, pos); +	tx = kernel_write(file, buf, count, pos);  	clear_memalloc(memalloc); -	set_fs(old_fs);  	put_pages(ns);  	return tx;  } @@ -1511,7 +1503,7 @@ static void read_page(struct nandsim *ns, int num)  			if (do_read_error(ns, num))  				return;  			pos = (loff_t)ns->regs.row * ns->geom.pgszoob + ns->regs.column + ns->regs.off; -			tx = read_file(ns, ns->cfile, ns->buf.byte, num, &pos); +			tx = read_file(ns, ns->cfile, ns->buf.byte, num, pos);  			if (tx != num) {  				NS_ERR("read_page: read error for page %d ret %ld\n", ns->regs.row, (long)tx);  				return; @@ -1573,7 +1565,7 @@ static int prog_page(struct nandsim *ns, int num)  	u_char *pg_off;  	if (ns->cfile) { -		loff_t off, pos; +		loff_t off;  		ssize_t tx;  		int all; @@ -1585,8 +1577,7 @@ static int prog_page(struct nandsim *ns, int num)  			memset(ns->file_buf, 0xff, ns->geom.pgszoob);  		} else {  			all = 0; -			pos = off; -			tx = read_file(ns, ns->cfile, pg_off, num, &pos); +			tx = read_file(ns, ns->cfile, pg_off, num, off);  			if (tx != num) {  				NS_ERR("prog_page: read error for page %d ret %ld\n", ns->regs.row, (long)tx);  				return -1; @@ -1595,16 +1586,15 @@ static int prog_page(struct nandsim *ns, int num)  		for (i = 0; i < num; i++)  			pg_off[i] &= ns->buf.byte[i];  		if (all) { -			pos = (loff_t)ns->regs.row * ns->geom.pgszoob; -			tx = write_file(ns, ns->cfile, ns->file_buf, ns->geom.pgszoob, &pos); +			loff_t pos = (loff_t)ns->regs.row * ns->geom.pgszoob; +			tx = write_file(ns, ns->cfile, ns->file_buf, ns->geom.pgszoob, pos);  			if (tx != ns->geom.pgszoob) {  				NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx);  				return -1;  			}  			ns->pages_written[ns->regs.row] = 1;  		} else { -			pos = off; -			tx = write_file(ns, ns->cfile, pg_off, num, &pos); +			tx = write_file(ns, ns->cfile, pg_off, num, off);  			if (tx != num) {  				NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx);  				return -1; diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index dfcc65b33e9..4f02848bb2b 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c @@ -194,7 +194,7 @@ static int vol_cdev_fsync(struct file *file, loff_t start, loff_t end,  {  	struct ubi_volume_desc *desc = file->private_data;  	struct ubi_device *ubi = desc->vol->ubi; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int err;  	mutex_lock(&inode->i_mutex);  	err = ubi_sync(ubi->ubi_num); diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index c6c05bfef0e..e707e31abd8 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c @@ -2347,7 +2347,7 @@ static ssize_t mem_read(struct file *file, char __user *buf, size_t count,  			loff_t *ppos)  {  	loff_t pos = *ppos; -	loff_t avail = file->f_path.dentry->d_inode->i_size; +	loff_t avail = file_inode(file)->i_size;  	unsigned int mem = (uintptr_t)file->private_data & 3;  	struct adapter *adap = file->private_data - mem; diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 0179cefae43..84734a80509 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c @@ -938,14 +938,14 @@ static int cosa_open(struct inode *inode, struct file *file)  	int ret = 0;  	mutex_lock(&cosa_chardev_mutex); -	if ((n=iminor(file->f_path.dentry->d_inode)>>CARD_MINOR_BITS) +	if ((n=iminor(file_inode(file))>>CARD_MINOR_BITS)  		>= nr_cards) {  		ret = -ENODEV;  		goto out;  	}  	cosa = cosa_cards+n; -	if ((n=iminor(file->f_path.dentry->d_inode) +	if ((n=iminor(file_inode(file))  		& ((1<<CARD_MINOR_BITS)-1)) >= cosa->nchannels) {  		ret = -ENODEV;  		goto out; diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index e7cf37f550d..3109c0db66e 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c @@ -2778,7 +2778,7 @@ static ssize_t int_proc_write(struct file *file, const char __user *buffer,  		nr = nr * 10 + c;  		p++;  	} while (--len); -	*(int *)PDE(file->f_path.dentry->d_inode)->data = nr; +	*(int *)PDE(file_inode(file))->data = nr;  	return count;  } diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 849357c1045..445ffda715a 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c @@ -139,17 +139,22 @@ static int __oprofilefs_create_file(struct super_block *sb,  	struct dentry *dentry;  	struct inode *inode; +	mutex_lock(&root->d_inode->i_mutex);  	dentry = d_alloc_name(root, name); -	if (!dentry) +	if (!dentry) { +		mutex_unlock(&root->d_inode->i_mutex);  		return -ENOMEM; +	}  	inode = oprofilefs_get_inode(sb, S_IFREG | perm);  	if (!inode) {  		dput(dentry); +		mutex_unlock(&root->d_inode->i_mutex);  		return -ENOMEM;  	}  	inode->i_fop = fops; +	inode->i_private = priv;  	d_add(dentry, inode); -	dentry->d_inode->i_private = priv; +	mutex_unlock(&root->d_inode->i_mutex);  	return 0;  } @@ -212,17 +217,22 @@ struct dentry *oprofilefs_mkdir(struct super_block *sb,  	struct dentry *dentry;  	struct inode *inode; +	mutex_lock(&root->d_inode->i_mutex);  	dentry = d_alloc_name(root, name); -	if (!dentry) +	if (!dentry) { +		mutex_unlock(&root->d_inode->i_mutex);  		return NULL; +	}  	inode = oprofilefs_get_inode(sb, S_IFDIR | 0755);  	if (!inode) {  		dput(dentry); +		mutex_unlock(&root->d_inode->i_mutex);  		return NULL;  	}  	inode->i_op = &simple_dir_inode_operations;  	inode->i_fop = &simple_dir_operations;  	d_add(dentry, inode); +	mutex_unlock(&root->d_inode->i_mutex);  	return dentry;  } diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index f2f501e5b6a..d4d800c54d8 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -179,7 +179,7 @@ static int led_proc_open(struct inode *inode, struct file *file)  static ssize_t led_proc_write(struct file *file, const char *buf,  	size_t count, loff_t *pos)  { -	void *data = PDE(file->f_path.dentry->d_inode)->data; +	void *data = PDE(file_inode(file))->data;  	char *cur, lbuf[32];  	int d; diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index 9b8505ccc56..0b009470e6d 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c @@ -21,7 +21,7 @@ static loff_t  proc_bus_pci_lseek(struct file *file, loff_t off, int whence)  {  	loff_t new = -1; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	mutex_lock(&inode->i_mutex);  	switch (whence) { @@ -46,7 +46,7 @@ proc_bus_pci_lseek(struct file *file, loff_t off, int whence)  static ssize_t  proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)  { -	const struct inode *ino = file->f_path.dentry->d_inode; +	const struct inode *ino = file_inode(file);  	const struct proc_dir_entry *dp = PDE(ino);  	struct pci_dev *dev = dp->data;  	unsigned int pos = *ppos; @@ -132,7 +132,7 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp  static ssize_t  proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos)  { -	struct inode *ino = file->f_path.dentry->d_inode; +	struct inode *ino = file_inode(file);  	const struct proc_dir_entry *dp = PDE(ino);  	struct pci_dev *dev = dp->data;  	int pos = *ppos; @@ -212,7 +212,7 @@ struct pci_filp_private {  static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,  			       unsigned long arg)  { -	const struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode); +	const struct proc_dir_entry *dp = PDE(file_inode(file));  	struct pci_dev *dev = dp->data;  #ifdef HAVE_PCI_MMAP  	struct pci_filp_private *fpriv = file->private_data; @@ -253,7 +253,7 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,  #ifdef HAVE_PCI_MMAP  static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	const struct proc_dir_entry *dp = PDE(inode);  	struct pci_dev *dev = dp->data;  	struct pci_filp_private *fpriv = file->private_data; diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index ceb41eff423..8da21876a79 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c @@ -3566,7 +3566,7 @@ static ssize_t sonypi_misc_read(struct file *file, char __user *buf,  	}  	if (ret > 0) { -		struct inode *inode = file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(file);  		inode->i_atime = current_fs_time(inode->i_sb);  	} diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index ebcb461bb2b..f4f8408f3b5 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -852,7 +852,7 @@ static ssize_t dispatch_proc_write(struct file *file,  			const char __user *userbuf,  			size_t count, loff_t *pos)  { -	struct ibm_struct *ibm = PDE(file->f_path.dentry->d_inode)->data; +	struct ibm_struct *ibm = PDE(file_inode(file))->data;  	char *kernbuf;  	int ret; diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 904476b2fa8..242abac62d8 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c @@ -583,7 +583,7 @@ static int set_lcd_status(struct backlight_device *bd)  static ssize_t lcd_proc_write(struct file *file, const char __user *buf,  			      size_t count, loff_t *pos)  { -	struct toshiba_acpi_dev *dev = PDE(file->f_path.dentry->d_inode)->data; +	struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data;  	char cmd[42];  	size_t len;  	int value; @@ -650,7 +650,7 @@ static int video_proc_open(struct inode *inode, struct file *file)  static ssize_t video_proc_write(struct file *file, const char __user *buf,  				size_t count, loff_t *pos)  { -	struct toshiba_acpi_dev *dev = PDE(file->f_path.dentry->d_inode)->data; +	struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data;  	char *cmd, *buffer;  	int ret;  	int value; @@ -750,7 +750,7 @@ static int fan_proc_open(struct inode *inode, struct file *file)  static ssize_t fan_proc_write(struct file *file, const char __user *buf,  			      size_t count, loff_t *pos)  { -	struct toshiba_acpi_dev *dev = PDE(file->f_path.dentry->d_inode)->data; +	struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data;  	char cmd[42];  	size_t len;  	int value; @@ -822,7 +822,7 @@ static int keys_proc_open(struct inode *inode, struct file *file)  static ssize_t keys_proc_write(struct file *file, const char __user *buf,  			       size_t count, loff_t *pos)  { -	struct toshiba_acpi_dev *dev = PDE(file->f_path.dentry->d_inode)->data; +	struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data;  	char cmd[42];  	size_t len;  	int value; diff --git a/drivers/pnp/isapnp/proc.c b/drivers/pnp/isapnp/proc.c index 315b3112aca..65f735ac6b3 100644 --- a/drivers/pnp/isapnp/proc.c +++ b/drivers/pnp/isapnp/proc.c @@ -30,7 +30,7 @@ static struct proc_dir_entry *isapnp_proc_bus_dir = NULL;  static loff_t isapnp_proc_bus_lseek(struct file *file, loff_t off, int whence)  {  	loff_t new = -1; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	mutex_lock(&inode->i_mutex);  	switch (whence) { @@ -55,7 +55,7 @@ static loff_t isapnp_proc_bus_lseek(struct file *file, loff_t off, int whence)  static ssize_t isapnp_proc_bus_read(struct file *file, char __user * buf,  				    size_t nbytes, loff_t * ppos)  { -	struct inode *ino = file->f_path.dentry->d_inode; +	struct inode *ino = file_inode(file);  	struct proc_dir_entry *dp = PDE(ino);  	struct pnp_dev *dev = dp->data;  	int pos = *ppos; diff --git a/drivers/pnp/pnpbios/proc.c b/drivers/pnp/pnpbios/proc.c index bc89f392a62..63ddb017345 100644 --- a/drivers/pnp/pnpbios/proc.c +++ b/drivers/pnp/pnpbios/proc.c @@ -244,7 +244,7 @@ static int pnpbios_proc_open(struct inode *inode, struct file *file)  static ssize_t pnpbios_proc_write(struct file *file, const char __user *buf,  				  size_t count, loff_t *pos)  { -	void *data = PDE(file->f_path.dentry->d_inode)->data; +	void *data = PDE(file_inode(file))->data;  	struct pnp_bios_node *node;  	int boot = (long)data >> 8;  	u8 nodenum = (long)data; diff --git a/drivers/s390/char/fs3270.c b/drivers/s390/char/fs3270.c index 230697aac94..96e52bf7593 100644 --- a/drivers/s390/char/fs3270.c +++ b/drivers/s390/char/fs3270.c @@ -433,9 +433,9 @@ fs3270_open(struct inode *inode, struct file *filp)  	struct idal_buffer *ib;  	int minor, rc = 0; -	if (imajor(filp->f_path.dentry->d_inode) != IBM_FS3270_MAJOR) +	if (imajor(file_inode(filp)) != IBM_FS3270_MAJOR)  		return -ENODEV; -	minor = iminor(filp->f_path.dentry->d_inode); +	minor = iminor(file_inode(filp));  	/* Check for minor 0 multiplexer. */  	if (minor == 0) {  		struct tty_struct *tty = get_current_tty(); diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c index 2d61db3fc62..6dc60725de9 100644 --- a/drivers/s390/char/tape_char.c +++ b/drivers/s390/char/tape_char.c @@ -273,13 +273,13 @@ tapechar_open (struct inode *inode, struct file *filp)  	int minor, rc;  	DBF_EVENT(6, "TCHAR:open: %i:%i\n", -		imajor(filp->f_path.dentry->d_inode), -		iminor(filp->f_path.dentry->d_inode)); +		imajor(file_inode(filp)), +		iminor(file_inode(filp))); -	if (imajor(filp->f_path.dentry->d_inode) != tapechar_major) +	if (imajor(file_inode(filp)) != tapechar_major)  		return -ENODEV; -	minor = iminor(filp->f_path.dentry->d_inode); +	minor = iminor(file_inode(filp));  	device = tape_find_device(minor / TAPE_MINORS_PER_DEV);  	if (IS_ERR(device)) {  		DBF_EVENT(3, "TCHAR:open: tape_find_device() failed\n"); diff --git a/drivers/s390/char/vmur.c b/drivers/s390/char/vmur.c index 483f72ba030..c180e3135b3 100644 --- a/drivers/s390/char/vmur.c +++ b/drivers/s390/char/vmur.c @@ -703,7 +703,7 @@ static int ur_open(struct inode *inode, struct file *file)  	 * We treat the minor number as the devno of the ur device  	 * to find in the driver tree.  	 */ -	devno = MINOR(file->f_dentry->d_inode->i_rdev); +	devno = MINOR(file_inode(file)->i_rdev);  	urd = urdev_get_from_devno(devno);  	if (!urd) { diff --git a/drivers/s390/cio/qdio_debug.c b/drivers/s390/cio/qdio_debug.c index e6e0d31c02a..749b72739c4 100644 --- a/drivers/s390/cio/qdio_debug.c +++ b/drivers/s390/cio/qdio_debug.c @@ -128,7 +128,7 @@ static int qstat_show(struct seq_file *m, void *v)  static int qstat_seq_open(struct inode *inode, struct file *filp)  {  	return single_open(filp, qstat_show, -			   filp->f_path.dentry->d_inode->i_private); +			   file_inode(filp)->i_private);  }  static const struct file_operations debugfs_fops = { @@ -221,7 +221,7 @@ static ssize_t qperf_seq_write(struct file *file, const char __user *ubuf,  static int qperf_seq_open(struct inode *inode, struct file *filp)  {  	return single_open(filp, qperf_show, -			   filp->f_path.dentry->d_inode->i_private); +			   file_inode(filp)->i_private);  }  static struct file_operations debugfs_perf_fops = { diff --git a/drivers/sbus/char/display7seg.c b/drivers/sbus/char/display7seg.c index e85c803b30c..fc1339cf91a 100644 --- a/drivers/sbus/char/display7seg.c +++ b/drivers/sbus/char/display7seg.c @@ -107,7 +107,7 @@ static long d7s_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	int error = 0;  	u8 ireg = 0; -	if (D7S_MINOR != iminor(file->f_path.dentry->d_inode)) +	if (D7S_MINOR != iminor(file_inode(file)))  		return -ENODEV;  	mutex_lock(&d7s_mutex); diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index d1f0120cdb9..5e1e12c0cf4 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c @@ -640,7 +640,7 @@ out:  /* This function handles ioctl for the character device */  static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	long timeout;  	unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;  	dma_addr_t dma_handle; diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c index 52a2f0580d9..c845bdbeb6c 100644 --- a/drivers/scsi/3w-sas.c +++ b/drivers/scsi/3w-sas.c @@ -757,7 +757,7 @@ static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long  	dma_addr_t dma_handle;  	int request_id = 0;  	TW_Ioctl_Driver_Command driver_command; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	TW_Ioctl_Buf_Apache *tw_ioctl;  	TW_Command_Full *full_command_packet;  	TW_Device_Extension *tw_dev = twl_device_extension_list[iminor(inode)]; diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c index 62071d2fc1c..56662ae03de 100644 --- a/drivers/scsi/3w-xxxx.c +++ b/drivers/scsi/3w-xxxx.c @@ -889,7 +889,7 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a  	unsigned long flags;  	unsigned int data_buffer_length = 0;  	unsigned long data_buffer_length_adjusted = 0; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	unsigned long *cpu_addr;  	long timeout;  	TW_New_Ioctl *tw_ioctl; diff --git a/drivers/scsi/csiostor/csio_init.c b/drivers/scsi/csiostor/csio_init.c index b42cbbd3d92..c323b2030af 100644 --- a/drivers/scsi/csiostor/csio_init.c +++ b/drivers/scsi/csiostor/csio_init.c @@ -71,7 +71,7 @@ static ssize_t  csio_mem_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)  {  	loff_t pos = *ppos; -	loff_t avail = file->f_path.dentry->d_inode->i_size; +	loff_t avail = file_inode(file)->i_size;  	unsigned int mem = (uintptr_t)file->private_data & 3;  	struct csio_hw *hw = file->private_data - mem; diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index b4f6c9a84e7..b6e2700ec1c 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -2161,7 +2161,7 @@ static long adpt_unlocked_ioctl(struct file *file, uint cmd, ulong arg)  	struct inode *inode;  	long ret; -	inode = file->f_dentry->d_inode; +	inode = file_inode(file);  	mutex_lock(&adpt_mutex);  	ret = adpt_ioctl(inode, file, cmd, arg); @@ -2177,7 +2177,7 @@ static long compat_adpt_ioctl(struct file *file,  	struct inode *inode;  	long ret; -	inode = file->f_dentry->d_inode; +	inode = file_inode(file);  	mutex_lock(&adpt_mutex); diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 98156a97c47..3e2b3717cb5 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -977,7 +977,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)  	struct st_modedef *STm;  	struct st_partstat *STps;  	char *name = tape_name(STp); -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int mode = TAPE_MODE(inode);  	STp->ready = ST_READY; diff --git a/drivers/staging/bcm/Misc.c b/drivers/staging/bcm/Misc.c index b5c2c4c15f9..d23eeeb9506 100644 --- a/drivers/staging/bcm/Misc.c +++ b/drivers/staging/bcm/Misc.c @@ -185,7 +185,7 @@ static int BcmFileDownload(struct bcm_mini_adapter *Adapter, const char *path, u  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Unable to Open %s\n", path);  		return -ENOENT;  	} -	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Opened file is = %s and length =0x%lx to be downloaded at =0x%x", path, (unsigned long)flp->f_dentry->d_inode->i_size, loc); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "Opened file is = %s and length =0x%lx to be downloaded at =0x%x", path, (unsigned long)file_inode(flp)->i_size, loc);  	do_gettimeofday(&tv);  	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, MP_INIT, DBG_LVL_ALL, "download start %lx", ((tv.tv_sec * 1000) + (tv.tv_usec / 1000))); diff --git a/drivers/staging/ccg/f_mass_storage.c b/drivers/staging/ccg/f_mass_storage.c index 4f1142efa6d..20bc2b454ac 100644 --- a/drivers/staging/ccg/f_mass_storage.c +++ b/drivers/staging/ccg/f_mass_storage.c @@ -998,7 +998,7 @@ static int do_synchronize_cache(struct fsg_common *common)  static void invalidate_sub(struct fsg_lun *curlun)  {  	struct file	*filp = curlun->filp; -	struct inode	*inode = filp->f_path.dentry->d_inode; +	struct inode	*inode = file_inode(filp);  	unsigned long	rc;  	rc = invalidate_mapping_pages(inode->i_mapping, 0, -1); diff --git a/drivers/staging/ccg/rndis.c b/drivers/staging/ccg/rndis.c index e4192b887de..d9297eebbf7 100644 --- a/drivers/staging/ccg/rndis.c +++ b/drivers/staging/ccg/rndis.c @@ -1065,7 +1065,7 @@ static int rndis_proc_show(struct seq_file *m, void *v)  static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,  				size_t count, loff_t *ppos)  { -	rndis_params *p = PDE(file->f_path.dentry->d_inode)->data; +	rndis_params *p = PDE(file_inode(file))->data;  	u32 speed = 0;  	int i, fl_speed = 0; diff --git a/drivers/staging/ccg/storage_common.c b/drivers/staging/ccg/storage_common.c index 8d9bcd8207c..abb01ac74ce 100644 --- a/drivers/staging/ccg/storage_common.c +++ b/drivers/staging/ccg/storage_common.c @@ -656,7 +656,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)  	if (!(filp->f_mode & FMODE_WRITE))  		ro = 1; -	inode = filp->f_path.dentry->d_inode; +	inode = file_inode(filp);  	if ((!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) {  		LINFO(curlun, "invalid file type: %s\n", filename);  		goto out; diff --git a/drivers/staging/dgrp/dgrp_specproc.c b/drivers/staging/dgrp/dgrp_specproc.c index 13c7ccf163c..73f287f9660 100644 --- a/drivers/staging/dgrp/dgrp_specproc.c +++ b/drivers/staging/dgrp/dgrp_specproc.c @@ -357,7 +357,7 @@ static int dgrp_gen_proc_open(struct inode *inode, struct file *file)  	struct dgrp_proc_entry *entry;  	int ret = 0; -	de = (struct proc_dir_entry *) PDE(file->f_dentry->d_inode); +	de = (struct proc_dir_entry *) PDE(file_inode(file));  	if (!de || !de->data) {  		ret = -ENXIO;  		goto done; @@ -387,7 +387,7 @@ static int dgrp_gen_proc_close(struct inode *inode, struct file *file)  	struct proc_dir_entry *de;  	struct dgrp_proc_entry *entry; -	de = (struct proc_dir_entry *) PDE(file->f_dentry->d_inode); +	de = (struct proc_dir_entry *) PDE(file_inode(file));  	if (!de || !de->data)  		goto done; diff --git a/drivers/staging/usbip/usbip_common.c b/drivers/staging/usbip/usbip_common.c index 75aa5bfcb8d..539fa5785af 100644 --- a/drivers/staging/usbip/usbip_common.c +++ b/drivers/staging/usbip/usbip_common.c @@ -411,7 +411,7 @@ struct socket *sockfd_to_socket(unsigned int sockfd)  		return NULL;  	} -	inode = file->f_dentry->d_inode; +	inode = file_inode(file);  	if (!inode || !S_ISSOCK(inode->i_mode)) {  		fput(file); diff --git a/drivers/staging/vme/devices/vme_user.c b/drivers/staging/vme/devices/vme_user.c index 57474cff51f..d074b1ecb41 100644 --- a/drivers/staging/vme/devices/vme_user.c +++ b/drivers/staging/vme/devices/vme_user.c @@ -318,7 +318,7 @@ static ssize_t buffer_from_user(unsigned int minor, const char __user *buf,  static ssize_t vme_user_read(struct file *file, char __user *buf, size_t count,  			loff_t *ppos)  { -	unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev); +	unsigned int minor = MINOR(file_inode(file)->i_rdev);  	ssize_t retval;  	size_t image_size;  	size_t okcount; @@ -364,7 +364,7 @@ static ssize_t vme_user_read(struct file *file, char __user *buf, size_t count,  static ssize_t vme_user_write(struct file *file, const char __user *buf,  			size_t count, loff_t *ppos)  { -	unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev); +	unsigned int minor = MINOR(file_inode(file)->i_rdev);  	ssize_t retval;  	size_t image_size;  	size_t okcount; @@ -410,7 +410,7 @@ static ssize_t vme_user_write(struct file *file, const char __user *buf,  static loff_t vme_user_llseek(struct file *file, loff_t off, int whence)  {  	loff_t absolute = -1; -	unsigned int minor = MINOR(file->f_dentry->d_inode->i_rdev); +	unsigned int minor = MINOR(file_inode(file)->i_rdev);  	size_t image_size;  	if (minor == CONTROL_MINOR) @@ -583,7 +583,7 @@ vme_user_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	int ret;  	mutex_lock(&vme_user_mutex); -	ret = vme_user_ioctl(file->f_path.dentry->d_inode, file, cmd, arg); +	ret = vme_user_ioctl(file_inode(file), file, cmd, arg);  	mutex_unlock(&vme_user_mutex);  	return ret; diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index 7d4ec02e29a..ff1c5ee352c 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c @@ -27,6 +27,7 @@  #include <linux/spinlock.h>  #include <linux/configfs.h>  #include <linux/export.h> +#include <linux/file.h>  #include <scsi/scsi.h>  #include <scsi/scsi_cmnd.h>  #include <asm/unaligned.h> @@ -715,36 +716,18 @@ static int core_alua_write_tpg_metadata(  	unsigned char *md_buf,  	u32 md_buf_len)  { -	mm_segment_t old_fs; -	struct file *file; -	struct iovec iov[1]; -	int flags = O_RDWR | O_CREAT | O_TRUNC, ret; - -	memset(iov, 0, sizeof(struct iovec)); +	struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600); +	int ret; -	file = filp_open(path, flags, 0600); -	if (IS_ERR(file) || !file || !file->f_dentry) { -		pr_err("filp_open(%s) for ALUA metadata failed\n", -			path); +	if (IS_ERR(file)) { +		pr_err("filp_open(%s) for ALUA metadata failed\n", path);  		return -ENODEV;  	} - -	iov[0].iov_base = &md_buf[0]; -	iov[0].iov_len = md_buf_len; - -	old_fs = get_fs(); -	set_fs(get_ds()); -	ret = vfs_writev(file, &iov[0], 1, &file->f_pos); -	set_fs(old_fs); - -	if (ret < 0) { +	ret = kernel_write(file, md_buf, md_buf_len, 0); +	if (ret < 0)  		pr_err("Error writing ALUA metadata file: %s\n", path); -		filp_close(file, NULL); -		return -EIO; -	} -	filp_close(file, NULL); - -	return 0; +	fput(file); +	return ret ? -EIO : 0;  }  /* diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index ca36a38eb27..d226c10a985 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -270,7 +270,7 @@ static int fd_do_rw(struct se_cmd *cmd, struct scatterlist *sgl,  		 * the expected virt_size for struct file w/o a backing struct  		 * block_device.  		 */ -		if (S_ISBLK(fd->f_dentry->d_inode->i_mode)) { +		if (S_ISBLK(file_inode(fd)->i_mode)) {  			if (ret < 0 || ret != cmd->data_length) {  				pr_err("%s() returned %d, expecting %u for "  						"S_ISBLK\n", __func__, ret, diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 8e0290b38e4..3240f2cc81e 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -27,6 +27,7 @@  #include <linux/slab.h>  #include <linux/spinlock.h>  #include <linux/list.h> +#include <linux/file.h>  #include <scsi/scsi.h>  #include <scsi/scsi_cmnd.h>  #include <asm/unaligned.h> @@ -1957,13 +1958,10 @@ static int __core_scsi3_write_aptpl_to_file(  {  	struct t10_wwn *wwn = &dev->t10_wwn;  	struct file *file; -	struct iovec iov[1]; -	mm_segment_t old_fs;  	int flags = O_RDWR | O_CREAT | O_TRUNC;  	char path[512];  	int ret; -	memset(iov, 0, sizeof(struct iovec));  	memset(path, 0, 512);  	if (strlen(&wwn->unit_serial[0]) >= 512) { @@ -1974,31 +1972,22 @@ static int __core_scsi3_write_aptpl_to_file(  	snprintf(path, 512, "/var/target/pr/aptpl_%s", &wwn->unit_serial[0]);  	file = filp_open(path, flags, 0600); -	if (IS_ERR(file) || !file || !file->f_dentry) { +	if (IS_ERR(file)) {  		pr_err("filp_open(%s) for APTPL metadata"  			" failed\n", path); -		return IS_ERR(file) ? PTR_ERR(file) : -ENOENT; +		return PTR_ERR(file);  	} -	iov[0].iov_base = &buf[0];  	if (!pr_aptpl_buf_len) -		iov[0].iov_len = (strlen(&buf[0]) + 1); /* Add extra for NULL */ -	else -		iov[0].iov_len = pr_aptpl_buf_len; +		pr_aptpl_buf_len = (strlen(&buf[0]) + 1); /* Add extra for NULL */ -	old_fs = get_fs(); -	set_fs(get_ds()); -	ret = vfs_writev(file, &iov[0], 1, &file->f_pos); -	set_fs(old_fs); +	ret = kernel_write(file, buf, pr_aptpl_buf_len, 0); -	if (ret < 0) { +	if (ret < 0)  		pr_debug("Error writing APTPL metadata file: %s\n", path); -		filp_close(file, NULL); -		return -EIO; -	} -	filp_close(file, NULL); +	fput(file); -	return 0; +	return ret ? -EIO : 0;  }  static int diff --git a/drivers/tty/vt/vc_screen.c b/drivers/tty/vt/vc_screen.c index fa7268a93c0..e4ca345873c 100644 --- a/drivers/tty/vt/vc_screen.c +++ b/drivers/tty/vt/vc_screen.c @@ -101,7 +101,7 @@ vcs_poll_data_get(struct file *file)  	poll = kzalloc(sizeof(*poll), GFP_KERNEL);  	if (!poll)  		return NULL; -	poll->cons_num = iminor(file->f_path.dentry->d_inode) & 127; +	poll->cons_num = iminor(file_inode(file)) & 127;  	init_waitqueue_head(&poll->waitq);  	poll->notifier.notifier_call = vcs_notifier;  	if (register_vt_notifier(&poll->notifier) != 0) { @@ -182,7 +182,7 @@ static loff_t vcs_lseek(struct file *file, loff_t offset, int orig)  	int size;  	console_lock(); -	size = vcs_size(file->f_path.dentry->d_inode); +	size = vcs_size(file_inode(file));  	console_unlock();  	if (size < 0)  		return size; @@ -208,7 +208,7 @@ static loff_t vcs_lseek(struct file *file, loff_t offset, int orig)  static ssize_t  vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	unsigned int currcons = iminor(inode);  	struct vc_data *vc;  	struct vcs_poll_data *poll; @@ -386,7 +386,7 @@ unlock_out:  static ssize_t  vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	unsigned int currcons = iminor(inode);  	struct vc_data *vc;  	long pos; diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index e33224e2377..2a3bbdf7eb9 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c @@ -665,7 +665,7 @@ static loff_t usb_device_lseek(struct file *file, loff_t offset, int orig)  {  	loff_t ret; -	mutex_lock(&file->f_dentry->d_inode->i_mutex); +	mutex_lock(&file_inode(file)->i_mutex);  	switch (orig) {  	case 0: @@ -681,7 +681,7 @@ static loff_t usb_device_lseek(struct file *file, loff_t offset, int orig)  		ret = -EINVAL;  	} -	mutex_unlock(&file->f_dentry->d_inode->i_mutex); +	mutex_unlock(&file_inode(file)->i_mutex);  	return ret;  } diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 4a863fdbdcc..8823e98989f 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -161,7 +161,7 @@ static loff_t usbdev_lseek(struct file *file, loff_t offset, int orig)  {  	loff_t ret; -	mutex_lock(&file->f_dentry->d_inode->i_mutex); +	mutex_lock(&file_inode(file)->i_mutex);  	switch (orig) {  	case 0: @@ -177,7 +177,7 @@ static loff_t usbdev_lseek(struct file *file, loff_t offset, int orig)  		ret = -EINVAL;  	} -	mutex_unlock(&file->f_dentry->d_inode->i_mutex); +	mutex_unlock(&file_inode(file)->i_mutex);  	return ret;  } @@ -1971,7 +1971,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,  				void __user *p)  {  	struct dev_state *ps = file->private_data; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct usb_device *dev = ps->dev;  	int ret = -ENOTTY; diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index bc19496bcec..b66130c9726 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c @@ -93,7 +93,7 @@ static ssize_t queue_dbg_read(struct file *file, char __user *buf,  	if (!access_ok(VERIFY_WRITE, buf, nbytes))  		return -EFAULT; -	mutex_lock(&file->f_dentry->d_inode->i_mutex); +	mutex_lock(&file_inode(file)->i_mutex);  	list_for_each_entry_safe(req, tmp_req, queue, queue) {  		len = snprintf(tmpbuf, sizeof(tmpbuf),  				"%8p %08x %c%c%c %5d %c%c%c\n", @@ -120,7 +120,7 @@ static ssize_t queue_dbg_read(struct file *file, char __user *buf,  		nbytes -= len;  		buf += len;  	} -	mutex_unlock(&file->f_dentry->d_inode->i_mutex); +	mutex_unlock(&file_inode(file)->i_mutex);  	return actual;  } @@ -168,13 +168,13 @@ out:  static ssize_t regs_dbg_read(struct file *file, char __user *buf,  		size_t nbytes, loff_t *ppos)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	int ret;  	mutex_lock(&inode->i_mutex);  	ret = simple_read_from_buffer(buf, nbytes, ppos,  			file->private_data, -			file->f_dentry->d_inode->i_size); +			file_inode(file)->i_size);  	mutex_unlock(&inode->i_mutex);  	return ret; diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index fc5c16ca5e0..97666e8b1b9 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -978,7 +978,7 @@ static int do_synchronize_cache(struct fsg_common *common)  static void invalidate_sub(struct fsg_lun *curlun)  {  	struct file	*filp = curlun->filp; -	struct inode	*inode = filp->f_path.dentry->d_inode; +	struct inode	*inode = file_inode(filp);  	unsigned long	rc;  	rc = invalidate_mapping_pages(inode->i_mapping, 0, -1); diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 35bcc83d1e0..bf7a56b6d48 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c @@ -688,7 +688,7 @@ static int  printer_fsync(struct file *fd, loff_t start, loff_t end, int datasync)  {  	struct printer_dev	*dev = fd->private_data; -	struct inode *inode = fd->f_path.dentry->d_inode; +	struct inode *inode = file_inode(fd);  	unsigned long		flags;  	int			tx_list_empty; diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index e4192b887de..d9297eebbf7 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c @@ -1065,7 +1065,7 @@ static int rndis_proc_show(struct seq_file *m, void *v)  static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,  				size_t count, loff_t *ppos)  { -	rndis_params *p = PDE(file->f_path.dentry->d_inode)->data; +	rndis_params *p = PDE(file_inode(file))->data;  	u32 speed = 0;  	int i, fl_speed = 0; diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 4ecbf8496f4..dbce3a9074e 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c @@ -440,7 +440,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)  	if (!(filp->f_mode & FMODE_WRITE))  		ro = 1; -	inode = filp->f_path.dentry->d_inode; +	inode = file_inode(filp);  	if ((!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) {  		LINFO(curlun, "invalid file type: %s\n", filename);  		goto out; diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c index 88cad6b8b47..900aa4ecd61 100644 --- a/drivers/video/fb_defio.c +++ b/drivers/video/fb_defio.c @@ -69,7 +69,7 @@ static int fb_deferred_io_fault(struct vm_area_struct *vma,  int fb_deferred_io_fsync(struct file *file, loff_t start, loff_t end, int datasync)  {  	struct fb_info *info = file->private_data; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int err = filemap_write_and_wait_range(inode->i_mapping, start, end);  	if (err)  		return err; diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index dc61c12ecf8..7c254084b6a 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c @@ -727,7 +727,7 @@ static const struct file_operations fb_proc_fops = {   */  static struct fb_info *file_fb_info(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int fbidx = iminor(inode);  	struct fb_info *info = registered_fb[fbidx]; diff --git a/drivers/video/msm/mdp.c b/drivers/video/msm/mdp.c index f2566c19e71..113c7876c85 100644 --- a/drivers/video/msm/mdp.c +++ b/drivers/video/msm/mdp.c @@ -261,7 +261,7 @@ int get_img(struct mdp_img *img, struct fb_info *info,  	if (f.file == NULL)  		return -1; -	if (MAJOR(f.file->f_dentry->d_inode->i_rdev) == FB_MAJOR) { +	if (MAJOR(file_inode(f.file)->i_rdev) == FB_MAJOR) {  		*start = info->fix.smem_start;  		*len = info->fix.smem_len;  	} else diff --git a/drivers/watchdog/cpwd.c b/drivers/watchdog/cpwd.c index 11d55ce5ca8..70387582843 100644 --- a/drivers/watchdog/cpwd.c +++ b/drivers/watchdog/cpwd.c @@ -411,7 +411,7 @@ static long cpwd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  		.identity		= DRIVER_NAME,  	};  	void __user *argp = (void __user *)arg; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int index = iminor(inode) - WD0_MINOR;  	struct cpwd *p = cpwd_device;  	int setopt = 0; @@ -499,7 +499,7 @@ static long cpwd_compat_ioctl(struct file *file, unsigned int cmd,  static ssize_t cpwd_write(struct file *file, const char __user *buf,  			  size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct cpwd *p = cpwd_device;  	int index = iminor(inode); diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c index 459b9ac45cf..ec0abb6df3c 100644 --- a/drivers/xen/xenfs/super.c +++ b/drivers/xen/xenfs/super.c @@ -24,47 +24,6 @@  MODULE_DESCRIPTION("Xen filesystem");  MODULE_LICENSE("GPL"); -static struct inode *xenfs_make_inode(struct super_block *sb, int mode) -{ -	struct inode *ret = new_inode(sb); - -	if (ret) { -		ret->i_mode = mode; -		ret->i_uid = GLOBAL_ROOT_UID; -		ret->i_gid = GLOBAL_ROOT_GID; -		ret->i_blocks = 0; -		ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; -	} -	return ret; -} - -static struct dentry *xenfs_create_file(struct super_block *sb, -					struct dentry *parent, -					const char *name, -					const struct file_operations *fops, -					void *data, -					int mode) -{ -	struct dentry *dentry; -	struct inode *inode; - -	dentry = d_alloc_name(parent, name); -	if (!dentry) -		return NULL; - -	inode = xenfs_make_inode(sb, S_IFREG | mode); -	if (!inode) { -		dput(dentry); -		return NULL; -	} - -	inode->i_fop = fops; -	inode->i_private = data; - -	d_add(dentry, inode); -	return dentry; -} -  static ssize_t capabilities_read(struct file *file, char __user *buf,  				 size_t size, loff_t *off)  { @@ -84,26 +43,23 @@ static const struct file_operations capabilities_file_ops = {  static int xenfs_fill_super(struct super_block *sb, void *data, int silent)  {  	static struct tree_descr xenfs_files[] = { -		[1] = {}, -		{ "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR }, +		[2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },  		{ "capabilities", &capabilities_file_ops, S_IRUGO },  		{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },  		{""},  	}; -	int rc; - -	rc = simple_fill_super(sb, XENFS_SUPER_MAGIC, xenfs_files); -	if (rc < 0) -		return rc; -	if (xen_initial_domain()) { -		xenfs_create_file(sb, sb->s_root, "xsd_kva", -				  &xsd_kva_file_ops, NULL, S_IRUSR|S_IWUSR); -		xenfs_create_file(sb, sb->s_root, "xsd_port", -				  &xsd_port_file_ops, NULL, S_IRUSR|S_IWUSR); -	} +	static struct tree_descr xenfs_init_files[] = { +		[2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR }, +		{ "capabilities", &capabilities_file_ops, S_IRUGO }, +		{ "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR }, +		{ "xsd_kva", &xsd_kva_file_ops, S_IRUSR|S_IWUSR}, +		{ "xsd_port", &xsd_port_file_ops, S_IRUSR|S_IWUSR}, +		{""}, +	}; -	return rc; +	return simple_fill_super(sb, XENFS_SUPER_MAGIC, +			xen_initial_domain() ? xenfs_init_files : xenfs_files);  }  static struct dentry *xenfs_mount(struct file_system_type *fs_type, diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c index 988880dcee7..73b33837e12 100644 --- a/drivers/zorro/proc.c +++ b/drivers/zorro/proc.c @@ -22,7 +22,7 @@ static loff_t  proc_bus_zorro_lseek(struct file *file, loff_t off, int whence)  {  	loff_t new = -1; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	mutex_lock(&inode->i_mutex);  	switch (whence) { @@ -47,7 +47,7 @@ proc_bus_zorro_lseek(struct file *file, loff_t off, int whence)  static ssize_t  proc_bus_zorro_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)  { -	struct inode *ino = file->f_path.dentry->d_inode; +	struct inode *ino = file_inode(file);  	struct proc_dir_entry *dp = PDE(ino);  	struct zorro_dev *z = dp->data;  	struct ConfigDev cd; diff --git a/fs/9p/acl.c b/fs/9p/acl.c index 15b67916620..7af425f53be 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c @@ -23,6 +23,7 @@  #include "acl.h"  #include "v9fs.h"  #include "v9fs_vfs.h" +#include "fid.h"  static struct posix_acl *__v9fs_get_acl(struct p9_fid *fid, char *name)  { @@ -113,16 +114,12 @@ struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type)  } -static int v9fs_set_acl(struct dentry *dentry, int type, struct posix_acl *acl) +static int v9fs_set_acl(struct p9_fid *fid, int type, struct posix_acl *acl)  {  	int retval;  	char *name;  	size_t size;  	void *buffer; -	struct inode *inode = dentry->d_inode; - -	set_cached_acl(inode, type, acl); -  	if (!acl)  		return 0; @@ -144,17 +141,16 @@ static int v9fs_set_acl(struct dentry *dentry, int type, struct posix_acl *acl)  	default:  		BUG();  	} -	retval = v9fs_xattr_set(dentry, name, buffer, size, 0); +	retval = v9fs_fid_xattr_set(fid, name, buffer, size, 0);  err_free_out:  	kfree(buffer);  	return retval;  } -int v9fs_acl_chmod(struct dentry *dentry) +int v9fs_acl_chmod(struct inode *inode, struct p9_fid *fid)  {  	int retval = 0;  	struct posix_acl *acl; -	struct inode *inode = dentry->d_inode;  	if (S_ISLNK(inode->i_mode))  		return -EOPNOTSUPP; @@ -163,25 +159,30 @@ int v9fs_acl_chmod(struct dentry *dentry)  		retval = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode);  		if (retval)  			return retval; -		retval = v9fs_set_acl(dentry, ACL_TYPE_ACCESS, acl); +		set_cached_acl(inode, ACL_TYPE_ACCESS, acl); +		retval = v9fs_set_acl(fid, ACL_TYPE_ACCESS, acl);  		posix_acl_release(acl);  	}  	return retval;  } -int v9fs_set_create_acl(struct dentry *dentry, -			struct posix_acl **dpacl, struct posix_acl **pacl) +int v9fs_set_create_acl(struct inode *inode, struct p9_fid *fid, +			struct posix_acl *dacl, struct posix_acl *acl)  { -	if (dentry) { -		v9fs_set_acl(dentry, ACL_TYPE_DEFAULT, *dpacl); -		v9fs_set_acl(dentry, ACL_TYPE_ACCESS, *pacl); -	} -	posix_acl_release(*dpacl); -	posix_acl_release(*pacl); -	*dpacl = *pacl = NULL; +	set_cached_acl(inode, ACL_TYPE_DEFAULT, dacl); +	set_cached_acl(inode, ACL_TYPE_ACCESS, acl); +	v9fs_set_acl(fid, ACL_TYPE_DEFAULT, dacl); +	v9fs_set_acl(fid, ACL_TYPE_ACCESS, acl);  	return 0;  } +void v9fs_put_acl(struct posix_acl *dacl, +		  struct posix_acl *acl) +{ +	posix_acl_release(dacl); +	posix_acl_release(acl); +} +  int v9fs_acl_mode(struct inode *dir, umode_t *modep,  		  struct posix_acl **dpacl, struct posix_acl **pacl)  { diff --git a/fs/9p/acl.h b/fs/9p/acl.h index 55955641196..e4f7e882272 100644 --- a/fs/9p/acl.h +++ b/fs/9p/acl.h @@ -17,27 +17,33 @@  #ifdef CONFIG_9P_FS_POSIX_ACL  extern int v9fs_get_acl(struct inode *, struct p9_fid *);  extern struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type); -extern int v9fs_acl_chmod(struct dentry *); -extern int v9fs_set_create_acl(struct dentry *, -			       struct posix_acl **, struct posix_acl **); +extern int v9fs_acl_chmod(struct inode *, struct p9_fid *); +extern int v9fs_set_create_acl(struct inode *, struct p9_fid *, +			       struct posix_acl *, struct posix_acl *);  extern int v9fs_acl_mode(struct inode *dir, umode_t *modep,  			 struct posix_acl **dpacl, struct posix_acl **pacl); +extern void v9fs_put_acl(struct posix_acl *dacl, struct posix_acl *acl);  #else  #define v9fs_iop_get_acl NULL  static inline int v9fs_get_acl(struct inode *inode, struct p9_fid *fid)  {  	return 0;  } -static inline int v9fs_acl_chmod(struct dentry *dentry) +static inline int v9fs_acl_chmod(struct inode *inode, struct p9_fid *fid)  {  	return 0;  } -static inline int v9fs_set_create_acl(struct dentry *dentry, -				      struct posix_acl **dpacl, -				      struct posix_acl **pacl) +static inline int v9fs_set_create_acl(struct inode *inode, +				      struct p9_fid *fid, +				      struct posix_acl *dacl, +				      struct posix_acl *acl)  {  	return 0;  } +static inline void v9fs_put_acl(struct posix_acl *dacl, +				struct posix_acl *acl) +{ +}  static inline int v9fs_acl_mode(struct inode *dir, umode_t *modep,  				struct posix_acl **dpacl,  				struct posix_acl **pacl) diff --git a/fs/9p/vfs_dentry.c b/fs/9p/vfs_dentry.c index 64600b5d052..9ad68628522 100644 --- a/fs/9p/vfs_dentry.c +++ b/fs/9p/vfs_dentry.c @@ -137,6 +137,7 @@ out_valid:  const struct dentry_operations v9fs_cached_dentry_operations = {  	.d_revalidate = v9fs_lookup_revalidate, +	.d_weak_revalidate = v9fs_lookup_revalidate,  	.d_delete = v9fs_cached_dentry_delete,  	.d_release = v9fs_dentry_release,  }; diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index c921ac92ea4..d384a8b77ee 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -129,7 +129,7 @@ out_error:  static int v9fs_file_lock(struct file *filp, int cmd, struct file_lock *fl)  {  	int res = 0; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	p9_debug(P9_DEBUG_VFS, "filp: %p lock: %p\n", filp, fl); @@ -298,7 +298,7 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl)  static int v9fs_file_lock_dotl(struct file *filp, int cmd, struct file_lock *fl)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int ret = -ENOLCK;  	p9_debug(P9_DEBUG_VFS, "filp: %p cmd:%d lock: %p name: %s\n", @@ -334,7 +334,7 @@ out_err:  static int v9fs_file_flock_dotl(struct file *filp, int cmd,  	struct file_lock *fl)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int ret = -ENOLCK;  	p9_debug(P9_DEBUG_VFS, "filp: %p cmd:%d lock: %p name: %s\n", @@ -525,7 +525,7 @@ v9fs_file_write(struct file *filp, const char __user * data,  	if (!count)  		goto out; -	retval = v9fs_file_write_internal(filp->f_path.dentry->d_inode, +	retval = v9fs_file_write_internal(file_inode(filp),  					filp->private_data,  					data, count, &origin, 1);  	/* update offset on successful write */ @@ -600,7 +600,7 @@ v9fs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  	struct v9fs_inode *v9inode;  	struct page *page = vmf->page;  	struct file *filp = vma->vm_file; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	p9_debug(P9_DEBUG_VFS, "page %p fid %lx\n", diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 07f409288d1..61e4fa70a6f 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -330,14 +330,14 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry,  		p9_debug(P9_DEBUG_VFS, "inode creation failed %d\n", err);  		goto error;  	} +	/* Now set the ACL based on the default value */ +	v9fs_set_create_acl(inode, fid, dacl, pacl); +  	err = v9fs_fid_add(dentry, fid);  	if (err < 0)  		goto error;  	d_instantiate(dentry, inode); -	/* Now set the ACL based on the default value */ -	v9fs_set_create_acl(dentry, &dacl, &pacl); -  	v9inode = V9FS_I(inode);  	mutex_lock(&v9inode->v_mutex);  	if (v9ses->cache && !v9inode->writeback_fid && @@ -369,6 +369,7 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry,  #endif  	*opened |= FILE_CREATED;  out: +	v9fs_put_acl(dacl, pacl);  	dput(res);  	return err; @@ -378,7 +379,6 @@ error:  err_clunk_old_fid:  	if (ofid)  		p9_client_clunk(ofid); -	v9fs_set_create_acl(NULL, &dacl, &pacl);  	goto out;  } @@ -435,17 +435,17 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,  	if (err < 0)  		goto error; +	fid = p9_client_walk(dfid, 1, &name, 1); +	if (IS_ERR(fid)) { +		err = PTR_ERR(fid); +		p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", +			 err); +		fid = NULL; +		goto error; +	} +  	/* instantiate inode and assign the unopened fid to the dentry */  	if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { -		fid = p9_client_walk(dfid, 1, &name, 1); -		if (IS_ERR(fid)) { -			err = PTR_ERR(fid); -			p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", -				 err); -			fid = NULL; -			goto error; -		} -  		inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);  		if (IS_ERR(inode)) {  			err = PTR_ERR(inode); @@ -456,6 +456,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,  		err = v9fs_fid_add(dentry, fid);  		if (err < 0)  			goto error; +		v9fs_set_create_acl(inode, fid, dacl, pacl);  		d_instantiate(dentry, inode);  		fid = NULL;  	} else { @@ -469,16 +470,15 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,  			err = PTR_ERR(inode);  			goto error;  		} +		v9fs_set_create_acl(inode, fid, dacl, pacl);  		d_instantiate(dentry, inode);  	} -	/* Now set the ACL based on the default value */ -	v9fs_set_create_acl(dentry, &dacl, &pacl);  	inc_nlink(dir);  	v9fs_invalidate_inode_attr(dir);  error:  	if (fid)  		p9_client_clunk(fid); -	v9fs_set_create_acl(NULL, &dacl, &pacl); +	v9fs_put_acl(dacl, pacl);  	return err;  } @@ -572,10 +572,11 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)  	struct v9fs_session_info *v9ses;  	struct p9_fid *fid;  	struct p9_iattr_dotl p9attr; +	struct inode *inode = dentry->d_inode;  	p9_debug(P9_DEBUG_VFS, "\n"); -	retval = inode_change_ok(dentry->d_inode, iattr); +	retval = inode_change_ok(inode, iattr);  	if (retval)  		return retval; @@ -596,23 +597,23 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr)  		return PTR_ERR(fid);  	/* Write all dirty data */ -	if (S_ISREG(dentry->d_inode->i_mode)) -		filemap_write_and_wait(dentry->d_inode->i_mapping); +	if (S_ISREG(inode->i_mode)) +		filemap_write_and_wait(inode->i_mapping);  	retval = p9_client_setattr(fid, &p9attr);  	if (retval < 0)  		return retval;  	if ((iattr->ia_valid & ATTR_SIZE) && -	    iattr->ia_size != i_size_read(dentry->d_inode)) -		truncate_setsize(dentry->d_inode, iattr->ia_size); +	    iattr->ia_size != i_size_read(inode)) +		truncate_setsize(inode, iattr->ia_size); -	v9fs_invalidate_inode_attr(dentry->d_inode); -	setattr_copy(dentry->d_inode, iattr); -	mark_inode_dirty(dentry->d_inode); +	v9fs_invalidate_inode_attr(inode); +	setattr_copy(inode, iattr); +	mark_inode_dirty(inode);  	if (iattr->ia_valid & ATTR_MODE) {  		/* We also want to update ACL when we update mode bits */ -		retval = v9fs_acl_chmod(dentry); +		retval = v9fs_acl_chmod(inode, fid);  		if (retval < 0)  			return retval;  	} @@ -880,17 +881,17 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,  		goto error;  	v9fs_invalidate_inode_attr(dir); +	fid = p9_client_walk(dfid, 1, &name, 1); +	if (IS_ERR(fid)) { +		err = PTR_ERR(fid); +		p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", +			 err); +		fid = NULL; +		goto error; +	} +  	/* instantiate inode and assign the unopened fid to the dentry */  	if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) { -		fid = p9_client_walk(dfid, 1, &name, 1); -		if (IS_ERR(fid)) { -			err = PTR_ERR(fid); -			p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", -				 err); -			fid = NULL; -			goto error; -		} -  		inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);  		if (IS_ERR(inode)) {  			err = PTR_ERR(inode); @@ -898,6 +899,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,  				 err);  			goto error;  		} +		v9fs_set_create_acl(inode, fid, dacl, pacl);  		err = v9fs_fid_add(dentry, fid);  		if (err < 0)  			goto error; @@ -913,14 +915,13 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, umode_t omode,  			err = PTR_ERR(inode);  			goto error;  		} +		v9fs_set_create_acl(inode, fid, dacl, pacl);  		d_instantiate(dentry, inode);  	} -	/* Now set the ACL based on the default value */ -	v9fs_set_create_acl(dentry, &dacl, &pacl);  error:  	if (fid)  		p9_client_clunk(fid); -	v9fs_set_create_acl(NULL, &dacl, &pacl); +	v9fs_put_acl(dacl, pacl);  	return err;  } diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 137d5039689..91dad63e5a2 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -363,5 +363,5 @@ struct file_system_type v9fs_fs_type = {  	.mount = v9fs_mount,  	.kill_sb = v9fs_kill_super,  	.owner = THIS_MODULE, -	.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT, +	.fs_flags = FS_RENAME_DOES_D_MOVE,  }; diff --git a/fs/9p/xattr.c b/fs/9p/xattr.c index 29653b70a9c..c45e016b190 100644 --- a/fs/9p/xattr.c +++ b/fs/9p/xattr.c @@ -111,19 +111,26 @@ ssize_t v9fs_xattr_get(struct dentry *dentry, const char *name,  int v9fs_xattr_set(struct dentry *dentry, const char *name,  		   const void *value, size_t value_len, int flags)  { +	struct p9_fid *fid = v9fs_fid_lookup(dentry); +	if (IS_ERR(fid)) +		return PTR_ERR(fid); +	return v9fs_fid_xattr_set(fid, name, value, value_len, flags); +} + +int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name, +		   const void *value, size_t value_len, int flags) +{  	u64 offset = 0;  	int retval, msize, write_count; -	struct p9_fid *fid = NULL;  	p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n",  		 name, value_len, flags); -	fid = v9fs_fid_clone(dentry); -	if (IS_ERR(fid)) { -		retval = PTR_ERR(fid); -		fid = NULL; -		goto error; -	} +	/* Clone it */ +	fid = p9_client_walk(fid, 0, NULL, 1); +	if (IS_ERR(fid)) +		return PTR_ERR(fid); +  	/*  	 * On success fid points to xattr  	 */ @@ -131,7 +138,8 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,  	if (retval < 0) {  		p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n",  			 retval); -		goto error; +		p9_client_clunk(fid); +		return retval;  	}  	msize = fid->clnt->msize;  	while (value_len) { @@ -144,17 +152,12 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,  		if (write_count < 0) {  			/* error in xattr write */  			retval = write_count; -			goto error; +			break;  		}  		offset += write_count;  		value_len -= write_count;  	} -	/* Total read xattr bytes */ -	retval = offset; -error: -	if (fid) -		retval = p9_client_clunk(fid); -	return retval; +	return p9_client_clunk(fid);  }  ssize_t v9fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) diff --git a/fs/9p/xattr.h b/fs/9p/xattr.h index eaa837c53bd..eec348a3df7 100644 --- a/fs/9p/xattr.h +++ b/fs/9p/xattr.h @@ -27,6 +27,8 @@ extern ssize_t v9fs_fid_xattr_get(struct p9_fid *, const char *,  				  void *, size_t);  extern ssize_t v9fs_xattr_get(struct dentry *, const char *,  			      void *, size_t); +extern int v9fs_fid_xattr_set(struct p9_fid *, const char *, +			  const void *, size_t, int);  extern int v9fs_xattr_set(struct dentry *, const char *,  			  const void *, size_t, int);  extern ssize_t v9fs_listxattr(struct dentry *, char *, size_t); diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index b3be2e7c564..9cf874ce833 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c @@ -19,7 +19,7 @@ static DEFINE_RWLOCK(adfs_dir_lock);  static int  adfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir;  	struct object_info obj; diff --git a/fs/affs/dir.c b/fs/affs/dir.c index 8ca8f3a5559..fd11a6d608e 100644 --- a/fs/affs/dir.c +++ b/fs/affs/dir.c @@ -42,7 +42,7 @@ const struct inode_operations affs_dir_inode_operations = {  static int  affs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode		*inode = filp->f_path.dentry->d_inode; +	struct inode		*inode = file_inode(filp);  	struct super_block	*sb = inode->i_sb;  	struct buffer_head	*dir_bh;  	struct buffer_head	*fh_bh; diff --git a/fs/afs/dir.c b/fs/afs/dir.c index db477906ba4..7a465ed0444 100644 --- a/fs/afs/dir.c +++ b/fs/afs/dir.c @@ -393,12 +393,12 @@ static int afs_readdir(struct file *file, void *cookie, filldir_t filldir)  	int ret;  	_enter("{%Ld,{%lu}}", -	       file->f_pos, file->f_path.dentry->d_inode->i_ino); +	       file->f_pos, file_inode(file)->i_ino);  	ASSERT(file->private_data != NULL);  	fpos = file->f_pos; -	ret = afs_dir_iterate(file->f_path.dentry->d_inode, &fpos, +	ret = afs_dir_iterate(file_inode(file), &fpos,  			      cookie, filldir, file->private_data);  	file->f_pos = fpos; diff --git a/fs/afs/flock.c b/fs/afs/flock.c index 757d664575d..2497bf306c7 100644 --- a/fs/afs/flock.c +++ b/fs/afs/flock.c @@ -514,7 +514,7 @@ error:   */  int afs_lock(struct file *file, int cmd, struct file_lock *fl)  { -	struct afs_vnode *vnode = AFS_FS_I(file->f_dentry->d_inode); +	struct afs_vnode *vnode = AFS_FS_I(file_inode(file));  	_enter("{%x:%u},%d,{t=%x,fl=%x,r=%Ld:%Ld}",  	       vnode->fid.vid, vnode->fid.vnode, cmd, @@ -537,7 +537,7 @@ int afs_lock(struct file *file, int cmd, struct file_lock *fl)   */  int afs_flock(struct file *file, int cmd, struct file_lock *fl)  { -	struct afs_vnode *vnode = AFS_FS_I(file->f_dentry->d_inode); +	struct afs_vnode *vnode = AFS_FS_I(file_inode(file));  	_enter("{%x:%u},%d,{t=%x,fl=%x}",  	       vnode->fid.vid, vnode->fid.vnode, cmd, diff --git a/fs/afs/write.c b/fs/afs/write.c index 9aa52d93c73..7e03eadb40c 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -120,7 +120,7 @@ int afs_write_begin(struct file *file, struct address_space *mapping,  		    struct page **pagep, void **fsdata)  {  	struct afs_writeback *candidate, *wb; -	struct afs_vnode *vnode = AFS_FS_I(file->f_dentry->d_inode); +	struct afs_vnode *vnode = AFS_FS_I(file_inode(file));  	struct page *page;  	struct key *key = file->private_data;  	unsigned from = pos & (PAGE_CACHE_SIZE - 1); @@ -245,7 +245,7 @@ int afs_write_end(struct file *file, struct address_space *mapping,  		  loff_t pos, unsigned len, unsigned copied,  		  struct page *page, void *fsdata)  { -	struct afs_vnode *vnode = AFS_FS_I(file->f_dentry->d_inode); +	struct afs_vnode *vnode = AFS_FS_I(file_inode(file));  	loff_t i_size, maybe_i_size;  	_enter("{%x:%u},{%lx}", @@ -627,8 +627,7 @@ void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)  ssize_t afs_file_write(struct kiocb *iocb, const struct iovec *iov,  		       unsigned long nr_segs, loff_t pos)  { -	struct dentry *dentry = iocb->ki_filp->f_path.dentry; -	struct afs_vnode *vnode = AFS_FS_I(dentry->d_inode); +	struct afs_vnode *vnode = AFS_FS_I(file_inode(iocb->ki_filp));  	ssize_t result;  	size_t count = iov_length(iov, nr_segs); diff --git a/fs/anon_inodes.c b/fs/anon_inodes.c index 28d39fb84ae..47a65df8c87 100644 --- a/fs/anon_inodes.c +++ b/fs/anon_inodes.c @@ -131,7 +131,6 @@ struct file *anon_inode_getfile(const char *name,  	struct qstr this;  	struct path path;  	struct file *file; -	int error;  	if (IS_ERR(anon_inode_inode))  		return ERR_PTR(-ENODEV); @@ -143,7 +142,7 @@ struct file *anon_inode_getfile(const char *name,  	 * Link the inode to a directory entry by creating a unique name  	 * using the inode sequence number.  	 */ -	error = -ENOMEM; +	file = ERR_PTR(-ENOMEM);  	this.name = name;  	this.len = strlen(name);  	this.hash = 0; @@ -160,15 +159,12 @@ struct file *anon_inode_getfile(const char *name,  	d_instantiate(path.dentry, anon_inode_inode); -	error = -ENFILE;  	file = alloc_file(&path, OPEN_FMODE(flags), fops); -	if (!file) +	if (IS_ERR(file))  		goto err_dput;  	file->f_mapping = anon_inode_inode->i_mapping; -	file->f_pos = 0;  	file->f_flags = flags & (O_ACCMODE | O_NONBLOCK); -	file->f_version = 0;  	file->private_data = priv;  	return file; @@ -177,7 +173,7 @@ err_dput:  	path_put(&path);  err_module:  	module_put(fops->owner); -	return ERR_PTR(error); +	return file;  }  EXPORT_SYMBOL_GPL(anon_inode_getfile); diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index b785e770795..3f1128b37e4 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h @@ -273,7 +273,7 @@ static inline int autofs_prepare_pipe(struct file *pipe)  {  	if (!pipe->f_op || !pipe->f_op->write)  		return -EINVAL; -	if (!S_ISFIFO(pipe->f_dentry->d_inode->i_mode)) +	if (!S_ISFIFO(file_inode(pipe)->i_mode))  		return -EINVAL;  	/* We want a packet pipe */  	pipe->f_flags |= O_DIRECT; diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c index 9f68a37bb2b..743c7c2c949 100644 --- a/fs/autofs4/dev-ioctl.c +++ b/fs/autofs4/dev-ioctl.c @@ -159,7 +159,7 @@ static struct autofs_sb_info *autofs_dev_ioctl_sbi(struct file *f)  	struct inode *inode;  	if (f) { -		inode = f->f_path.dentry->d_inode; +		inode = file_inode(f);  		sbi = autofs4_sbi(inode->i_sb);  	}  	return sbi; diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index c93447604da..230bd2aad4f 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c @@ -587,7 +587,7 @@ static int autofs4_dir_unlink(struct inode *dir, struct dentry *dentry)  	/* This allows root to remove symlinks */  	if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	if (atomic_dec_and_test(&ino->count)) {  		p_ino = autofs4_dentry_ino(dentry->d_parent); @@ -874,7 +874,7 @@ static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp,  static long autofs4_root_ioctl(struct file *filp,  			       unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	return autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);  } @@ -882,7 +882,7 @@ static long autofs4_root_ioctl(struct file *filp,  static long autofs4_root_compat_ioctl(struct file *filp,  			     unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int ret;  	if (cmd == AUTOFS_IOC_READY || cmd == AUTOFS_IOC_FAIL) diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 2b3bda8d5e6..c8f4e25eb9e 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c @@ -213,7 +213,7 @@ befs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)  static int  befs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	befs_data_stream *ds = &BEFS_I(inode)->i_data.ds;  	befs_off_t value; diff --git a/fs/bfs/dir.c b/fs/bfs/dir.c index 2785ef91191..3f422f6bb5c 100644 --- a/fs/bfs/dir.c +++ b/fs/bfs/dir.c @@ -28,7 +28,7 @@ static struct buffer_head *bfs_find_entry(struct inode *dir,  static int bfs_readdir(struct file *f, void *dirent, filldir_t filldir)  { -	struct inode *dir = f->f_path.dentry->d_inode; +	struct inode *dir = file_inode(f);  	struct buffer_head *bh;  	struct bfs_dirent *de;  	struct bfs_sb_info *info = BFS_SB(dir->i_sb); diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c index 6043567b95c..bbc8f8827ea 100644 --- a/fs/binfmt_aout.c +++ b/fs/binfmt_aout.c @@ -214,7 +214,7 @@ static int load_aout_binary(struct linux_binprm * bprm)  	if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&  	     N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||  	    N_TRSIZE(ex) || N_DRSIZE(ex) || -	    i_size_read(bprm->file->f_path.dentry->d_inode) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) { +	    i_size_read(file_inode(bprm->file)) < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {  		return -ENOEXEC;  	} @@ -367,7 +367,7 @@ static int load_aout_library(struct file *file)  	int retval;  	struct exec ex; -	inode = file->f_path.dentry->d_inode; +	inode = file_inode(file);  	retval = -ENOEXEC;  	error = kernel_read(file, 0, (char *) &ex, sizeof(ex)); diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index ff9dbc630ef..a5702d74d2b 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1141,7 +1141,7 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,  	/* By default, dump shared memory if mapped from an anonymous file. */  	if (vma->vm_flags & VM_SHARED) { -		if (vma->vm_file->f_path.dentry->d_inode->i_nlink == 0 ? +		if (file_inode(vma->vm_file)->i_nlink == 0 ?  		    FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))  			goto whole;  		return 0; diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index cb240dd3b40..9c13e023e2b 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c @@ -909,7 +909,7 @@ static int elf_fdpic_map_file(struct elf_fdpic_params *params,  dynamic_error:  	printk("ELF FDPIC %s with invalid DYNAMIC section (inode=%lu)\n", -	       what, file->f_path.dentry->d_inode->i_ino); +	       what, file_inode(file)->i_ino);  	return -ELIBBAD;  } @@ -1219,7 +1219,7 @@ static int maydump(struct vm_area_struct *vma, unsigned long mm_flags)  	/* By default, dump shared memory if mapped from an anonymous file. */  	if (vma->vm_flags & VM_SHARED) { -		if (vma->vm_file->f_path.dentry->d_inode->i_nlink == 0) { +		if (file_inode(vma->vm_file)->i_nlink == 0) {  			dump_ok = test_bit(MMF_DUMP_ANON_SHARED, &mm_flags);  			kdcore("%08lx: %08lx: %s (share)", vma->vm_start,  			       vma->vm_flags, dump_ok ? "yes" : "no"); diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index b56371981d1..2036d21baae 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c @@ -438,7 +438,7 @@ static int load_flat_file(struct linux_binprm * bprm,  	int ret;  	hdr = ((struct flat_hdr *) bprm->buf);		/* exec-header */ -	inode = bprm->file->f_path.dentry->d_inode; +	inode = file_inode(bprm->file);  	text_len  = ntohl(hdr->data_start);  	data_len  = ntohl(hdr->data_end) - ntohl(hdr->data_start); diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c index 0c8869fdd14..fecbbf3f8ff 100644 --- a/fs/binfmt_misc.c +++ b/fs/binfmt_misc.c @@ -531,7 +531,7 @@ static void kill_node(Node *e)  static ssize_t  bm_entry_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos)  { -	Node *e = file->f_path.dentry->d_inode->i_private; +	Node *e = file_inode(file)->i_private;  	ssize_t res;  	char *page; @@ -550,7 +550,7 @@ static ssize_t bm_entry_write(struct file *file, const char __user *buffer,  				size_t count, loff_t *ppos)  {  	struct dentry *root; -	Node *e = file->f_path.dentry->d_inode->i_private; +	Node *e = file_inode(file)->i_private;  	int res = parse_command(buffer, count);  	switch (res) { diff --git a/fs/block_dev.c b/fs/block_dev.c index 78333a37f49..53f5fae5cfb 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -318,7 +318,7 @@ static int blkdev_write_end(struct file *file, struct address_space *mapping,  /*   * private llseek: - * for a block special file file->f_path.dentry->d_inode->i_size is zero + * for a block special file file_inode(file)->i_size is zero   * so we compute the size by hand (just as in block_read/write above)   */  static loff_t block_llseek(struct file *file, loff_t offset, int whence) diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 614f34a899c..81ee29eeb7c 100644 --- a/fs/btrfs/export.c +++ b/fs/btrfs/export.c @@ -22,10 +22,10 @@ static int btrfs_encode_fh(struct inode *inode, u32 *fh, int *max_len,  	if (parent && (len < BTRFS_FID_SIZE_CONNECTABLE)) {  		*max_len = BTRFS_FID_SIZE_CONNECTABLE; -		return 255; +		return FILEID_INVALID;  	} else if (len < BTRFS_FID_SIZE_NON_CONNECTABLE) {  		*max_len = BTRFS_FID_SIZE_NON_CONNECTABLE; -		return 255; +		return FILEID_INVALID;  	}  	len  = BTRFS_FID_SIZE_NON_CONNECTABLE; diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index aeb84469d2c..4b241fe9d2f 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1225,7 +1225,7 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file,  	struct extent_state *cached_state = NULL;  	int i;  	unsigned long index = pos >> PAGE_CACHE_SHIFT; -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);  	int err = 0;  	int faili = 0; @@ -1312,7 +1312,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,  					       struct iov_iter *i,  					       loff_t pos)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct page **pages = NULL;  	unsigned long first_index; @@ -1500,7 +1500,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,  				    unsigned long nr_segs, loff_t pos)  {  	struct file *file = iocb->ki_filp; -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	loff_t *ppos = &iocb->ki_pos;  	u64 start_pos; @@ -2102,7 +2102,7 @@ out:  static long btrfs_fallocate(struct file *file, int mode,  			    loff_t offset, loff_t len)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct extent_state *cached_state = NULL;  	u64 cur_offset;  	u64 last_byte; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index cc93b23ca35..55c07b65037 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4391,7 +4391,7 @@ unsigned char btrfs_filetype_table[] = {  static int btrfs_real_readdir(struct file *filp, void *dirent,  			      filldir_t filldir)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_item *item;  	struct btrfs_dir_item *di; @@ -6791,7 +6791,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset)  int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct page *page = vmf->page; -	struct inode *inode = fdentry(vma->vm_file)->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;  	struct btrfs_ordered_extent *ordered; diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 338f2597bf7..c3f09f71bed 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -152,7 +152,7 @@ void btrfs_inherit_iflags(struct inode *inode, struct inode *dir)  static int btrfs_ioctl_getflags(struct file *file, void __user *arg)  { -	struct btrfs_inode *ip = BTRFS_I(file->f_path.dentry->d_inode); +	struct btrfs_inode *ip = BTRFS_I(file_inode(file));  	unsigned int flags = btrfs_flags_to_ioctl(ip->flags);  	if (copy_to_user(arg, &flags, sizeof(flags))) @@ -177,7 +177,7 @@ static int check_flags(unsigned int flags)  static int btrfs_ioctl_setflags(struct file *file, void __user *arg)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_inode *ip = BTRFS_I(inode);  	struct btrfs_root *root = ip->root;  	struct btrfs_trans_handle *trans; @@ -310,7 +310,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)  static int btrfs_ioctl_getversion(struct file *file, int __user *arg)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	return put_user(inode->i_generation, arg);  } @@ -1320,7 +1320,7 @@ static noinline int btrfs_ioctl_resize(struct file *file,  	u64 new_size;  	u64 old_size;  	u64 devid = 1; -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_vol_args *vol_args;  	struct btrfs_trans_handle *trans;  	struct btrfs_device *device = NULL; @@ -1489,8 +1489,8 @@ static noinline int btrfs_ioctl_snap_create_transid(struct file *file,  			goto out_drop_write;  		} -		src_inode = src.file->f_path.dentry->d_inode; -		if (src_inode->i_sb != file->f_path.dentry->d_inode->i_sb) { +		src_inode = file_inode(src.file); +		if (src_inode->i_sb != file_inode(file)->i_sb) {  			printk(KERN_INFO "btrfs: Snapshot src from "  			       "another FS\n");  			ret = -EINVAL; @@ -1582,7 +1582,7 @@ out:  static noinline int btrfs_ioctl_subvol_getflags(struct file *file,  						void __user *arg)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	int ret = 0;  	u64 flags = 0; @@ -1604,7 +1604,7 @@ static noinline int btrfs_ioctl_subvol_getflags(struct file *file,  static noinline int btrfs_ioctl_subvol_setflags(struct file *file,  					      void __user *arg)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_trans_handle *trans;  	u64 root_flags; @@ -1898,7 +1898,7 @@ static noinline int btrfs_ioctl_tree_search(struct file *file,  	if (IS_ERR(args))  		return PTR_ERR(args); -	inode = fdentry(file)->d_inode; +	inode = file_inode(file);  	ret = search_ioctl(inode, args);  	if (ret == 0 && copy_to_user(argp, args, sizeof(*args)))  		ret = -EFAULT; @@ -2008,7 +2008,7 @@ static noinline int btrfs_ioctl_ino_lookup(struct file *file,  	if (IS_ERR(args))  		return PTR_ERR(args); -	inode = fdentry(file)->d_inode; +	inode = file_inode(file);  	if (args->treeid == 0)  		args->treeid = BTRFS_I(inode)->root->root_key.objectid; @@ -2184,7 +2184,7 @@ out:  static int btrfs_ioctl_defrag(struct file *file, void __user *argp)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_ioctl_defrag_range_args *range;  	int ret; @@ -2244,7 +2244,7 @@ static int btrfs_ioctl_defrag(struct file *file, void __user *argp)  			/* the rest are all set to zero by kzalloc */  			range->len = (u64)-1;  		} -		ret = btrfs_defrag_file(fdentry(file)->d_inode, file, +		ret = btrfs_defrag_file(file_inode(file), file,  					range, 0, 0);  		if (ret > 0)  			ret = 0; @@ -2292,7 +2292,7 @@ out:  static long btrfs_ioctl_rm_dev(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_vol_args *vol_args;  	int ret; @@ -2415,7 +2415,7 @@ out:  static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,  				       u64 off, u64 olen, u64 destoff)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct fd src_file;  	struct inode *src; @@ -2461,7 +2461,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,  	if (src_file.file->f_path.mnt != file->f_path.mnt)  		goto out_fput; -	src = src_file.file->f_dentry->d_inode; +	src = file_inode(src_file.file);  	ret = -EINVAL;  	if (src == inode) @@ -2823,7 +2823,7 @@ static long btrfs_ioctl_clone_range(struct file *file, void __user *argp)   */  static long btrfs_ioctl_trans_start(struct file *file)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_trans_handle *trans;  	int ret; @@ -2863,7 +2863,7 @@ out:  static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_root *new_root;  	struct btrfs_dir_item *di; @@ -3087,7 +3087,7 @@ out:   */  long btrfs_ioctl_trans_end(struct file *file)  { -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_trans_handle *trans; @@ -3149,7 +3149,7 @@ static noinline long btrfs_ioctl_wait_sync(struct btrfs_root *root,  static long btrfs_ioctl_scrub(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_scrub_args *sa;  	int ret; @@ -3440,7 +3440,7 @@ void update_ioctl_balance_args(struct btrfs_fs_info *fs_info, int lock,  static long btrfs_ioctl_balance(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_fs_info *fs_info = root->fs_info;  	struct btrfs_ioctl_balance_args *bargs;  	struct btrfs_balance_control *bctl; @@ -3630,7 +3630,7 @@ out:  static long btrfs_ioctl_quota_ctl(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_quota_ctl_args *sa;  	struct btrfs_trans_handle *trans = NULL;  	int ret; @@ -3689,7 +3689,7 @@ drop_write:  static long btrfs_ioctl_qgroup_assign(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_qgroup_assign_args *sa;  	struct btrfs_trans_handle *trans;  	int ret; @@ -3736,7 +3736,7 @@ drop_write:  static long btrfs_ioctl_qgroup_create(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_qgroup_create_args *sa;  	struct btrfs_trans_handle *trans;  	int ret; @@ -3787,7 +3787,7 @@ drop_write:  static long btrfs_ioctl_qgroup_limit(struct file *file, void __user *arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	struct btrfs_ioctl_qgroup_limit_args *sa;  	struct btrfs_trans_handle *trans;  	int ret; @@ -3837,7 +3837,7 @@ static long btrfs_ioctl_set_received_subvol(struct file *file,  					    void __user *arg)  {  	struct btrfs_ioctl_received_subvol_args *sa = NULL; -	struct inode *inode = fdentry(file)->d_inode; +	struct inode *inode = file_inode(file);  	struct btrfs_root *root = BTRFS_I(inode)->root;  	struct btrfs_root_item *root_item = &root->root_item;  	struct btrfs_trans_handle *trans; @@ -3917,7 +3917,7 @@ out:  long btrfs_ioctl(struct file *file, unsigned int  		cmd, unsigned long arg)  { -	struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root; +	struct btrfs_root *root = BTRFS_I(file_inode(file))->root;  	void __user *argp = (void __user *)arg;  	switch (cmd) { diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 321b7fb4e44..f4ab7a9260e 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c @@ -4544,7 +4544,7 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_)  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; -	send_root = BTRFS_I(fdentry(mnt_file)->d_inode)->root; +	send_root = BTRFS_I(file_inode(mnt_file))->root;  	fs_info = send_root->fs_info;  	arg = memdup_user(arg_, sizeof(*arg)); diff --git a/fs/buffer.c b/fs/buffer.c index 62169c192c2..8e18281b407 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2332,7 +2332,7 @@ int __block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,  			 get_block_t get_block)  {  	struct page *page = vmf->page; -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	unsigned long end;  	loff_t size;  	int ret; @@ -2371,7 +2371,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,  		   get_block_t get_block)  {  	int ret; -	struct super_block *sb = vma->vm_file->f_path.dentry->d_inode->i_sb; +	struct super_block *sb = file_inode(vma->vm_file)->i_sb;  	sb_start_pagefault(sb); diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 064d1a68d2c..d4f81edd9a5 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -195,7 +195,7 @@ static int ceph_releasepage(struct page *page, gfp_t g)   */  static int readpage_nounlock(struct file *filp, struct page *page)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_osd_client *osdc =   		&ceph_inode_to_client(inode)->client->osdc; @@ -370,7 +370,7 @@ out:  static int ceph_readpages(struct file *file, struct address_space *mapping,  			  struct list_head *page_list, unsigned nr_pages)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);  	int rc = 0;  	int max = 0; @@ -977,7 +977,7 @@ static int ceph_update_writeable_page(struct file *file,  			    loff_t pos, unsigned len,  			    struct page *page)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;  	loff_t page_off = pos & PAGE_CACHE_MASK; @@ -1086,7 +1086,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping,  			    loff_t pos, unsigned len, unsigned flags,  			    struct page **pagep, void **fsdata)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_file_info *fi = file->private_data;  	struct page *page; @@ -1144,7 +1144,7 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,  			  loff_t pos, unsigned len, unsigned copied,  			  struct page *page, void *fsdata)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);  	struct ceph_mds_client *mdsc = fsc->mdsc; @@ -1228,7 +1228,7 @@ const struct address_space_operations ceph_aops = {   */  static int ceph_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  { -	struct inode *inode = vma->vm_file->f_dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	struct page *page = vmf->page;  	struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;  	loff_t off = page_offset(page); diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 8c1aabe93b6..6d797f46d77 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -238,7 +238,7 @@ static int note_last_dentry(struct ceph_file_info *fi, const char *name,  static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir)  {  	struct ceph_file_info *fi = filp->private_data; -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);  	struct ceph_mds_client *mdsc = fsc->mdsc; @@ -1138,7 +1138,7 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size,  			     loff_t *ppos)  {  	struct ceph_file_info *cf = file->private_data; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	int left;  	const int bufsize = 1024; @@ -1188,7 +1188,7 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size,  static int ceph_dir_fsync(struct file *file, loff_t start, loff_t end,  			  int datasync)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct list_head *head = &ci->i_unsafe_dirops;  	struct ceph_mds_request *req; diff --git a/fs/ceph/export.c b/fs/ceph/export.c index ca3ab3f9ca7..16796be53ca 100644 --- a/fs/ceph/export.c +++ b/fs/ceph/export.c @@ -81,7 +81,7 @@ static int ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len,  		if (parent_inode) {  			/* nfsd wants connectable */  			*max_len = connected_handle_length; -			type = 255; +			type = FILEID_INVALID;  		} else {  			dout("encode_fh %p\n", dentry);  			fh->ino = ceph_ino(inode); @@ -90,7 +90,7 @@ static int ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len,  		}  	} else {  		*max_len = handle_length; -		type = 255; +		type = FILEID_INVALID;  	}  	if (dentry)  		dput(dentry); diff --git a/fs/ceph/file.c b/fs/ceph/file.c index e51558fca3a..11b57c2c8f1 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -393,7 +393,7 @@ more:  static ssize_t ceph_sync_read(struct file *file, char __user *data,  			      unsigned len, loff_t *poff, int *checkeof)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct page **pages;  	u64 off = *poff;  	int num_pages, ret; @@ -466,7 +466,7 @@ static void sync_write_commit(struct ceph_osd_request *req,  static ssize_t ceph_sync_write(struct file *file, const char __user *data,  			       size_t left, loff_t *offset)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_fs_client *fsc = ceph_inode_to_client(inode);  	struct ceph_osd_request *req; @@ -483,7 +483,7 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data,  	int ret;  	struct timespec mtime = CURRENT_TIME; -	if (ceph_snap(file->f_dentry->d_inode) != CEPH_NOSNAP) +	if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)  		return -EROFS;  	dout("sync_write on file %p %lld~%u %s\n", file, *offset, @@ -637,7 +637,7 @@ static ssize_t ceph_aio_read(struct kiocb *iocb, const struct iovec *iov,  	struct ceph_file_info *fi = filp->private_data;  	loff_t *ppos = &iocb->ki_pos;  	size_t len = iov->iov_len; -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ceph_inode_info *ci = ceph_inode(inode);  	void __user *base = iov->iov_base;  	ssize_t ret; @@ -707,7 +707,7 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,  {  	struct file *file = iocb->ki_filp;  	struct ceph_file_info *fi = file->private_data; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_osd_client *osdc =  		&ceph_sb_to_client(inode->i_sb)->client->osdc; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index d45895f4a04..851814d951c 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1131,8 +1131,8 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,  					    req->r_request_started);  		dout(" final dn %p\n", dn);  		i++; -	} else if (req->r_op == CEPH_MDS_OP_LOOKUPSNAP || -		   req->r_op == CEPH_MDS_OP_MKSNAP) { +	} else if ((req->r_op == CEPH_MDS_OP_LOOKUPSNAP || +		   req->r_op == CEPH_MDS_OP_MKSNAP) && !req->r_aborted) {  		struct dentry *dn = req->r_dentry;  		/* fill out a snapdir LOOKUPSNAP dentry */ @@ -1196,6 +1196,39 @@ done:  /*   * Prepopulate our cache with readdir results, leases, etc.   */ +static int readdir_prepopulate_inodes_only(struct ceph_mds_request *req, +					   struct ceph_mds_session *session) +{ +	struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info; +	int i, err = 0; + +	for (i = 0; i < rinfo->dir_nr; i++) { +		struct ceph_vino vino; +		struct inode *in; +		int rc; + +		vino.ino = le64_to_cpu(rinfo->dir_in[i].in->ino); +		vino.snap = le64_to_cpu(rinfo->dir_in[i].in->snapid); + +		in = ceph_get_inode(req->r_dentry->d_sb, vino); +		if (IS_ERR(in)) { +			err = PTR_ERR(in); +			dout("new_inode badness got %d\n", err); +			continue; +		} +		rc = fill_inode(in, &rinfo->dir_in[i], NULL, session, +				req->r_request_started, -1, +				&req->r_caps_reservation); +		if (rc < 0) { +			pr_err("fill_inode badness on %p got %d\n", in, rc); +			err = rc; +			continue; +		} +	} + +	return err; +} +  int ceph_readdir_prepopulate(struct ceph_mds_request *req,  			     struct ceph_mds_session *session)  { @@ -1210,6 +1243,9 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,  	u64 frag = le32_to_cpu(rhead->args.readdir.frag);  	struct ceph_dentry_info *di; +	if (req->r_aborted) +		return readdir_prepopulate_inodes_only(req, session); +  	if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) {  		snapdir = ceph_get_snapdir(parent->d_inode);  		parent = d_find_alias(snapdir); diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c index 36549a46e31..f5ed767806d 100644 --- a/fs/ceph/ioctl.c +++ b/fs/ceph/ioctl.c @@ -16,11 +16,11 @@   */  static long ceph_ioctl_get_layout(struct file *file, void __user *arg)  { -	struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode); +	struct ceph_inode_info *ci = ceph_inode(file_inode(file));  	struct ceph_ioctl_layout l;  	int err; -	err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT); +	err = ceph_do_getattr(file_inode(file), CEPH_STAT_CAP_LAYOUT);  	if (!err) {  		l.stripe_unit = ceph_file_layout_su(ci->i_layout);  		l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout); @@ -63,12 +63,12 @@ static long __validate_layout(struct ceph_mds_client *mdsc,  static long ceph_ioctl_set_layout(struct file *file, void __user *arg)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct inode *parent_inode;  	struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;  	struct ceph_mds_request *req;  	struct ceph_ioctl_layout l; -	struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode); +	struct ceph_inode_info *ci = ceph_inode(file_inode(file));  	struct ceph_ioctl_layout nl;  	int err; @@ -76,7 +76,7 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)  		return -EFAULT;  	/* validate changed params against current layout */ -	err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT); +	err = ceph_do_getattr(file_inode(file), CEPH_STAT_CAP_LAYOUT);  	if (err)  		return err; @@ -136,7 +136,7 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)   */  static long ceph_ioctl_set_layout_policy (struct file *file, void __user *arg)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_mds_request *req;  	struct ceph_ioctl_layout l;  	int err; @@ -179,7 +179,7 @@ static long ceph_ioctl_set_layout_policy (struct file *file, void __user *arg)  static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)  {  	struct ceph_ioctl_dataloc dl; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	struct ceph_osd_client *osdc =  		&ceph_sb_to_client(inode->i_sb)->client->osdc; @@ -234,7 +234,7 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)  static long ceph_ioctl_lazyio(struct file *file)  {  	struct ceph_file_info *fi = file->private_data; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_inode_info *ci = ceph_inode(inode);  	if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) { diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c index 80576d05d68..202dd3d68be 100644 --- a/fs/ceph/locks.c +++ b/fs/ceph/locks.c @@ -13,7 +13,7 @@  static int ceph_lock_message(u8 lock_type, u16 operation, struct file *file,  			     int cmd, u8 wait, struct file_lock *fl)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ceph_mds_client *mdsc =  		ceph_sb_to_client(inode->i_sb)->mdsc;  	struct ceph_mds_request *req; diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 9be09b21b4e..4bad7b16271 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -683,7 +683,7 @@ out_nls:  static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  				   unsigned long nr_segs, loff_t pos)  { -	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(iocb->ki_filp);  	ssize_t written;  	int rc; @@ -707,7 +707,7 @@ static loff_t cifs_llseek(struct file *file, loff_t offset, int whence)  	 */  	if (whence != SEEK_SET && whence != SEEK_CUR) {  		int rc; -		struct inode *inode = file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(file);  		/*  		 * We need to be sure that all dirty pages are written and the @@ -739,7 +739,7 @@ static int cifs_setlease(struct file *file, long arg, struct file_lock **lease)  {  	/* note that this is called by vfs setlease with lock_flocks held  	   to protect *lease from going away */ -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct cifsFileInfo *cfile = file->private_data;  	if (!(S_ISREG(inode->i_mode))) diff --git a/fs/cifs/file.c b/fs/cifs/file.c index a8d8b589ee0..c16d2a018ab 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -947,7 +947,7 @@ static int  cifs_posix_lock_test(struct file *file, struct file_lock *flock)  {  	int rc = 0; -	struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode); +	struct cifsInodeInfo *cinode = CIFS_I(file_inode(file));  	unsigned char saved_type = flock->fl_type;  	if ((flock->fl_flags & FL_POSIX) == 0) @@ -974,7 +974,7 @@ cifs_posix_lock_test(struct file *file, struct file_lock *flock)  static int  cifs_posix_lock_set(struct file *file, struct file_lock *flock)  { -	struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode); +	struct cifsInodeInfo *cinode = CIFS_I(file_inode(file));  	int rc = 1;  	if ((flock->fl_flags & FL_POSIX) == 0) @@ -1548,7 +1548,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *flock)  	cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);  	netfid = cfile->fid.netfid; -	cinode = CIFS_I(file->f_path.dentry->d_inode); +	cinode = CIFS_I(file_inode(file));  	if (cap_unix(tcon->ses) &&  	    (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && @@ -2171,7 +2171,7 @@ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end,  	struct cifs_tcon *tcon;  	struct TCP_Server_Info *server;  	struct cifsFileInfo *smbfile = file->private_data; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	rc = filemap_write_and_wait_range(inode->i_mapping, start, end); @@ -2246,7 +2246,7 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)   */  int cifs_flush(struct file *file, fl_owner_t id)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int rc = 0;  	if (file->f_mode & FMODE_WRITE) @@ -2480,7 +2480,7 @@ ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,  	ssize_t written;  	struct inode *inode; -	inode = iocb->ki_filp->f_path.dentry->d_inode; +	inode = file_inode(iocb->ki_filp);  	/*  	 * BB - optimize the way when signing is disabled. We can drop this @@ -2543,7 +2543,7 @@ ssize_t  cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,  		   unsigned long nr_segs, loff_t pos)  { -	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(iocb->ki_filp);  	struct cifsInodeInfo *cinode = CIFS_I(inode);  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	struct cifsFileInfo *cfile = (struct cifsFileInfo *) @@ -2915,7 +2915,7 @@ ssize_t  cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,  		  unsigned long nr_segs, loff_t pos)  { -	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(iocb->ki_filp);  	struct cifsInodeInfo *cinode = CIFS_I(inode);  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	struct cifsFileInfo *cfile = (struct cifsFileInfo *) @@ -3063,7 +3063,7 @@ static struct vm_operations_struct cifs_file_vm_ops = {  int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)  {  	int rc, xid; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	xid = get_xid(); @@ -3356,7 +3356,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page,  	int rc;  	/* Is the page cached? */ -	rc = cifs_readpage_from_fscache(file->f_path.dentry->d_inode, page); +	rc = cifs_readpage_from_fscache(file_inode(file), page);  	if (rc == 0)  		goto read_complete; @@ -3371,8 +3371,8 @@ static int cifs_readpage_worker(struct file *file, struct page *page,  	else  		cFYI(1, "Bytes read %d", rc); -	file->f_path.dentry->d_inode->i_atime = -		current_fs_time(file->f_path.dentry->d_inode->i_sb); +	file_inode(file)->i_atime = +		current_fs_time(file_inode(file)->i_sb);  	if (PAGE_CACHE_SIZE > rc)  		memset(read_data + rc, 0, PAGE_CACHE_SIZE - rc); @@ -3381,7 +3381,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page,  	SetPageUptodate(page);  	/* send this page to the cache */ -	cifs_readpage_to_fscache(file->f_path.dentry->d_inode, page); +	cifs_readpage_to_fscache(file_inode(file), page);  	rc = 0; diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 9638233964f..d2a833999bc 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -299,7 +299,7 @@ cifs_get_file_info_unix(struct file *filp)  	unsigned int xid;  	FILE_UNIX_BASIC_INFO find_data;  	struct cifs_fattr fattr; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	struct cifsFileInfo *cfile = filp->private_data;  	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); @@ -568,7 +568,7 @@ cifs_get_file_info(struct file *filp)  	unsigned int xid;  	FILE_ALL_INFO find_data;  	struct cifs_fattr fattr; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);  	struct cifsFileInfo *cfile = filp->private_data;  	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); @@ -1688,7 +1688,7 @@ cifs_invalidate_mapping(struct inode *inode)  int cifs_revalidate_file_attr(struct file *filp)  {  	int rc = 0; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct cifsFileInfo *cfile = (struct cifsFileInfo *) filp->private_data;  	if (!cifs_inode_needs_reval(inode)) @@ -1745,7 +1745,7 @@ out:  int cifs_revalidate_file(struct file *filp)  {  	int rc; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	rc = cifs_revalidate_file_attr(filp);  	if (rc) diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index fd5009d56f9..6c9f1214cf0 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c @@ -30,7 +30,7 @@  long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)  { -	struct inode *inode = filep->f_dentry->d_inode; +	struct inode *inode = file_inode(filep);  	int rc = -ENOTTY; /* strange error - but the precedent */  	unsigned int xid;  	struct cifs_sb_info *cifs_sb; diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index cdd6ff48246..df40cc5fd13 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c @@ -82,12 +82,10 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,  	cFYI(1, "%s: for %s", __func__, name->name); -	if (parent->d_op && parent->d_op->d_hash) -		parent->d_op->d_hash(parent, parent->d_inode, name); -	else -		name->hash = full_name_hash(name->name, name->len); +	dentry = d_hash_and_lookup(parent, name); +	if (unlikely(IS_ERR(dentry))) +		return; -	dentry = d_lookup(parent, name);  	if (dentry) {  		int err; @@ -505,7 +503,7 @@ static int cifs_entry_is_dot(struct cifs_dirent *de, bool is_unicode)     whether we can use the cached search results from the previous search */  static int is_dir_changed(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct cifsInodeInfo *cifsInfo = CIFS_I(inode);  	if (cifsInfo->time == 0) @@ -778,7 +776,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)  	switch ((int) file->f_pos) {  	case 0:  		if (filldir(direntry, ".", 1, file->f_pos, -		     file->f_path.dentry->d_inode->i_ino, DT_DIR) < 0) { +		     file_inode(file)->i_ino, DT_DIR) < 0) {  			cERROR(1, "Filldir for current dir failed");  			rc = -ENOMEM;  			break; diff --git a/fs/coda/dir.c b/fs/coda/dir.c index 49fe52d2560..b7d3a05c062 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c @@ -397,7 +397,7 @@ static int coda_readdir(struct file *coda_file, void *buf, filldir_t filldir)  		 * We can't use vfs_readdir because we have to keep the file  		 * position in sync between the coda_file and the host_file.  		 * and as such we need grab the inode mutex. */ -		struct inode *host_inode = host_file->f_path.dentry->d_inode; +		struct inode *host_inode = file_inode(host_file);  		mutex_lock(&host_inode->i_mutex);  		host_file->f_pos = coda_file->f_pos; diff --git a/fs/coda/file.c b/fs/coda/file.c index 8edd404e641..fa4c100bdc7 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c @@ -66,7 +66,7 @@ coda_file_splice_read(struct file *coda_file, loff_t *ppos,  static ssize_t  coda_file_write(struct file *coda_file, const char __user *buf, size_t count, loff_t *ppos)  { -	struct inode *host_inode, *coda_inode = coda_file->f_path.dentry->d_inode; +	struct inode *host_inode, *coda_inode = file_inode(coda_file);  	struct coda_file_info *cfi;  	struct file *host_file;  	ssize_t ret; @@ -78,7 +78,7 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo  	if (!host_file->f_op || !host_file->f_op->write)  		return -EINVAL; -	host_inode = host_file->f_path.dentry->d_inode; +	host_inode = file_inode(host_file);  	mutex_lock(&coda_inode->i_mutex);  	ret = host_file->f_op->write(host_file, buf, count, ppos); @@ -106,8 +106,8 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)  	if (!host_file->f_op || !host_file->f_op->mmap)  		return -ENODEV; -	coda_inode = coda_file->f_path.dentry->d_inode; -	host_inode = host_file->f_path.dentry->d_inode; +	coda_inode = file_inode(coda_file); +	host_inode = file_inode(host_file);  	cii = ITOC(coda_inode);  	spin_lock(&cii->c_lock); @@ -178,7 +178,7 @@ int coda_release(struct inode *coda_inode, struct file *coda_file)  	err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode),  			  coda_flags, coda_file->f_cred->fsuid); -	host_inode = cfi->cfi_container->f_path.dentry->d_inode; +	host_inode = file_inode(cfi->cfi_container);  	cii = ITOC(coda_inode);  	/* did we mmap this file? */ @@ -202,7 +202,7 @@ int coda_release(struct inode *coda_inode, struct file *coda_file)  int coda_fsync(struct file *coda_file, loff_t start, loff_t end, int datasync)  {  	struct file *host_file; -	struct inode *coda_inode = coda_file->f_path.dentry->d_inode; +	struct inode *coda_inode = file_inode(coda_file);  	struct coda_file_info *cfi;  	int err; diff --git a/fs/coda/inode.c b/fs/coda/inode.c index cf674e9179a..dada9d0abed 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c @@ -130,7 +130,7 @@ static int get_device_index(struct coda_mount_data *data)  	f = fdget(data->fd);  	if (!f.file)  		goto Ebadf; -	inode = f.file->f_path.dentry->d_inode; +	inode = file_inode(f.file);  	if (!S_ISCHR(inode->i_mode) || imajor(inode) != CODA_PSDEV_MAJOR) {  		fdput(f);  		goto Ebadf; diff --git a/fs/coda/pioctl.c b/fs/coda/pioctl.c index ee0981f1375..3f5de96bbb5 100644 --- a/fs/coda/pioctl.c +++ b/fs/coda/pioctl.c @@ -52,7 +52,7 @@ static long coda_pioctl(struct file *filp, unsigned int cmd,  	struct path path;  	int error;  	struct PioctlData data; -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct inode *target_inode = NULL;  	struct coda_inode_info *cnp; diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index e2f57a00702..3ced75f765c 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c @@ -1582,7 +1582,7 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,  	case FIBMAP:  	case FIGETBSZ:  	case FIONREAD: -		if (S_ISREG(f.file->f_path.dentry->d_inode->i_mode)) +		if (S_ISREG(file_inode(f.file)->i_mode))  			break;  		/*FALL THROUGH*/ diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index e9dcfa3c208..7aabc6ad4e9 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c @@ -1626,7 +1626,7 @@ static loff_t configfs_dir_lseek(struct file *file, loff_t offset, int whence)  			if (offset >= 0)  				break;  		default: -			mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); +			mutex_unlock(&file_inode(file)->i_mutex);  			return -EINVAL;  	}  	if (offset != file->f_pos) { diff --git a/fs/coredump.c b/fs/coredump.c index 177493272a6..69baf903d3b 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -411,7 +411,7 @@ static void wait_for_dump_helpers(struct file *file)  {  	struct pipe_inode_info *pipe; -	pipe = file->f_path.dentry->d_inode->i_pipe; +	pipe = file_inode(file)->i_pipe;  	pipe_lock(pipe);  	pipe->readers++; @@ -600,7 +600,7 @@ void do_coredump(siginfo_t *siginfo)  		if (IS_ERR(cprm.file))  			goto fail_unlock; -		inode = cprm.file->f_path.dentry->d_inode; +		inode = file_inode(cprm.file);  		if (inode->i_nlink > 1)  			goto close_fail;  		if (d_unhashed(cprm.file->f_path.dentry)) diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index c6c3f91ecf0..3ceb9ec976e 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -351,7 +351,7 @@ static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf)   */  static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	char *buf;  	unsigned int offset; diff --git a/fs/dcache.c b/fs/dcache.c index 19153a0a810..68220dd0c13 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1358,6 +1358,7 @@ void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)  	WARN_ON_ONCE(dentry->d_flags & (DCACHE_OP_HASH	|  				DCACHE_OP_COMPARE	|  				DCACHE_OP_REVALIDATE	| +				DCACHE_OP_WEAK_REVALIDATE	|  				DCACHE_OP_DELETE ));  	dentry->d_op = op;  	if (!op) @@ -1368,6 +1369,8 @@ void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)  		dentry->d_flags |= DCACHE_OP_COMPARE;  	if (op->d_revalidate)  		dentry->d_flags |= DCACHE_OP_REVALIDATE; +	if (op->d_weak_revalidate) +		dentry->d_flags |= DCACHE_OP_WEAK_REVALIDATE;  	if (op->d_delete)  		dentry->d_flags |= DCACHE_OP_DELETE;  	if (op->d_prune) @@ -1672,7 +1675,6 @@ EXPORT_SYMBOL(d_splice_alias);  struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,  			struct qstr *name)  { -	int error;  	struct dentry *found;  	struct dentry *new; @@ -1681,10 +1683,12 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,  	 * if not go ahead and create it now.  	 */  	found = d_hash_and_lookup(dentry->d_parent, name); +	if (unlikely(IS_ERR(found))) +		goto err_out;  	if (!found) {  		new = d_alloc(dentry->d_parent, name);  		if (!new) { -			error = -ENOMEM; +			found = ERR_PTR(-ENOMEM);  			goto err_out;  		} @@ -1725,7 +1729,7 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,  err_out:  	iput(inode); -	return ERR_PTR(error); +	return found;  }  EXPORT_SYMBOL(d_add_ci); @@ -1889,7 +1893,7 @@ seqretry:   * dentry is returned. The caller must use dput to free the entry when it has   * finished using it. %NULL is returned if the dentry does not exist.   */ -struct dentry *d_lookup(struct dentry *parent, struct qstr *name) +struct dentry *d_lookup(const struct dentry *parent, const struct qstr *name)  {  	struct dentry *dentry;  	unsigned seq; @@ -1919,7 +1923,7 @@ EXPORT_SYMBOL(d_lookup);   *   * __d_lookup callers must be commented.   */ -struct dentry *__d_lookup(struct dentry *parent, struct qstr *name) +struct dentry *__d_lookup(const struct dentry *parent, const struct qstr *name)  {  	unsigned int len = name->len;  	unsigned int hash = name->hash; @@ -1997,12 +2001,10 @@ next:   * @dir: Directory to search in   * @name: qstr of name we wish to find   * - * On hash failure or on lookup failure NULL is returned. + * On lookup failure NULL is returned; on bad name - ERR_PTR(-error)   */  struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)  { -	struct dentry *dentry = NULL; -  	/*  	 * Check for a fs-specific hash function. Note that we must  	 * calculate the standard hash first, as the d_op->d_hash() @@ -2010,13 +2012,13 @@ struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)  	 */  	name->hash = full_name_hash(name->name, name->len);  	if (dir->d_flags & DCACHE_OP_HASH) { -		if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0) -			goto out; +		int err = dir->d_op->d_hash(dir, dir->d_inode, name); +		if (unlikely(err < 0)) +			return ERR_PTR(err);  	} -	dentry = d_lookup(dir, name); -out: -	return dentry; +	return d_lookup(dir, name);  } +EXPORT_SYMBOL(d_hash_and_lookup);  /**   * d_validate - verify dentry provided from insecure source (deprecated) @@ -2394,7 +2396,7 @@ out_err:   */  static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)  { -	struct dentry *dparent, *aparent; +	struct dentry *dparent;  	dentry_lock_for_move(anon, dentry); @@ -2402,24 +2404,15 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)  	write_seqcount_begin(&anon->d_seq);  	dparent = dentry->d_parent; -	aparent = anon->d_parent;  	switch_names(dentry, anon);  	swap(dentry->d_name.hash, anon->d_name.hash); -	dentry->d_parent = (aparent == anon) ? dentry : aparent; -	list_del(&dentry->d_u.d_child); -	if (!IS_ROOT(dentry)) -		list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs); -	else -		INIT_LIST_HEAD(&dentry->d_u.d_child); - -	anon->d_parent = (dparent == dentry) ? anon : dparent; +	dentry->d_parent = dentry; +	list_del_init(&dentry->d_u.d_child); +	anon->d_parent = dparent;  	list_del(&anon->d_u.d_child); -	if (!IS_ROOT(anon)) -		list_add(&anon->d_u.d_child, &anon->d_parent->d_subdirs); -	else -		INIT_LIST_HEAD(&anon->d_u.d_child); +	list_add(&anon->d_u.d_child, &dparent->d_subdirs);  	write_seqcount_end(&dentry->d_seq);  	write_seqcount_end(&anon->d_seq); @@ -2722,37 +2715,6 @@ char *d_path(const struct path *path, char *buf, int buflen)  }  EXPORT_SYMBOL(d_path); -/** - * d_path_with_unreachable - return the path of a dentry - * @path: path to report - * @buf: buffer to return value in - * @buflen: buffer length - * - * The difference from d_path() is that this prepends "(unreachable)" - * to paths which are unreachable from the current process' root. - */ -char *d_path_with_unreachable(const struct path *path, char *buf, int buflen) -{ -	char *res = buf + buflen; -	struct path root; -	int error; - -	if (path->dentry->d_op && path->dentry->d_op->d_dname) -		return path->dentry->d_op->d_dname(path->dentry, buf, buflen); - -	get_fs_root(current->fs, &root); -	write_seqlock(&rename_lock); -	error = path_with_deleted(path, &root, &res, &buflen); -	if (error > 0) -		error = prepend_unreachable(&res, &buflen); -	write_sequnlock(&rename_lock); -	path_put(&root); -	if (error) -		res =  ERR_PTR(error); - -	return res; -} -  /*   * Helper function for dentry_operations.d_dname() members   */ @@ -3035,7 +2997,7 @@ ino_t find_inode_number(struct dentry *dir, struct qstr *name)  	ino_t ino = 0;  	dentry = d_hash_and_lookup(dir, name); -	if (dentry) { +	if (!IS_ERR_OR_NULL(dentry)) {  		if (dentry->d_inode)  			ino = dentry->d_inode->i_ino;  		dput(dentry); diff --git a/fs/direct-io.c b/fs/direct-io.c index cf5b44b10c6..f853263cf74 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -261,9 +261,9 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, bool is  		dio->end_io(dio->iocb, offset, transferred,  			    dio->private, ret, is_async);  	} else { +		inode_dio_done(dio->inode);  		if (is_async)  			aio_complete(dio->iocb, ret, 0); -		inode_dio_done(dio->inode);  	}  	return ret; diff --git a/fs/dlm/config.c b/fs/dlm/config.c index a0387dd8b1f..7d58d5b112b 100644 --- a/fs/dlm/config.c +++ b/fs/dlm/config.c @@ -158,7 +158,7 @@ static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,  	unsigned int x;  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	x = simple_strtoul(buf, NULL, 0); diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index cfb4b9fed52..7e2c6f5d798 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h @@ -509,6 +509,12 @@ ecryptfs_dentry_to_lower_mnt(struct dentry *dentry)  	return ((struct ecryptfs_dentry_info *)dentry->d_fsdata)->lower_path.mnt;  } +static inline struct path * +ecryptfs_dentry_to_lower_path(struct dentry *dentry) +{ +	return &((struct ecryptfs_dentry_info *)dentry->d_fsdata)->lower_path; +} +  static inline void  ecryptfs_set_dentry_lower_mnt(struct dentry *dentry, struct vfsmount *lower_mnt)  { diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index d45ba456812..53acc9d0c13 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -118,7 +118,7 @@ static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)  	lower_file = ecryptfs_file_to_lower(file);  	lower_file->f_pos = file->f_pos; -	inode = file->f_path.dentry->d_inode; +	inode = file_inode(file);  	memset(&buf, 0, sizeof(buf));  	buf.dirent = dirent;  	buf.dentry = file->f_path.dentry; @@ -133,7 +133,7 @@ static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)  		goto out;  	if (rc >= 0)  		fsstack_copy_attr_atime(inode, -					lower_file->f_path.dentry->d_inode); +					file_inode(lower_file));  out:  	return rc;  } diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index cc7709e7c50..e0f07fb6d56 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -1027,8 +1027,7 @@ int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry,  	struct kstat lower_stat;  	int rc; -	rc = vfs_getattr(ecryptfs_dentry_to_lower_mnt(dentry), -			 ecryptfs_dentry_to_lower(dentry), &lower_stat); +	rc = vfs_getattr(ecryptfs_dentry_to_lower_path(dentry), &lower_stat);  	if (!rc) {  		fsstack_copy_attr_all(dentry->d_inode,  				      ecryptfs_inode_to_lower(dentry->d_inode)); diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index b2a34a192f4..6a160539cd2 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c @@ -40,16 +40,12 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,  			 loff_t offset, size_t size)  {  	struct file *lower_file; -	mm_segment_t fs_save;  	ssize_t rc;  	lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;  	if (!lower_file)  		return -EIO; -	fs_save = get_fs(); -	set_fs(get_ds()); -	rc = vfs_write(lower_file, data, size, &offset); -	set_fs(fs_save); +	rc = kernel_write(lower_file, data, size, offset);  	mark_inode_dirty_sync(ecryptfs_inode);  	return rc;  } diff --git a/fs/efs/dir.c b/fs/efs/dir.c index 7ee6f7e3a60..055a9e9ca74 100644 --- a/fs/efs/dir.c +++ b/fs/efs/dir.c @@ -20,7 +20,7 @@ const struct inode_operations efs_dir_inode_operations = {  };  static int efs_readdir(struct file *filp, void *dirent, filldir_t filldir) { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct buffer_head *bh;  	struct efs_dir		*dirblock; diff --git a/fs/exec.c b/fs/exec.c index 20df02c1cc7..864c50df660 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -123,7 +123,7 @@ SYSCALL_DEFINE1(uselib, const char __user *, library)  		goto out;  	error = -EINVAL; -	if (!S_ISREG(file->f_path.dentry->d_inode->i_mode)) +	if (!S_ISREG(file_inode(file)->i_mode))  		goto exit;  	error = -EACCES; @@ -355,7 +355,7 @@ static bool valid_arg_len(struct linux_binprm *bprm, long len)   * flags, permissions, and offset, so we use temporary values.  We'll update   * them later in setup_arg_pages().   */ -int bprm_mm_init(struct linux_binprm *bprm) +static int bprm_mm_init(struct linux_binprm *bprm)  {  	int err;  	struct mm_struct *mm = NULL; @@ -764,7 +764,7 @@ struct file *open_exec(const char *name)  		goto out;  	err = -EACCES; -	if (!S_ISREG(file->f_path.dentry->d_inode->i_mode)) +	if (!S_ISREG(file_inode(file)->i_mode))  		goto exit;  	if (file->f_path.mnt->mnt_flags & MNT_NOEXEC) @@ -1098,7 +1098,7 @@ EXPORT_SYMBOL(flush_old_exec);  void would_dump(struct linux_binprm *bprm, struct file *file)  { -	if (inode_permission(file->f_path.dentry->d_inode, MAY_READ) < 0) +	if (inode_permission(file_inode(file), MAY_READ) < 0)  		bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;  }  EXPORT_SYMBOL(would_dump); @@ -1270,7 +1270,7 @@ static int check_unsafe_exec(struct linux_binprm *bprm)  int prepare_binprm(struct linux_binprm *bprm)  {  	umode_t mode; -	struct inode * inode = bprm->file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(bprm->file);  	int retval;  	mode = inode->i_mode; diff --git a/fs/exofs/dir.c b/fs/exofs/dir.c index c61e62ac231..46375896cfc 100644 --- a/fs/exofs/dir.c +++ b/fs/exofs/dir.c @@ -242,7 +242,7 @@ static int  exofs_readdir(struct file *filp, void *dirent, filldir_t filldir)  {  	loff_t pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	unsigned int offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT;  	unsigned long npages = dir_pages(inode); diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c index 0f4f5c92925..4237722bfd2 100644 --- a/fs/ext2/dir.c +++ b/fs/ext2/dir.c @@ -290,7 +290,7 @@ static int  ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)  {  	loff_t pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	unsigned int offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT; diff --git a/fs/ext2/ioctl.c b/fs/ext2/ioctl.c index 2de655f5d62..5d46c09863f 100644 --- a/fs/ext2/ioctl.c +++ b/fs/ext2/ioctl.c @@ -19,7 +19,7 @@  long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ext2_inode_info *ei = EXT2_I(inode);  	unsigned int flags;  	unsigned short rsv_window_size; diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c index dd91264ba94..87eccbbca25 100644 --- a/fs/ext3/dir.c +++ b/fs/ext3/dir.c @@ -99,7 +99,7 @@ static int ext3_readdir(struct file * filp,  	int i, stored;  	struct ext3_dir_entry_2 *de;  	int err; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	int ret = 0;  	int dir_has_error = 0; @@ -114,7 +114,7 @@ static int ext3_readdir(struct file * filp,  		 * We don't set the inode dirty flag since it's not  		 * critical that it get flushed back to the disk.  		 */ -		EXT3_I(filp->f_path.dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; +		EXT3_I(file_inode(filp))->i_flags &= ~EXT3_INDEX_FL;  	}  	stored = 0;  	offset = filp->f_pos & (sb->s_blocksize - 1); @@ -457,7 +457,7 @@ static int call_filldir(struct file * filp, void * dirent,  {  	struct dir_private_info *info = filp->private_data;  	loff_t	curr_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block * sb;  	int error; @@ -487,7 +487,7 @@ static int ext3_dx_readdir(struct file * filp,  			 void * dirent, filldir_t filldir)  {  	struct dir_private_info *info = filp->private_data; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct fname *fname;  	int	ret; diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c index 677a5c27dc6..4d96e9a6453 100644 --- a/fs/ext3/ioctl.c +++ b/fs/ext3/ioctl.c @@ -14,7 +14,7 @@  long ext3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ext3_inode_info *ei = EXT3_I(inode);  	unsigned int flags;  	unsigned short rsv_window_size; diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index 88f64eb1b6f..692de13e359 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c @@ -623,7 +623,7 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,  	dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash,  		       start_minor_hash)); -	dir = dir_file->f_path.dentry->d_inode; +	dir = file_inode(dir_file);  	if (!(EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) {  		hinfo.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version;  		if (hinfo.hash_version <= DX_HASH_TEA) @@ -637,7 +637,7 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,  	}  	hinfo.hash = start_hash;  	hinfo.minor_hash = 0; -	frame = dx_probe(NULL, dir_file->f_path.dentry->d_inode, &hinfo, frames, &err); +	frame = dx_probe(NULL, file_inode(dir_file), &hinfo, frames, &err);  	if (!frame)  		return err; diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 3882fbc5e21..6dda04f05ef 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c @@ -110,7 +110,7 @@ static int ext4_readdir(struct file *filp,  	int i, stored;  	struct ext4_dir_entry_2 *de;  	int err; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	int ret = 0;  	int dir_has_error = 0; @@ -133,7 +133,7 @@ static int ext4_readdir(struct file *filp,  		 * We don't set the inode dirty flag since it's not  		 * critical that it get flushed back to the disk.  		 */ -		ext4_clear_inode_flag(filp->f_path.dentry->d_inode, +		ext4_clear_inode_flag(file_inode(filp),  				      EXT4_INODE_INDEX);  	}  	stored = 0; @@ -495,7 +495,7 @@ static int call_filldir(struct file *filp, void *dirent,  {  	struct dir_private_info *info = filp->private_data;  	loff_t	curr_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb;  	int error; @@ -527,7 +527,7 @@ static int ext4_dx_readdir(struct file *filp,  			 void *dirent, filldir_t filldir)  {  	struct dir_private_info *info = filp->private_data; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct fname *fname;  	int	ret; diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 372b2cbee07..28dd8eeea6a 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4309,7 +4309,7 @@ static void ext4_falloc_update_inode(struct inode *inode,   */  long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	handle_t *handle;  	loff_t new_size;  	unsigned int max_blocks; @@ -4571,7 +4571,7 @@ static int ext4_xattr_fiemap(struct inode *inode,   */  int ext4_ext_punch_hole(struct file *file, loff_t offset, loff_t length)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct super_block *sb = inode->i_sb;  	ext4_lblk_t first_block, stop_block;  	struct address_space *mapping = inode->i_mapping; diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 7e85a10a6f4..64848b595b2 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -167,7 +167,7 @@ static ssize_t  ext4_file_write(struct kiocb *iocb, const struct iovec *iov,  		unsigned long nr_segs, loff_t pos)  { -	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(iocb->ki_filp);  	ssize_t ret;  	/* diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index bc5f871f089..c0fd1a123f7 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -1298,7 +1298,7 @@ int ext4_read_inline_dir(struct file *filp,  	int i, stored;  	struct ext4_dir_entry_2 *de;  	struct super_block *sb; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int ret, inline_size = 0;  	struct ext4_iloc iloc;  	void *dir_buf = NULL; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 88049d8d30c..9c4f4b1c97f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2948,7 +2948,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,  			    ssize_t size, void *private, int ret,  			    bool is_async)  { -	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(iocb->ki_filp);          ext4_io_end_t *io_end = iocb->private;  	/* if not async direct IO or dio with 0 bytes write, just return */ @@ -3483,7 +3483,7 @@ int ext4_can_truncate(struct inode *inode)  int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	if (!S_ISREG(inode->i_mode))  		return -EOPNOTSUPP; @@ -4855,7 +4855,7 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  	unsigned long len;  	int ret;  	struct file *file = vma->vm_file; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct address_space *mapping = inode->i_mapping;  	handle_t *handle;  	get_block_t *get_block; diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 31f4f56a32d..721f4d33e14 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c @@ -22,7 +22,7 @@  long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	struct ext4_inode_info *ei = EXT4_I(inode);  	unsigned int flags; diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index d78c33eed7e..4e81d47aa8c 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c @@ -900,7 +900,7 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,  		  pgoff_t orig_page_offset, int data_offset_in_page,  		  int block_len_in_page, int uninit, int *err)  { -	struct inode *orig_inode = o_filp->f_dentry->d_inode; +	struct inode *orig_inode = file_inode(o_filp);  	struct page *pagep[2] = {NULL, NULL};  	handle_t *handle;  	ext4_lblk_t orig_blk_offset; @@ -1279,8 +1279,8 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,  		 __u64 orig_start, __u64 donor_start, __u64 len,  		 __u64 *moved_len)  { -	struct inode *orig_inode = o_filp->f_dentry->d_inode; -	struct inode *donor_inode = d_filp->f_dentry->d_inode; +	struct inode *orig_inode = file_inode(o_filp); +	struct inode *donor_inode = file_inode(d_filp);  	struct ext4_ext_path *orig_path = NULL, *holecheck_path = NULL;  	struct ext4_extent *ext_prev, *ext_cur, *ext_dummy;  	ext4_lblk_t block_start = orig_start; diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 2a7015d06a7..3825d6aa833 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -964,7 +964,7 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,  	dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n",  		       start_hash, start_minor_hash)); -	dir = dir_file->f_path.dentry->d_inode; +	dir = file_inode(dir_file);  	if (!(ext4_test_inode_flag(dir, EXT4_INODE_INDEX))) {  		hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version;  		if (hinfo.hash_version <= DX_HASH_TEA) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 373d46cd5d3..620cf5615ba 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -450,7 +450,7 @@ void ext4_error_file(struct file *file, const char *function,  	va_list args;  	struct va_format vaf;  	struct ext4_super_block *es; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	char pathname[80], *path;  	es = EXT4_SB(inode->i_sb)->s_es; diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index c395c501297..a1f38443ece 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c @@ -600,7 +600,7 @@ bool f2fs_empty_dir(struct inode *dir)  static int f2fs_readdir(struct file *file, void *dirent, filldir_t filldir)  {  	unsigned long pos = file->f_pos; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	unsigned long npages = dir_blocks(inode);  	unsigned char *types = NULL;  	unsigned int bit_pos = 0, start_bit_pos = 0; diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 58bf744dbf3..165012ef363 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -698,7 +698,7 @@ out:  static int fat_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	return __fat_readdir(inode, filp, dirent, filldir, 0, 0);  } @@ -779,7 +779,7 @@ static int fat_ioctl_readdir(struct inode *inode, struct file *filp,  static long fat_dir_ioctl(struct file *filp, unsigned int cmd,  			  unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct __fat_dirent __user *d1 = (struct __fat_dirent __user *)arg;  	int short_only, both; @@ -819,7 +819,7 @@ FAT_IOCTL_FILLDIR_FUNC(fat_compat_ioctl_filldir, compat_dirent)  static long fat_compat_dir_ioctl(struct file *filp, unsigned cmd,  				 unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct compat_dirent __user *d1 = compat_ptr(arg);  	int short_only, both; diff --git a/fs/fat/file.c b/fs/fat/file.c index a62e0ecbe2d..3978f8ca182 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -32,7 +32,7 @@ static int fat_ioctl_get_attributes(struct inode *inode, u32 __user *user_attr)  static int fat_ioctl_set_attributes(struct file *file, u32 __user *user_attr)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);  	int is_dir = S_ISDIR(inode->i_mode);  	u32 attr, oldattr; @@ -116,7 +116,7 @@ out:  long fat_generic_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	u32 __user *user_attr = (u32 __user *)arg;  	switch (cmd) { diff --git a/fs/fcntl.c b/fs/fcntl.c index 71a600a19f0..6599222536e 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -30,7 +30,7 @@  static int setfl(int fd, struct file * filp, unsigned long arg)  { -	struct inode * inode = filp->f_path.dentry->d_inode; +	struct inode * inode = file_inode(filp);  	int error = 0;  	/* diff --git a/fs/file_table.c b/fs/file_table.c index de9e9653d61..aa07d3684a2 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -94,8 +94,8 @@ int proc_nr_files(ctl_table *table, int write,  #endif  /* Find an unused file structure and return a pointer to it. - * Returns NULL, if there are no more free file structures or - * we run out of memory. + * Returns an error pointer if some error happend e.g. we over file + * structures limit, run out of memory or operation is not permitted.   *   * Be very careful using this.  You are responsible for   * getting write access to any mount that you might assign @@ -107,7 +107,8 @@ struct file *get_empty_filp(void)  {  	const struct cred *cred = current_cred();  	static long old_max; -	struct file * f; +	struct file *f; +	int error;  	/*  	 * Privileged users can go above max_files @@ -122,13 +123,16 @@ struct file *get_empty_filp(void)  	}  	f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL); -	if (f == NULL) -		goto fail; +	if (unlikely(!f)) +		return ERR_PTR(-ENOMEM);  	percpu_counter_inc(&nr_files);  	f->f_cred = get_cred(cred); -	if (security_file_alloc(f)) -		goto fail_sec; +	error = security_file_alloc(f); +	if (unlikely(error)) { +		file_free(f); +		return ERR_PTR(error); +	}  	INIT_LIST_HEAD(&f->f_u.fu_list);  	atomic_long_set(&f->f_count, 1); @@ -144,12 +148,7 @@ over:  		pr_info("VFS: file-max limit %lu reached\n", get_max_files());  		old_max = get_nr_files();  	} -	goto fail; - -fail_sec: -	file_free(f); -fail: -	return NULL; +	return ERR_PTR(-ENFILE);  }  /** @@ -173,8 +172,8 @@ struct file *alloc_file(struct path *path, fmode_t mode,  	struct file *file;  	file = get_empty_filp(); -	if (!file) -		return NULL; +	if (IS_ERR(file)) +		return file;  	file->f_path = *path;  	file->f_mapping = path->dentry->d_inode->i_mapping; @@ -447,7 +446,7 @@ void mark_files_ro(struct super_block *sb)  	lg_global_lock(&files_lglock);  	do_file_list_for_each_entry(sb, f) { -		if (!S_ISREG(f->f_path.dentry->d_inode->i_mode)) +		if (!S_ISREG(file_inode(f)->i_mode))  		       continue;  		if (!file_count(f))  			continue; diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c index bd447e88f20..664b07a5387 100644 --- a/fs/freevxfs/vxfs_lookup.c +++ b/fs/freevxfs/vxfs_lookup.c @@ -237,7 +237,7 @@ vxfs_lookup(struct inode *dip, struct dentry *dp, unsigned int flags)  static int  vxfs_readdir(struct file *fp, void *retp, filldir_t filler)  { -	struct inode		*ip = fp->f_path.dentry->d_inode; +	struct inode		*ip = file_inode(fp);  	struct super_block	*sbp = ip->i_sb;  	u_long			bsize = sbp->s_blocksize;  	u_long			page, npages, block, pblocks, nblocks, offset; diff --git a/fs/fuse/control.c b/fs/fuse/control.c index 75a20c092dd..b7978b9f75e 100644 --- a/fs/fuse/control.c +++ b/fs/fuse/control.c @@ -23,7 +23,7 @@ static struct fuse_conn *fuse_ctl_file_conn_get(struct file *file)  {  	struct fuse_conn *fc;  	mutex_lock(&fuse_mutex); -	fc = file->f_path.dentry->d_inode->i_private; +	fc = file_inode(file)->i_private;  	if (fc)  		fc = fuse_conn_get(fc);  	mutex_unlock(&fuse_mutex); diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 85065221a58..ff15522481d 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1325,7 +1325,7 @@ static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)  	int plus, err;  	size_t nbytes;  	struct page *page; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct fuse_conn *fc = get_fuse_conn(inode);  	struct fuse_req *req;  	u64 attr_version = 0; diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 01353ed7575..df00993ed10 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -679,7 +679,7 @@ static int fuse_encode_fh(struct inode *inode, u32 *fh, int *max_len,  	if (*max_len < len) {  		*max_len = len; -		return  255; +		return  FILEID_INVALID;  	}  	nodeid = get_fuse_inode(inode)->nodeid; diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index 4767774a5f3..9973df4ff56 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c @@ -37,10 +37,10 @@ static int gfs2_encode_fh(struct inode *inode, __u32 *p, int *len,  	if (parent && (*len < GFS2_LARGE_FH_SIZE)) {  		*len = GFS2_LARGE_FH_SIZE; -		return 255; +		return FILEID_INVALID;  	} else if (*len < GFS2_SMALL_FH_SIZE) {  		*len = GFS2_SMALL_FH_SIZE; -		return 255; +		return FILEID_INVALID;  	}  	fh[0] = cpu_to_be32(ip->i_no_formal_ino >> 32); diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 2687f50d98c..019f45e4509 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -157,7 +157,7 @@ static const u32 gfs2_to_fsflags[32] = {  static int gfs2_get_flags(struct file *filp, u32 __user *ptr)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct gfs2_inode *ip = GFS2_I(inode);  	struct gfs2_holder gh;  	int error; @@ -217,7 +217,7 @@ void gfs2_set_inode_flags(struct inode *inode)   */  static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct gfs2_inode *ip = GFS2_I(inode);  	struct gfs2_sbd *sdp = GFS2_SB(inode);  	struct buffer_head *bh; @@ -293,7 +293,7 @@ out_drop_write:  static int gfs2_set_flags(struct file *filp, u32 __user *ptr)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	u32 fsflags, gfsflags;  	if (get_user(fsflags, ptr)) @@ -336,7 +336,7 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  static void gfs2_size_hint(struct file *filep, loff_t offset, size_t size)  { -	struct inode *inode = filep->f_dentry->d_inode; +	struct inode *inode = file_inode(filep);  	struct gfs2_sbd *sdp = GFS2_SB(inode);  	struct gfs2_inode *ip = GFS2_I(inode);  	size_t blks = (size + sdp->sd_sb.sb_bsize - 1) >> sdp->sd_sb.sb_bsize_shift; @@ -386,7 +386,7 @@ static int gfs2_allocate_page_backing(struct page *page)  static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct page *page = vmf->page; -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	struct gfs2_inode *ip = GFS2_I(inode);  	struct gfs2_sbd *sdp = GFS2_SB(inode);  	unsigned long last_index; @@ -673,8 +673,7 @@ static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  {  	struct file *file = iocb->ki_filp;  	size_t writesize = iov_length(iov, nr_segs); -	struct dentry *dentry = file->f_dentry; -	struct gfs2_inode *ip = GFS2_I(dentry->d_inode); +	struct gfs2_inode *ip = GFS2_I(file_inode(file));  	int ret;  	ret = gfs2_rs_alloc(ip); @@ -772,7 +771,7 @@ static void calc_max_reserv(struct gfs2_inode *ip, loff_t max, loff_t *len,  static long gfs2_fallocate(struct file *file, int mode, loff_t offset,  			   loff_t len)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct gfs2_sbd *sdp = GFS2_SB(inode);  	struct gfs2_inode *ip = GFS2_I(inode);  	unsigned int data_blocks = 0, ind_blocks = 0, rblocks; @@ -938,7 +937,7 @@ static int do_flock(struct file *file, int cmd, struct file_lock *fl)  {  	struct gfs2_file *fp = file->private_data;  	struct gfs2_holder *fl_gh = &fp->f_fl_gh; -	struct gfs2_inode *ip = GFS2_I(file->f_path.dentry->d_inode); +	struct gfs2_inode *ip = GFS2_I(file_inode(file));  	struct gfs2_glock *gl;  	unsigned int state;  	int flags; diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 52c2aeaf45c..d1f51fd73f8 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -1257,7 +1257,7 @@ fail:  int gfs2_fitrim(struct file *filp, void __user *argp)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct gfs2_sbd *sdp = GFS2_SB(inode);  	struct request_queue *q = bdev_get_queue(sdp->sd_vfs->s_bdev);  	struct buffer_head *bh; diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 597a612834d..aa5c4804496 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c @@ -103,7 +103,7 @@ static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)  	int n = simple_strtol(buf, NULL, 0);  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	switch (n) {  	case 0: @@ -133,7 +133,7 @@ static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)  static ssize_t withdraw_store(struct gfs2_sbd *sdp, const char *buf, size_t len)  {  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	if (simple_strtol(buf, NULL, 0) != 1)  		return -EINVAL; @@ -148,7 +148,7 @@ static ssize_t statfs_sync_store(struct gfs2_sbd *sdp, const char *buf,  				 size_t len)  {  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	if (simple_strtol(buf, NULL, 0) != 1)  		return -EINVAL; @@ -161,7 +161,7 @@ static ssize_t quota_sync_store(struct gfs2_sbd *sdp, const char *buf,  				size_t len)  {  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	if (simple_strtol(buf, NULL, 0) != 1)  		return -EINVAL; @@ -178,7 +178,7 @@ static ssize_t quota_refresh_user_store(struct gfs2_sbd *sdp, const char *buf,  	u32 id;  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	id = simple_strtoul(buf, NULL, 0); @@ -198,7 +198,7 @@ static ssize_t quota_refresh_group_store(struct gfs2_sbd *sdp, const char *buf,  	u32 id;  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	id = simple_strtoul(buf, NULL, 0); @@ -221,7 +221,7 @@ static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len  	int rv;  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	rv = sscanf(buf, "%u:%llu %15s", &gltype, &glnum,  		    mode); @@ -532,7 +532,7 @@ static ssize_t quota_scale_store(struct gfs2_sbd *sdp, const char *buf,  	unsigned int x, y;  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	if (sscanf(buf, "%u %u", &x, &y) != 2 || !y)  		return -EINVAL; @@ -551,7 +551,7 @@ static ssize_t tune_set(struct gfs2_sbd *sdp, unsigned int *field,  	unsigned int x;  	if (!capable(CAP_SYS_ADMIN)) -		return -EACCES; +		return -EPERM;  	x = simple_strtoul(buf, NULL, 0); diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index 422dde2ec0a..5f7f1abd5f6 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c @@ -51,7 +51,7 @@ done:   */  static int hfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	int len, err;  	char strbuf[HFS_MAX_NAMELEN]; diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index d47f11658c1..3031dfdd235 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -128,7 +128,7 @@ static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb,  {  	struct file *file = iocb->ki_filp;  	struct address_space *mapping = file->f_mapping; -	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; +	struct inode *inode = file_inode(file)->i_mapping->host;  	ssize_t ret;  	ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c index 6b9f921ef2f..074e0458924 100644 --- a/fs/hfsplus/dir.c +++ b/fs/hfsplus/dir.c @@ -122,7 +122,7 @@ fail:  static int hfsplus_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	int len, err;  	char strbuf[HFSPLUS_MAX_STRLEN + 1]; diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index 799b336b59f..dcd05be5344 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -124,7 +124,7 @@ static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb,  {  	struct file *file = iocb->ki_filp;  	struct address_space *mapping = file->f_mapping; -	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; +	struct inode *inode = file_inode(file)->i_mapping->host;  	ssize_t ret;  	ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs, diff --git a/fs/hfsplus/ioctl.c b/fs/hfsplus/ioctl.c index 09addc8615f..e3c4c420942 100644 --- a/fs/hfsplus/ioctl.c +++ b/fs/hfsplus/ioctl.c @@ -59,7 +59,7 @@ static int hfsplus_ioctl_bless(struct file *file, int __user *user_flags)  static int hfsplus_ioctl_getflags(struct file *file, int __user *user_flags)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct hfsplus_inode_info *hip = HFSPLUS_I(inode);  	unsigned int flags = 0; @@ -75,7 +75,7 @@ static int hfsplus_ioctl_getflags(struct file *file, int __user *user_flags)  static int hfsplus_ioctl_setflags(struct file *file, int __user *user_flags)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct hfsplus_inode_info *hip = HFSPLUS_I(inode);  	unsigned int flags;  	int err = 0; diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 457addc5c91..fbabb906066 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -30,7 +30,7 @@ static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode)  	return list_entry(inode, struct hostfs_inode_info, vfs_inode);  } -#define FILE_HOSTFS_I(file) HOSTFS_I((file)->f_path.dentry->d_inode) +#define FILE_HOSTFS_I(file) HOSTFS_I(file_inode(file))  static int hostfs_d_delete(const struct dentry *dentry)  { @@ -861,14 +861,6 @@ int hostfs_setattr(struct dentry *dentry, struct iattr *attr)  }  static const struct inode_operations hostfs_iops = { -	.create		= hostfs_create, -	.link		= hostfs_link, -	.unlink		= hostfs_unlink, -	.symlink	= hostfs_symlink, -	.mkdir		= hostfs_mkdir, -	.rmdir		= hostfs_rmdir, -	.mknod		= hostfs_mknod, -	.rename		= hostfs_rename,  	.permission	= hostfs_permission,  	.setattr	= hostfs_setattr,  }; diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 78e12b2e0ea..546f6d39713 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c @@ -25,7 +25,7 @@ static loff_t hpfs_dir_lseek(struct file *filp, loff_t off, int whence)  	loff_t new_off = off + (whence == 1 ? filp->f_pos : 0);  	loff_t pos;  	struct quad_buffer_head qbh; -	struct inode *i = filp->f_path.dentry->d_inode; +	struct inode *i = file_inode(filp);  	struct hpfs_inode_info *hpfs_inode = hpfs_i(i);  	struct super_block *s = i->i_sb; @@ -57,7 +57,7 @@ fail:  static int hpfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct hpfs_inode_info *hpfs_inode = hpfs_i(inode);  	struct quad_buffer_head qbh;  	struct hpfs_dirent *de; diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index fbfe2df5624..9f9dbeceeee 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c @@ -152,7 +152,7 @@ static ssize_t hpfs_file_write(struct file *file, const char __user *buf,  	retval = do_sync_write(file, buf, count, ppos);  	if (retval > 0) {  		hpfs_lock(file->f_path.dentry->d_sb); -		hpfs_i(file->f_path.dentry->d_inode)->i_dirty = 1; +		hpfs_i(file_inode(file))->i_dirty = 1;  		hpfs_unlock(file->f_path.dentry->d_sb);  	}  	return retval; diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index 43b315f2002..74f55703be4 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c @@ -180,7 +180,7 @@ static ssize_t read_proc(struct file *file, char __user *buf, ssize_t count,  	ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);  	ssize_t n; -	read = file->f_path.dentry->d_inode->i_fop->read; +	read = file_inode(file)->i_fop->read;  	if (!is_user)  		set_fs(KERNEL_DS); @@ -288,7 +288,7 @@ static ssize_t hppfs_write(struct file *file, const char __user *buf,  	struct file *proc_file = data->proc_file;  	ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); -	write = proc_file->f_path.dentry->d_inode->i_fop->write; +	write = file_inode(proc_file)->i_fop->write;  	return (*write)(proc_file, buf, len, ppos);  } @@ -513,7 +513,7 @@ static loff_t hppfs_llseek(struct file *file, loff_t off, int where)  	loff_t (*llseek)(struct file *, loff_t, int);  	loff_t ret; -	llseek = proc_file->f_path.dentry->d_inode->i_fop->llseek; +	llseek = file_inode(proc_file)->i_fop->llseek;  	if (llseek != NULL) {  		ret = (*llseek)(proc_file, off, where);  		if (ret < 0) @@ -561,7 +561,7 @@ static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir)  				      });  	int err; -	readdir = proc_file->f_path.dentry->d_inode->i_fop->readdir; +	readdir = file_inode(proc_file)->i_fop->readdir;  	proc_file->f_pos = file->f_pos;  	err = (*readdir)(proc_file, &dirent, hppfs_filldir); diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 78bde32ea95..7f94e0cbc69 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -97,7 +97,7 @@ static void huge_pagevec_release(struct pagevec *pvec)  static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	loff_t len, vma_len;  	int ret;  	struct hstate *h = hstate_file(file); @@ -918,16 +918,25 @@ static int get_hstate_idx(int page_size_log)  	return h - hstates;  } +static char *hugetlb_dname(struct dentry *dentry, char *buffer, int buflen) +{ +	return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)", +				dentry->d_name.name); +} + +static struct dentry_operations anon_ops = { +	.d_dname = hugetlb_dname +}; +  struct file *hugetlb_file_setup(const char *name, unsigned long addr,  				size_t size, vm_flags_t acctflag,  				struct user_struct **user,  				int creat_flags, int page_size_log)  { -	int error = -ENOMEM; -	struct file *file; +	struct file *file = ERR_PTR(-ENOMEM);  	struct inode *inode;  	struct path path; -	struct dentry *root; +	struct super_block *sb;  	struct qstr quick_string;  	struct hstate *hstate;  	unsigned long num_pages; @@ -955,17 +964,18 @@ struct file *hugetlb_file_setup(const char *name, unsigned long addr,  		}  	} -	root = hugetlbfs_vfsmount[hstate_idx]->mnt_root; +	sb = hugetlbfs_vfsmount[hstate_idx]->mnt_sb;  	quick_string.name = name;  	quick_string.len = strlen(quick_string.name);  	quick_string.hash = 0; -	path.dentry = d_alloc(root, &quick_string); +	path.dentry = d_alloc_pseudo(sb, &quick_string);  	if (!path.dentry)  		goto out_shm_unlock; +	d_set_d_op(path.dentry, &anon_ops);  	path.mnt = mntget(hugetlbfs_vfsmount[hstate_idx]); -	error = -ENOSPC; -	inode = hugetlbfs_get_inode(root->d_sb, NULL, S_IFREG | S_IRWXUGO, 0); +	file = ERR_PTR(-ENOSPC); +	inode = hugetlbfs_get_inode(sb, NULL, S_IFREG | S_IRWXUGO, 0);  	if (!inode)  		goto out_dentry; @@ -973,7 +983,7 @@ struct file *hugetlb_file_setup(const char *name, unsigned long addr,  	size += addr & ~huge_page_mask(hstate);  	num_pages = ALIGN(size, huge_page_size(hstate)) >>  			huge_page_shift(hstate); -	error = -ENOMEM; +	file = ERR_PTR(-ENOMEM);  	if (hugetlb_reserve_pages(inode, 0, num_pages, NULL, acctflag))  		goto out_inode; @@ -981,10 +991,9 @@ struct file *hugetlb_file_setup(const char *name, unsigned long addr,  	inode->i_size = size;  	clear_nlink(inode); -	error = -ENFILE;  	file = alloc_file(&path, FMODE_WRITE | FMODE_READ,  			&hugetlbfs_file_operations); -	if (!file) +	if (IS_ERR(file))  		goto out_dentry; /* inode is already attached */  	return file; @@ -998,7 +1007,7 @@ out_shm_unlock:  		user_shm_unlock(size, *user);  		*user = NULL;  	} -	return ERR_PTR(error); +	return file;  }  static int __init init_hugetlbfs_fs(void) diff --git a/fs/inode.c b/fs/inode.c index 14084b72b25..67880e60439 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1655,7 +1655,7 @@ EXPORT_SYMBOL(file_remove_suid);  int file_update_time(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct timespec now;  	int sync_it = 0;  	int ret; diff --git a/fs/ioctl.c b/fs/ioctl.c index 3bdad6d1f26..fd507fb460f 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -175,7 +175,7 @@ static int ioctl_fiemap(struct file *filp, unsigned long arg)  	struct fiemap fiemap;  	struct fiemap __user *ufiemap = (struct fiemap __user *) arg;  	struct fiemap_extent_info fieinfo = { 0, }; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	u64 len;  	int error; @@ -424,7 +424,7 @@ EXPORT_SYMBOL(generic_block_fiemap);   */  int ioctl_preallocate(struct file *filp, void __user *argp)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct space_resv sr;  	if (copy_from_user(&sr, argp, sizeof(sr))) @@ -449,7 +449,7 @@ int ioctl_preallocate(struct file *filp, void __user *argp)  static int file_ioctl(struct file *filp, unsigned int cmd,  		unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int __user *p = (int __user *)arg;  	switch (cmd) { @@ -512,7 +512,7 @@ static int ioctl_fioasync(unsigned int fd, struct file *filp,  static int ioctl_fsfreeze(struct file *filp)  { -	struct super_block *sb = filp->f_path.dentry->d_inode->i_sb; +	struct super_block *sb = file_inode(filp)->i_sb;  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; @@ -527,7 +527,7 @@ static int ioctl_fsfreeze(struct file *filp)  static int ioctl_fsthaw(struct file *filp)  { -	struct super_block *sb = filp->f_path.dentry->d_inode->i_sb; +	struct super_block *sb = file_inode(filp)->i_sb;  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; @@ -548,7 +548,7 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,  {  	int error = 0;  	int __user *argp = (int __user *)arg; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	switch (cmd) {  	case FIOCLEX: diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c index 0b3fa7974fa..592e5115a56 100644 --- a/fs/isofs/compress.c +++ b/fs/isofs/compress.c @@ -296,7 +296,7 @@ static int zisofs_fill_pages(struct inode *inode, int full_page, int pcount,   */  static int zisofs_readpage(struct file *file, struct page *page)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct address_space *mapping = inode->i_mapping;  	int err;  	int i, pcount, full_page; diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c index f20437c068a..a7d5c3c3d4e 100644 --- a/fs/isofs/dir.c +++ b/fs/isofs/dir.c @@ -253,7 +253,7 @@ static int isofs_readdir(struct file *filp,  	int result;  	char *tmpname;  	struct iso_directory_record *tmpde; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	tmpname = (char *)__get_free_page(GFP_KERNEL);  	if (tmpname == NULL) diff --git a/fs/isofs/export.c b/fs/isofs/export.c index 2b4f2358ead..12088d8de3f 100644 --- a/fs/isofs/export.c +++ b/fs/isofs/export.c @@ -125,10 +125,10 @@ isofs_export_encode_fh(struct inode *inode,  	 */  	if (parent && (len < 5)) {  		*max_len = 5; -		return 255; +		return FILEID_INVALID;  	} else if (len < 3) {  		*max_len = 3; -		return 255; +		return FILEID_INVALID;  	}  	len = 3; diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index ad7774d3209..acd46a4160c 100644 --- a/fs/jffs2/dir.c +++ b/fs/jffs2/dir.c @@ -117,12 +117,12 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,  static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)  {  	struct jffs2_inode_info *f; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct jffs2_full_dirent *fd;  	unsigned long offset, curofs;  	jffs2_dbg(1, "jffs2_readdir() for dir_i #%lu\n", -		  filp->f_path.dentry->d_inode->i_ino); +		  file_inode(filp)->i_ino);  	f = JFFS2_INODE_INFO(inode); diff --git a/fs/jfs/ioctl.c b/fs/jfs/ioctl.c index bc555ff417e..93a1232894f 100644 --- a/fs/jfs/ioctl.c +++ b/fs/jfs/ioctl.c @@ -58,7 +58,7 @@ static long jfs_map_ext2(unsigned long flags, int from)  long jfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct jfs_inode_info *jfs_inode = JFS_IP(inode);  	unsigned int flags; diff --git a/fs/jfs/jfs_dtree.c b/fs/jfs/jfs_dtree.c index 9197a1b0d02..0ddbeceafc6 100644 --- a/fs/jfs/jfs_dtree.c +++ b/fs/jfs/jfs_dtree.c @@ -3004,7 +3004,7 @@ static inline struct jfs_dirent *next_jfs_dirent(struct jfs_dirent *dirent)   */  int jfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *ip = filp->f_path.dentry->d_inode; +	struct inode *ip = file_inode(filp);  	struct nls_table *codepage = JFS_SBI(ip->i_sb)->nls_tab;  	int rc = 0;  	loff_t dtpos;	/* legacy OS/2 style position */ diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index ca0a0800144..a2717408c47 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c @@ -178,7 +178,7 @@ __be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock)  			continue;  		if (!rpc_cmp_addr(nlm_addr(block->b_host), addr))  			continue; -		if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0) +		if (nfs_compare_fh(NFS_FH(file_inode(fl_blocked->fl_file)) ,fh) != 0)  			continue;  		/* Alright, we found a lock. Set the return status  		 * and wake up the caller diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index 52e5120bb15..366277190b8 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c @@ -127,7 +127,7 @@ static void nlmclnt_setlockargs(struct nlm_rqst *req, struct file_lock *fl)  	struct nlm_lock	*lock = &argp->lock;  	nlmclnt_next_cookie(&argp->cookie); -	memcpy(&lock->fh, NFS_FH(fl->fl_file->f_path.dentry->d_inode), sizeof(struct nfs_fh)); +	memcpy(&lock->fh, NFS_FH(file_inode(fl->fl_file)), sizeof(struct nfs_fh));  	lock->caller  = utsname()->nodename;  	lock->oh.data = req->a_owner;  	lock->oh.len  = snprintf(req->a_owner, sizeof(req->a_owner), "%u@%s", diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index 8d80c990dff..e703318c41d 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c @@ -406,8 +406,8 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,  	__be32			ret;  	dprintk("lockd: nlmsvc_lock(%s/%ld, ty=%d, pi=%d, %Ld-%Ld, bl=%d)\n", -				file->f_file->f_path.dentry->d_inode->i_sb->s_id, -				file->f_file->f_path.dentry->d_inode->i_ino, +				file_inode(file->f_file)->i_sb->s_id, +				file_inode(file->f_file)->i_ino,  				lock->fl.fl_type, lock->fl.fl_pid,  				(long long)lock->fl.fl_start,  				(long long)lock->fl.fl_end, @@ -513,8 +513,8 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,  	__be32			ret;  	dprintk("lockd: nlmsvc_testlock(%s/%ld, ty=%d, %Ld-%Ld)\n", -				file->f_file->f_path.dentry->d_inode->i_sb->s_id, -				file->f_file->f_path.dentry->d_inode->i_ino, +				file_inode(file->f_file)->i_sb->s_id, +				file_inode(file->f_file)->i_ino,  				lock->fl.fl_type,  				(long long)lock->fl.fl_start,  				(long long)lock->fl.fl_end); @@ -606,8 +606,8 @@ nlmsvc_unlock(struct net *net, struct nlm_file *file, struct nlm_lock *lock)  	int	error;  	dprintk("lockd: nlmsvc_unlock(%s/%ld, pi=%d, %Ld-%Ld)\n", -				file->f_file->f_path.dentry->d_inode->i_sb->s_id, -				file->f_file->f_path.dentry->d_inode->i_ino, +				file_inode(file->f_file)->i_sb->s_id, +				file_inode(file->f_file)->i_ino,  				lock->fl.fl_pid,  				(long long)lock->fl.fl_start,  				(long long)lock->fl.fl_end); @@ -635,8 +635,8 @@ nlmsvc_cancel_blocked(struct net *net, struct nlm_file *file, struct nlm_lock *l  	int status = 0;  	dprintk("lockd: nlmsvc_cancel(%s/%ld, pi=%d, %Ld-%Ld)\n", -				file->f_file->f_path.dentry->d_inode->i_sb->s_id, -				file->f_file->f_path.dentry->d_inode->i_ino, +				file_inode(file->f_file)->i_sb->s_id, +				file_inode(file->f_file)->i_ino,  				lock->fl.fl_pid,  				(long long)lock->fl.fl_start,  				(long long)lock->fl.fl_end); diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index 0deb5f6c9dd..b3a24b07d98 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c @@ -45,7 +45,7 @@ static inline void nlm_debug_print_fh(char *msg, struct nfs_fh *f)  static inline void nlm_debug_print_file(char *msg, struct nlm_file *file)  { -	struct inode *inode = file->f_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file->f_file);  	dprintk("lockd: %s %s/%ld\n",  		msg, inode->i_sb->s_id, inode->i_ino); diff --git a/fs/locks.c b/fs/locks.c index a94e331a52a..cb424a4fed7 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -334,7 +334,7 @@ static int flock_to_posix_lock(struct file *filp, struct file_lock *fl,  		start = filp->f_pos;  		break;  	case SEEK_END: -		start = i_size_read(filp->f_path.dentry->d_inode); +		start = i_size_read(file_inode(filp));  		break;  	default:  		return -EINVAL; @@ -384,7 +384,7 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl,  		start = filp->f_pos;  		break;  	case SEEK_END: -		start = i_size_read(filp->f_path.dentry->d_inode); +		start = i_size_read(file_inode(filp));  		break;  	default:  		return -EINVAL; @@ -627,7 +627,7 @@ posix_test_lock(struct file *filp, struct file_lock *fl)  	struct file_lock *cfl;  	lock_flocks(); -	for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) { +	for (cfl = file_inode(filp)->i_flock; cfl; cfl = cfl->fl_next) {  		if (!IS_POSIX(cfl))  			continue;  		if (posix_locks_conflict(fl, cfl)) @@ -708,7 +708,7 @@ static int flock_lock_file(struct file *filp, struct file_lock *request)  {  	struct file_lock *new_fl = NULL;  	struct file_lock **before; -	struct inode * inode = filp->f_path.dentry->d_inode; +	struct inode * inode = file_inode(filp);  	int error = 0;  	int found = 0; @@ -1002,7 +1002,7 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str  int posix_lock_file(struct file *filp, struct file_lock *fl,  			struct file_lock *conflock)  { -	return __posix_lock_file(filp->f_path.dentry->d_inode, fl, conflock); +	return __posix_lock_file(file_inode(filp), fl, conflock);  }  EXPORT_SYMBOL(posix_lock_file); @@ -1326,8 +1326,8 @@ int fcntl_getlease(struct file *filp)  	int type = F_UNLCK;  	lock_flocks(); -	time_out_leases(filp->f_path.dentry->d_inode); -	for (fl = filp->f_path.dentry->d_inode->i_flock; fl && IS_LEASE(fl); +	time_out_leases(file_inode(filp)); +	for (fl = file_inode(filp)->i_flock; fl && IS_LEASE(fl);  			fl = fl->fl_next) {  		if (fl->fl_file == filp) {  			type = target_leasetype(fl); @@ -1843,7 +1843,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,  	if (copy_from_user(&flock, l, sizeof(flock)))  		goto out; -	inode = filp->f_path.dentry->d_inode; +	inode = file_inode(filp);  	/* Don't allow mandatory locks on files that may be memory mapped  	 * and shared. @@ -1961,7 +1961,7 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,  	if (copy_from_user(&flock, l, sizeof(flock)))  		goto out; -	inode = filp->f_path.dentry->d_inode; +	inode = file_inode(filp);  	/* Don't allow mandatory locks on files that may be memory mapped  	 * and shared. @@ -2030,7 +2030,7 @@ void locks_remove_posix(struct file *filp, fl_owner_t owner)  	 * posix_lock_file().  Another process could be setting a lock on this  	 * file at the same time, but we wouldn't remove that lock anyway.  	 */ -	if (!filp->f_path.dentry->d_inode->i_flock) +	if (!file_inode(filp)->i_flock)  		return;  	lock.fl_type = F_UNLCK; @@ -2056,7 +2056,7 @@ EXPORT_SYMBOL(locks_remove_posix);   */  void locks_remove_flock(struct file *filp)  { -	struct inode * inode = filp->f_path.dentry->d_inode; +	struct inode * inode = file_inode(filp);  	struct file_lock *fl;  	struct file_lock **before; @@ -2152,7 +2152,7 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl,  		fl_pid = fl->fl_pid;  	if (fl->fl_file != NULL) -		inode = fl->fl_file->f_path.dentry->d_inode; +		inode = file_inode(fl->fl_file);  	seq_printf(f, "%lld:%s ", id, pfx);  	if (IS_POSIX(fl)) { diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c index 26e4a941532..b8275108211 100644 --- a/fs/logfs/dir.c +++ b/fs/logfs/dir.c @@ -284,7 +284,7 @@ static int logfs_rmdir(struct inode *dir, struct dentry *dentry)  #define IMPLICIT_NODES 2  static int __logfs_readdir(struct file *file, void *buf, filldir_t filldir)  { -	struct inode *dir = file->f_dentry->d_inode; +	struct inode *dir = file_inode(file);  	loff_t pos = file->f_pos - IMPLICIT_NODES;  	struct page *page;  	struct logfs_disk_dentry *dd; @@ -320,7 +320,7 @@ static int __logfs_readdir(struct file *file, void *buf, filldir_t filldir)  static int logfs_readdir(struct file *file, void *buf, filldir_t filldir)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	ino_t pino = parent_ino(file->f_dentry);  	int err; diff --git a/fs/logfs/file.c b/fs/logfs/file.c index 3886cded283..c2219a6dd3c 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c @@ -183,7 +183,7 @@ static int logfs_releasepage(struct page *page, gfp_t only_xfs_uses_this)  long logfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct logfs_inode *li = logfs_inode(inode);  	unsigned int oldflags, flags;  	int err; diff --git a/fs/minix/dir.c b/fs/minix/dir.c index 685b2d981b8..a9ed6f36e6e 100644 --- a/fs/minix/dir.c +++ b/fs/minix/dir.c @@ -85,7 +85,7 @@ static inline void *minix_next_entry(void *de, struct minix_sb_info *sbi)  static int minix_readdir(struct file * filp, void * dirent, filldir_t filldir)  {  	unsigned long pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	unsigned offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT; diff --git a/fs/namei.c b/fs/namei.c index 43a97ee1d4c..dc984fee553 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -600,14 +600,10 @@ static int complete_walk(struct nameidata *nd)  	if (likely(!(nd->flags & LOOKUP_JUMPED)))  		return 0; -	if (likely(!(dentry->d_flags & DCACHE_OP_REVALIDATE))) +	if (likely(!(dentry->d_flags & DCACHE_OP_WEAK_REVALIDATE)))  		return 0; -	if (likely(!(dentry->d_sb->s_type->fs_flags & FS_REVAL_DOT))) -		return 0; - -	/* Note: we do not d_invalidate() */ -	status = d_revalidate(dentry, nd->flags); +	status = dentry->d_op->d_weak_revalidate(dentry, nd->flags);  	if (status > 0)  		return 0; @@ -1342,7 +1338,7 @@ static struct dentry *__lookup_hash(struct qstr *name,   *  small and for now I'd prefer to have fast path as straight as possible.   *  It _is_ time-critical.   */ -static int lookup_fast(struct nameidata *nd, struct qstr *name, +static int lookup_fast(struct nameidata *nd,  		       struct path *path, struct inode **inode)  {  	struct vfsmount *mnt = nd->path.mnt; @@ -1358,7 +1354,7 @@ static int lookup_fast(struct nameidata *nd, struct qstr *name,  	 */  	if (nd->flags & LOOKUP_RCU) {  		unsigned seq; -		dentry = __d_lookup_rcu(parent, name, &seq, nd->inode); +		dentry = __d_lookup_rcu(parent, &nd->last, &seq, nd->inode);  		if (!dentry)  			goto unlazy; @@ -1400,7 +1396,7 @@ unlazy:  		if (unlazy_walk(nd, dentry))  			return -ECHILD;  	} else { -		dentry = __d_lookup(parent, name); +		dentry = __d_lookup(parent, &nd->last);  	}  	if (unlikely(!dentry)) @@ -1436,8 +1432,7 @@ need_lookup:  }  /* Fast lookup failed, do it the slow way */ -static int lookup_slow(struct nameidata *nd, struct qstr *name, -		       struct path *path) +static int lookup_slow(struct nameidata *nd, struct path *path)  {  	struct dentry *dentry, *parent;  	int err; @@ -1446,7 +1441,7 @@ static int lookup_slow(struct nameidata *nd, struct qstr *name,  	BUG_ON(nd->inode != parent->d_inode);  	mutex_lock(&parent->d_inode->i_mutex); -	dentry = __lookup_hash(name, parent, nd->flags); +	dentry = __lookup_hash(&nd->last, parent, nd->flags);  	mutex_unlock(&parent->d_inode->i_mutex);  	if (IS_ERR(dentry))  		return PTR_ERR(dentry); @@ -1519,7 +1514,7 @@ static inline int should_follow_link(struct inode *inode, int follow)  }  static inline int walk_component(struct nameidata *nd, struct path *path, -		struct qstr *name, int type, int follow) +		int follow)  {  	struct inode *inode;  	int err; @@ -1528,14 +1523,14 @@ static inline int walk_component(struct nameidata *nd, struct path *path,  	 * to be able to know about the current root directory and  	 * parent relationships.  	 */ -	if (unlikely(type != LAST_NORM)) -		return handle_dots(nd, type); -	err = lookup_fast(nd, name, path, &inode); +	if (unlikely(nd->last_type != LAST_NORM)) +		return handle_dots(nd, nd->last_type); +	err = lookup_fast(nd, path, &inode);  	if (unlikely(err)) {  		if (err < 0)  			goto out_err; -		err = lookup_slow(nd, name, path); +		err = lookup_slow(nd, path);  		if (err < 0)  			goto out_err; @@ -1594,8 +1589,7 @@ static inline int nested_symlink(struct path *path, struct nameidata *nd)  		res = follow_link(&link, nd, &cookie);  		if (res)  			break; -		res = walk_component(nd, path, &nd->last, -				     nd->last_type, LOOKUP_FOLLOW); +		res = walk_component(nd, path, LOOKUP_FOLLOW);  		put_link(nd, &link, cookie);  	} while (res > 0); @@ -1802,8 +1796,11 @@ static int link_path_walk(const char *name, struct nameidata *nd)  			}  		} +		nd->last = this; +		nd->last_type = type; +  		if (!name[len]) -			goto last_component; +			return 0;  		/*  		 * If it wasn't NUL, we know it was '/'. Skip that  		 * slash, and continue until no more slashes. @@ -1812,10 +1809,11 @@ static int link_path_walk(const char *name, struct nameidata *nd)  			len++;  		} while (unlikely(name[len] == '/'));  		if (!name[len]) -			goto last_component; +			return 0; +  		name += len; -		err = walk_component(nd, &next, &this, type, LOOKUP_FOLLOW); +		err = walk_component(nd, &next, LOOKUP_FOLLOW);  		if (err < 0)  			return err; @@ -1824,16 +1822,10 @@ static int link_path_walk(const char *name, struct nameidata *nd)  			if (err)  				return err;  		} -		if (can_lookup(nd->inode)) -			continue; -		err = -ENOTDIR;  -		break; -		/* here ends the main loop */ - -last_component: -		nd->last = this; -		nd->last_type = type; -		return 0; +		if (!can_lookup(nd->inode)) { +			err = -ENOTDIR;  +			break; +		}  	}  	terminate_walk(nd);  	return err; @@ -1932,8 +1924,7 @@ static inline int lookup_last(struct nameidata *nd, struct path *path)  		nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;  	nd->flags &= ~LOOKUP_PARENT; -	return walk_component(nd, path, &nd->last, nd->last_type, -					nd->flags & LOOKUP_FOLLOW); +	return walk_component(nd, path, nd->flags & LOOKUP_FOLLOW);  }  /* Returns 0 and nd will be valid on success; Retuns error, otherwise. */ @@ -2732,7 +2723,7 @@ static int do_last(struct nameidata *nd, struct path *path,  		if (open_flag & O_PATH && !(nd->flags & LOOKUP_FOLLOW))  			symlink_ok = true;  		/* we _can_ be in RCU mode here */ -		error = lookup_fast(nd, &nd->last, path, &inode); +		error = lookup_fast(nd, path, &inode);  		if (likely(!error))  			goto finish_lookup; @@ -2778,7 +2769,7 @@ retry_lookup:  			goto out;  		if ((*opened & FILE_CREATED) || -		    !S_ISREG(file->f_path.dentry->d_inode->i_mode)) +		    !S_ISREG(file_inode(file)->i_mode))  			will_truncate = false;  		audit_inode(name, file->f_path.dentry, 0); @@ -2941,8 +2932,8 @@ static struct file *path_openat(int dfd, struct filename *pathname,  	int error;  	file = get_empty_filp(); -	if (!file) -		return ERR_PTR(-ENFILE); +	if (IS_ERR(file)) +		return file;  	file->f_flags = op->open_flag; diff --git a/fs/namespace.c b/fs/namespace.c index edac42c6eff..50ca17d3cb4 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -384,7 +384,7 @@ EXPORT_SYMBOL_GPL(mnt_clone_write);   */  int __mnt_want_write_file(struct file *file)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	if (!(file->f_mode & FMODE_WRITE) || special_file(inode->i_mode))  		return __mnt_want_write(file->f_path.mnt); @@ -1300,24 +1300,6 @@ SYSCALL_DEFINE1(oldumount, char __user *, name)  #endif -static int mount_is_safe(struct path *path) -{ -	if (may_mount()) -		return 0; -	return -EPERM; -#ifdef notyet -	if (S_ISLNK(path->dentry->d_inode->i_mode)) -		return -EPERM; -	if (path->dentry->d_inode->i_mode & S_ISVTX) { -		if (current_uid() != path->dentry->d_inode->i_uid) -			return -EPERM; -	} -	if (inode_permission(path->dentry->d_inode, MAY_WRITE)) -		return -EPERM; -	return 0; -#endif -} -  static bool mnt_ns_loop(struct path *path)  {  	/* Could bind mounting the mount namespace inode cause a @@ -1640,9 +1622,6 @@ static int do_change_type(struct path *path, int flag)  	int type;  	int err = 0; -	if (!may_mount()) -		return -EPERM; -  	if (path->dentry != path->mnt->mnt_root)  		return -EINVAL; @@ -1676,9 +1655,7 @@ static int do_loopback(struct path *path, const char *old_name,  	LIST_HEAD(umount_list);  	struct path old_path;  	struct mount *mnt = NULL, *old; -	int err = mount_is_safe(path); -	if (err) -		return err; +	int err;  	if (!old_name || !*old_name)  		return -EINVAL;  	err = kern_path(old_name, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &old_path); @@ -1755,9 +1732,6 @@ static int do_remount(struct path *path, int flags, int mnt_flags,  	struct super_block *sb = path->mnt->mnt_sb;  	struct mount *mnt = real_mount(path->mnt); -	if (!capable(CAP_SYS_ADMIN)) -		return -EPERM; -  	if (!check_mnt(mnt))  		return -EINVAL; @@ -1771,6 +1745,8 @@ static int do_remount(struct path *path, int flags, int mnt_flags,  	down_write(&sb->s_umount);  	if (flags & MS_BIND)  		err = change_mount_flags(path->mnt, flags); +	else if (!capable(CAP_SYS_ADMIN)) +		err = -EPERM;  	else  		err = do_remount_sb(sb, flags, data, 0);  	if (!err) { @@ -1803,9 +1779,7 @@ static int do_move_mount(struct path *path, const char *old_name)  	struct path old_path, parent_path;  	struct mount *p;  	struct mount *old; -	int err = 0; -	if (!may_mount()) -		return -EPERM; +	int err;  	if (!old_name || !*old_name)  		return -EINVAL;  	err = kern_path(old_name, LOOKUP_FOLLOW, &old_path); @@ -1947,9 +1921,6 @@ static int do_new_mount(struct path *path, const char *fstype, int flags,  	if (!fstype)  		return -EINVAL; -	if (!may_mount()) -		return -EPERM; -  	type = get_fs_type(fstype);  	if (!type)  		return -ENODEV; @@ -2263,6 +2234,9 @@ long do_mount(const char *dev_name, const char *dir_name,  	if (retval)  		goto dput_out; +	if (!may_mount()) +		return -EPERM; +  	/* Default to relatime unless overriden */  	if (!(flags & MS_NOATIME))  		mnt_flags |= MNT_RELATIME; diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 4117e7b377b..81632609365 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c @@ -593,14 +593,10 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir,  		return 1; /* I'm not sure */  	qname.name = __name; -	qname.hash = full_name_hash(qname.name, qname.len); - -	if (dentry->d_op && dentry->d_op->d_hash) -		if (dentry->d_op->d_hash(dentry, dentry->d_inode, &qname) != 0) -			goto end_advance; - -	newdent = d_lookup(dentry, &qname); +	newdent = d_hash_and_lookup(dentry, &qname); +	if (unlikely(IS_ERR(newdent))) +		goto end_advance;  	if (!newdent) {  		newdent = d_alloc(dentry, &qname);  		if (!newdent) diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index e2be336d1c2..7dafd6899a6 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -538,7 +538,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)  	if (!ncp_filp)  		goto out;  	error = -ENOTSOCK; -	sock_inode = ncp_filp->f_path.dentry->d_inode; +	sock_inode = file_inode(ncp_filp);  	if (!S_ISSOCK(sock_inode->i_mode))  		goto out_fput;  	sock = SOCKET_I(sock_inode); @@ -577,7 +577,7 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent)  		if (!server->info_filp)  			goto out_bdi;  		error = -ENOTSOCK; -		sock_inode = server->info_filp->f_path.dentry->d_inode; +		sock_inode = file_inode(server->info_filp);  		if (!S_ISSOCK(sock_inode->i_mode))  			goto out_fput2;  		info_sock = SOCKET_I(sock_inode); diff --git a/fs/ncpfs/ioctl.c b/fs/ncpfs/ioctl.c index d44318d2750..60426ccb3b6 100644 --- a/fs/ncpfs/ioctl.c +++ b/fs/ncpfs/ioctl.c @@ -811,7 +811,7 @@ outrel:  long ncp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ncp_server *server = NCP_SERVER(inode);  	kuid_t uid = current_uid();  	int need_drop_write = 0; @@ -822,7 +822,7 @@ long ncp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  	case NCP_IOC_CONN_LOGGED_IN:  	case NCP_IOC_SETROOT:  		if (!capable(CAP_SYS_ADMIN)) { -			ret = -EACCES; +			ret = -EPERM;  			goto out;  		}  		break; diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c index 63d14a99483..ee24df5af1f 100644 --- a/fs/ncpfs/mmap.c +++ b/fs/ncpfs/mmap.c @@ -105,7 +105,7 @@ static const struct vm_operations_struct ncp_file_mmap =  /* This is used for a general mmap of a ncp file */  int ncp_mmap(struct file *file, struct vm_area_struct *vma)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	DPRINTK("ncp_mmap: called\n"); diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 1b2d7eb9379..f23f455be42 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -281,7 +281,7 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des  	for (i = 0; i < array->size; i++) {  		if (array->array[i].cookie == *desc->dir_cookie) { -			struct nfs_inode *nfsi = NFS_I(desc->file->f_path.dentry->d_inode); +			struct nfs_inode *nfsi = NFS_I(file_inode(desc->file));  			struct nfs_open_dir_context *ctx = desc->file->private_data;  			new_pos = desc->current_index + i; @@ -629,7 +629,7 @@ out:  static  int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page)  { -	struct inode	*inode = desc->file->f_path.dentry->d_inode; +	struct inode	*inode = file_inode(desc->file);  	int ret;  	ret = nfs_readdir_xdr_to_array(desc, page, inode); @@ -660,7 +660,7 @@ void cache_page_release(nfs_readdir_descriptor_t *desc)  static  struct page *get_cache_page(nfs_readdir_descriptor_t *desc)  { -	return read_cache_page(desc->file->f_path.dentry->d_inode->i_mapping, +	return read_cache_page(file_inode(desc->file)->i_mapping,  			desc->page_index, (filler_t *)nfs_readdir_filler, desc);  } @@ -764,7 +764,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,  {  	struct page	*page = NULL;  	int		status; -	struct inode *inode = desc->file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(desc->file);  	struct nfs_open_dir_context *ctx = desc->file->private_data;  	dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n", @@ -1136,6 +1136,45 @@ out_error:  }  /* + * A weaker form of d_revalidate for revalidating just the dentry->d_inode + * when we don't really care about the dentry name. This is called when a + * pathwalk ends on a dentry that was not found via a normal lookup in the + * parent dir (e.g.: ".", "..", procfs symlinks or mountpoint traversals). + * + * In this situation, we just want to verify that the inode itself is OK + * since the dentry might have changed on the server. + */ +static int nfs_weak_revalidate(struct dentry *dentry, unsigned int flags) +{ +	int error; +	struct inode *inode = dentry->d_inode; + +	/* +	 * I believe we can only get a negative dentry here in the case of a +	 * procfs-style symlink. Just assume it's correct for now, but we may +	 * eventually need to do something more here. +	 */ +	if (!inode) { +		dfprintk(LOOKUPCACHE, "%s: %s/%s has negative inode\n", +				__func__, dentry->d_parent->d_name.name, +				dentry->d_name.name); +		return 1; +	} + +	if (is_bad_inode(inode)) { +		dfprintk(LOOKUPCACHE, "%s: %s/%s has dud inode\n", +				__func__, dentry->d_parent->d_name.name, +				dentry->d_name.name); +		return 0; +	} + +	error = nfs_revalidate_inode(NFS_SERVER(inode), inode); +	dfprintk(LOOKUPCACHE, "NFS: %s: inode %lu is %s\n", +			__func__, inode->i_ino, error ? "invalid" : "valid"); +	return !error; +} + +/*   * This is called from dput() when d_count is going to 0.   */  static int nfs_dentry_delete(const struct dentry *dentry) @@ -1202,6 +1241,7 @@ static void nfs_d_release(struct dentry *dentry)  const struct dentry_operations nfs_dentry_operations = {  	.d_revalidate	= nfs_lookup_revalidate, +	.d_weak_revalidate	= nfs_weak_revalidate,  	.d_delete	= nfs_dentry_delete,  	.d_iput		= nfs_dentry_iput,  	.d_automount	= nfs_d_automount, diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 3c2b893665b..29f4a48a0ee 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -292,7 +292,7 @@ static int  nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)  {  	int ret; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	do {  		ret = filemap_write_and_wait_range(inode->i_mapping, start, end); diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index b9623d19d59..dc0f98dfa71 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c @@ -765,7 +765,7 @@ out:  static ssize_t  idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)  { -	struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode); +	struct rpc_inode *rpci = RPC_I(file_inode(filp));  	struct idmap *idmap = (struct idmap *)rpci->private;  	struct key_construction *cons;  	struct idmap_msg im; diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 468ba8bf0f5..b586fe9af47 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -711,7 +711,7 @@ EXPORT_SYMBOL_GPL(put_nfs_open_context);   */  void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct nfs_inode *nfsi = NFS_I(inode);  	filp->private_data = get_nfs_open_context(ctx); @@ -744,7 +744,7 @@ struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_c  static void nfs_file_clear_open_context(struct file *filp)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct nfs_open_context *ctx = nfs_file_open_context(filp);  	if (ctx) { diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index 70efb63b1e4..43ea96ced28 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c @@ -872,7 +872,7 @@ static void nfs3_proc_commit_setup(struct nfs_commit_data *data, struct rpc_mess  static int  nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl);  } diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 08ddcccb888..13e6bb3e3fe 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -94,7 +94,7 @@ static int  nfs4_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)  {  	int ret; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	do {  		ret = filemap_write_and_wait_range(inode->i_mapping, start, end); diff --git a/fs/nfs/nfs4super.c b/fs/nfs/nfs4super.c index 84d2e9e2f31..569b166cc05 100644 --- a/fs/nfs/nfs4super.c +++ b/fs/nfs/nfs4super.c @@ -28,7 +28,7 @@ static struct file_system_type nfs4_remote_fs_type = {  	.name		= "nfs4",  	.mount		= nfs4_remote_mount,  	.kill_sb	= nfs_kill_super, -	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, +	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  static struct file_system_type nfs4_remote_referral_fs_type = { @@ -36,7 +36,7 @@ static struct file_system_type nfs4_remote_referral_fs_type = {  	.name		= "nfs4",  	.mount		= nfs4_remote_referral_mount,  	.kill_sb	= nfs_kill_super, -	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, +	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  struct file_system_type nfs4_referral_fs_type = { @@ -44,7 +44,7 @@ struct file_system_type nfs4_referral_fs_type = {  	.name		= "nfs4",  	.mount		= nfs4_referral_mount,  	.kill_sb	= nfs_kill_super, -	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, +	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  static const struct super_operations nfs4_sops = { diff --git a/fs/nfs/proc.c b/fs/nfs/proc.c index f084dac948e..fc8de9016ac 100644 --- a/fs/nfs/proc.c +++ b/fs/nfs/proc.c @@ -662,7 +662,7 @@ nfs_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg)  static int  nfs_proc_lock(struct file *filp, int cmd, struct file_lock *fl)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl);  } diff --git a/fs/nfs/super.c b/fs/nfs/super.c index befbae0cce4..a9dc5fc2995 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -291,7 +291,7 @@ struct file_system_type nfs_fs_type = {  	.name		= "nfs",  	.mount		= nfs_fs_mount,  	.kill_sb	= nfs_kill_super, -	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, +	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  EXPORT_SYMBOL_GPL(nfs_fs_type); @@ -300,7 +300,7 @@ struct file_system_type nfs_xdev_fs_type = {  	.name		= "nfs",  	.mount		= nfs_xdev_mount,  	.kill_sb	= nfs_kill_super, -	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, +	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  const struct super_operations nfs_sops = { @@ -330,7 +330,7 @@ struct file_system_type nfs4_fs_type = {  	.name		= "nfs4",  	.mount		= nfs_fs_mount,  	.kill_sb	= nfs_kill_super, -	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, +	.fs_flags	= FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,  };  EXPORT_SYMBOL_GPL(nfs4_fs_type); diff --git a/fs/nfsd/fault_inject.c b/fs/nfsd/fault_inject.c index e761ee95617..497584c7036 100644 --- a/fs/nfsd/fault_inject.c +++ b/fs/nfsd/fault_inject.c @@ -101,7 +101,7 @@ static ssize_t fault_inject_read(struct file *file, char __user *buf,  	loff_t pos = *ppos;  	if (!pos) -		nfsd_inject_get(file->f_dentry->d_inode->i_private, &val); +		nfsd_inject_get(file_inode(file)->i_private, &val);  	size = scnprintf(read_buf, sizeof(read_buf), "%llu\n", val);  	if (pos < 0) @@ -133,10 +133,10 @@ static ssize_t fault_inject_write(struct file *file, const char __user *buf,  	size = rpc_pton(net, write_buf, size, (struct sockaddr *)&sa, sizeof(sa));  	if (size > 0) -		nfsd_inject_set_client(file->f_dentry->d_inode->i_private, &sa, size); +		nfsd_inject_set_client(file_inode(file)->i_private, &sa, size);  	else {  		val = simple_strtoll(write_buf, NULL, 0); -		nfsd_inject_set(file->f_dentry->d_inode->i_private, val); +		nfsd_inject_set(file_inode(file)->i_private, val);  	}  	return len; /* on success, claim we got the whole input */  } diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c index 9170861c804..95d76dc6c5d 100644 --- a/fs/nfsd/nfs2acl.c +++ b/fs/nfsd/nfs2acl.c @@ -45,6 +45,10 @@ static __be32 nfsacld_proc_getacl(struct svc_rqst * rqstp,  		RETURN_STATUS(nfserr_inval);  	resp->mask = argp->mask; +	nfserr = fh_getattr(fh, &resp->stat); +	if (nfserr) +		goto fail; +  	if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {  		acl = nfsd_get_posix_acl(fh, ACL_TYPE_ACCESS);  		if (IS_ERR(acl)) { @@ -115,6 +119,9 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,  		nfserr = nfserrno( nfsd_set_posix_acl(  			fh, ACL_TYPE_DEFAULT, argp->acl_default) );  	} +	if (!nfserr) { +		nfserr = fh_getattr(fh, &resp->stat); +	}  	/* argp->acl_{access,default} may have been allocated in  	   nfssvc_decode_setaclargs. */ @@ -129,10 +136,15 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,  static __be32 nfsacld_proc_getattr(struct svc_rqst * rqstp,  		struct nfsd_fhandle *argp, struct nfsd_attrstat *resp)  { +	__be32 nfserr;  	dprintk("nfsd: GETATTR  %s\n", SVCFH_fmt(&argp->fh));  	fh_copy(&resp->fh, &argp->fh); -	return fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP); +	nfserr = fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP); +	if (nfserr) +		return nfserr; +	nfserr = fh_getattr(&resp->fh, &resp->stat); +	return nfserr;  }  /* @@ -150,6 +162,9 @@ static __be32 nfsacld_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessarg  	fh_copy(&resp->fh, &argp->fh);  	resp->access = argp->access;  	nfserr = nfsd_access(rqstp, &resp->fh, &resp->access, NULL); +	if (nfserr) +		return nfserr; +	nfserr = fh_getattr(&resp->fh, &resp->stat);  	return nfserr;  } @@ -243,7 +258,7 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,  		return 0;  	inode = dentry->d_inode; -	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh); +	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);  	*p++ = htonl(resp->mask);  	if (!xdr_ressize_check(rqstp, p))  		return 0; @@ -274,7 +289,7 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,  static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p,  		struct nfsd_attrstat *resp)  { -	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh); +	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);  	return xdr_ressize_check(rqstp, p);  } @@ -282,7 +297,7 @@ static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p,  static int nfsaclsvc_encode_accessres(struct svc_rqst *rqstp, __be32 *p,  		struct nfsd3_accessres *resp)  { -	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh); +	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);  	*p++ = htonl(resp->access);  	return xdr_ressize_check(rqstp, p);  } diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index 1fc02dfdc5c..40128991313 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -43,7 +43,6 @@ static __be32  nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,  					   struct nfsd3_attrstat *resp)  { -	int	err;  	__be32	nfserr;  	dprintk("nfsd: GETATTR(3)  %s\n", @@ -55,9 +54,7 @@ nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,  	if (nfserr)  		RETURN_STATUS(nfserr); -	err = vfs_getattr(resp->fh.fh_export->ex_path.mnt, -			  resp->fh.fh_dentry, &resp->stat); -	nfserr = nfserrno(err); +	nfserr = fh_getattr(&resp->fh, &resp->stat);  	RETURN_STATUS(nfserr);  } diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 925c944bc0b..14d9ecb96cf 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -11,6 +11,7 @@  #include "xdr3.h"  #include "auth.h"  #include "netns.h" +#include "vfs.h"  #define NFSDDBG_FACILITY		NFSDDBG_XDR @@ -206,10 +207,10 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)  {  	struct dentry *dentry = fhp->fh_dentry;  	if (dentry && dentry->d_inode) { -	        int err; +	        __be32 err;  		struct kstat stat; -		err = vfs_getattr(fhp->fh_export->ex_path.mnt, dentry, &stat); +		err = fh_getattr(fhp, &stat);  		if (!err) {  			*p++ = xdr_one;		/* attributes follow */  			lease_get_mtime(dentry->d_inode, &stat.mtime); @@ -256,13 +257,12 @@ encode_wcc_data(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)   */  void fill_post_wcc(struct svc_fh *fhp)  { -	int err; +	__be32 err;  	if (fhp->fh_post_saved)  		printk("nfsd: inode locked twice during operation.\n"); -	err = vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, -			&fhp->fh_post_attr); +	err = fh_getattr(fhp, &fhp->fh_post_attr);  	fhp->fh_post_change = fhp->fh_dentry->d_inode->i_version;  	if (err) {  		fhp->fh_post_saved = 0; diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 2d1d06bae3a..8ca6d17f6cf 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2015,7 +2015,7 @@ static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)  		if (path.dentry != path.mnt->mnt_root)  			break;  	} -	err = vfs_getattr(path.mnt, path.dentry, stat); +	err = vfs_getattr(&path, stat);  	path_put(&path);  	return err;  } @@ -2068,7 +2068,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,  			goto out;  	} -	err = vfs_getattr(exp->ex_path.mnt, dentry, &stat); +	err = vfs_getattr(&path, &stat);  	if (err)  		goto out_nfserr;  	if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 74934284d9a..2db7021b01a 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -85,7 +85,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {  static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos)  { -	ino_t ino =  file->f_path.dentry->d_inode->i_ino; +	ino_t ino =  file_inode(file)->i_ino;  	char *data;  	ssize_t rv; diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index aad6d457b9e..54c6b3d3cc7 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -26,17 +26,13 @@ static __be32  nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp)  {  	if (err) return err; -	return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, -				    resp->fh.fh_dentry, -				    &resp->stat)); +	return fh_getattr(&resp->fh, &resp->stat);  }  static __be32  nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp)  {  	if (err) return err; -	return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, -				    resp->fh.fh_dentry, -				    &resp->stat)); +	return fh_getattr(&resp->fh, &resp->stat);  }  /*   * Get a file's attributes @@ -150,9 +146,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp,  				  &resp->count);  	if (nfserr) return nfserr; -	return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, -				    resp->fh.fh_dentry, -				    &resp->stat)); +	return fh_getattr(&resp->fh, &resp->stat);  }  /* diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index 4201ede0ec9..9c769a47ac5 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c @@ -4,6 +4,7 @@   * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>   */ +#include "vfs.h"  #include "xdr.h"  #include "auth.h" @@ -196,11 +197,9 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,  }  /* Helper function for NFSv2 ACL code */ -__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp) +__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, struct kstat *stat)  { -	struct kstat stat; -	vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, &stat); -	return encode_fattr(rqstp, p, fhp, &stat); +	return encode_fattr(rqstp, p, fhp, stat);  }  /* diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 31ff1d642e3..2a7eb536de0 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -979,7 +979,7 @@ static void kill_suid(struct dentry *dentry)   */  static int wait_for_concurrent_writes(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	static ino_t last_ino;  	static dev_t last_dev;  	int err = 0; @@ -1070,7 +1070,7 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (err)  		return err; -	inode = file->f_path.dentry->d_inode; +	inode = file_inode(file);  	/* Get readahead parameters */  	ra = nfsd_get_raparms(inode->i_sb->s_dev, inode->i_ino); @@ -1957,7 +1957,7 @@ static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func,  	offset = *offsetp;  	while (1) { -		struct inode *dir_inode = file->f_path.dentry->d_inode; +		struct inode *dir_inode = file_inode(file);  		unsigned int reclen;  		cdp->err = nfserr_eof; /* will be cleared on successful read */ diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index 359594c393d..5b5894159f2 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -6,6 +6,7 @@  #define LINUX_NFSD_VFS_H  #include "nfsfh.h" +#include "nfsd.h"  /*   * Flags for nfsd_permission @@ -125,4 +126,11 @@ static inline void fh_drop_write(struct svc_fh *fh)  	}  } +static inline __be32 fh_getattr(struct svc_fh *fh, struct kstat *stat) +{ +	struct path p = {.mnt = fh->fh_export->ex_path.mnt, +			 .dentry = fh->fh_dentry}; +	return nfserrno(vfs_getattr(&p, stat)); +} +  #endif /* LINUX_NFSD_VFS_H */ diff --git a/fs/nfsd/xdr.h b/fs/nfsd/xdr.h index 53b1863dd8f..4f0481d6380 100644 --- a/fs/nfsd/xdr.h +++ b/fs/nfsd/xdr.h @@ -167,7 +167,7 @@ int nfssvc_encode_entry(void *, const char *name,  int nfssvc_release_fhandle(struct svc_rqst *, __be32 *, struct nfsd_fhandle *);  /* Helper functions for NFSv2 ACL code */ -__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp); +__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, struct kstat *stat);  __be32 *nfs2svc_decode_fh(__be32 *p, struct svc_fh *fhp);  #endif /* LINUX_NFSD_H */ diff --git a/fs/nfsd/xdr3.h b/fs/nfsd/xdr3.h index 7df980eb056..b6d5542a4ac 100644 --- a/fs/nfsd/xdr3.h +++ b/fs/nfsd/xdr3.h @@ -136,6 +136,7 @@ struct nfsd3_accessres {  	__be32			status;  	struct svc_fh		fh;  	__u32			access; +	struct kstat		stat;  };  struct nfsd3_readlinkres { @@ -225,6 +226,7 @@ struct nfsd3_getaclres {  	int			mask;  	struct posix_acl	*acl_access;  	struct posix_acl	*acl_default; +	struct kstat		stat;  };  /* dummy type for release */ diff --git a/fs/nilfs2/dir.c b/fs/nilfs2/dir.c index df1a7fb238d..f30b017740a 100644 --- a/fs/nilfs2/dir.c +++ b/fs/nilfs2/dir.c @@ -259,7 +259,7 @@ static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode)  static int nilfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  {  	loff_t pos = filp->f_pos; -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	unsigned int offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT; diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index bec4af6eab1..08fdb77852a 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c @@ -67,7 +67,7 @@ int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)  static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct page *page = vmf->page; -	struct inode *inode = vma->vm_file->f_dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	struct nilfs_transaction_info ti;  	int ret = 0; diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index f3859354e41..b44bdb291b8 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c @@ -796,7 +796,7 @@ static int nilfs_ioctl_get_info(struct inode *inode, struct file *filp,  long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	void __user *argp = (void __user *)arg;  	switch (cmd) { diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 1d0c0b84c5a..9de78f08989 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c @@ -517,11 +517,11 @@ static int nilfs_encode_fh(struct inode *inode, __u32 *fh, int *lenp,  	if (parent && *lenp < NILFS_FID_SIZE_CONNECTABLE) {  		*lenp = NILFS_FID_SIZE_CONNECTABLE; -		return 255; +		return FILEID_INVALID;  	}  	if (*lenp < NILFS_FID_SIZE_NON_CONNECTABLE) {  		*lenp = NILFS_FID_SIZE_NON_CONNECTABLE; -		return 255; +		return FILEID_INVALID;  	}  	fid->cno = root->cno; diff --git a/fs/notify/dnotify/dnotify.c b/fs/notify/dnotify/dnotify.c index 08b886f119c..2bfe6dc413a 100644 --- a/fs/notify/dnotify/dnotify.c +++ b/fs/notify/dnotify/dnotify.c @@ -174,7 +174,7 @@ void dnotify_flush(struct file *filp, fl_owner_t id)  	struct dnotify_struct **prev;  	struct inode *inode; -	inode = filp->f_path.dentry->d_inode; +	inode = file_inode(filp);  	if (!S_ISDIR(inode->i_mode))  		return; @@ -296,7 +296,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)  	}  	/* dnotify only works on directories */ -	inode = filp->f_path.dentry->d_inode; +	inode = file_inode(filp);  	if (!S_ISDIR(inode->i_mode)) {  		error = -ENOTDIR;  		goto out_err; diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 9ff4a5ee6e2..5d8444268a1 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -466,7 +466,7 @@ static int fanotify_find_path(int dfd, const char __user *filename,  		ret = -ENOTDIR;  		if ((flags & FAN_MARK_ONLYDIR) && -		    !(S_ISDIR(f.file->f_path.dentry->d_inode->i_mode))) { +		    !(S_ISDIR(file_inode(f.file)->i_mode))) {  			fdput(f);  			goto out;  		} diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c index 99e36107ff6..aa411c3f20e 100644 --- a/fs/ntfs/dir.c +++ b/fs/ntfs/dir.c @@ -1101,7 +1101,7 @@ static int ntfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  {  	s64 ia_pos, ia_start, prev_ia_pos, bmp_pos;  	loff_t fpos, i_size; -	struct inode *bmp_vi, *vdir = filp->f_path.dentry->d_inode; +	struct inode *bmp_vi, *vdir = file_inode(filp);  	struct super_block *sb = vdir->i_sb;  	ntfs_inode *ndir = NTFS_I(vdir);  	ntfs_volume *vol = NTFS_SB(sb); diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 9796330d8f0..20dfec72e90 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -569,7 +569,7 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,  			     int ret,  			     bool is_async)  { -	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(iocb->ki_filp);  	int level;  	wait_queue_head_t *wq = ocfs2_ioend_wq(inode); @@ -593,9 +593,9 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,  	level = ocfs2_iocb_rw_locked_level(iocb);  	ocfs2_rw_unlock(inode, level); +	inode_dio_done(inode);  	if (is_async)  		aio_complete(iocb, ret, 0); -	inode_dio_done(inode);  }  /* @@ -626,7 +626,7 @@ static ssize_t ocfs2_direct_IO(int rw,  			       unsigned long nr_segs)  {  	struct file *file = iocb->ki_filp; -	struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; +	struct inode *inode = file_inode(file)->i_mapping->host;  	/*  	 * Fallback to buffered I/O if we see an inode without diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index fc121350d8c..f1e1aed8f63 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c @@ -2014,12 +2014,12 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv,  int ocfs2_readdir(struct file * filp, void * dirent, filldir_t filldir)  {  	int error = 0; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int lock_level = 0;  	trace_ocfs2_readdir((unsigned long long)OCFS2_I(inode)->ip_blkno); -	error = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); +	error = ocfs2_inode_lock_atime(inode, filp->f_path.mnt, &lock_level);  	if (lock_level && error >= 0) {  		/* We release EX lock which used to update atime  		 * and get PR lock again to reduce contention diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 005261c333b..33ecbe0e673 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c @@ -2020,7 +2020,7 @@ int dlm_dispatch_assert_master(struct dlm_ctxt *dlm,  			       int ignore_higher, u8 request_from, u32 flags)  {  	struct dlm_work_item *item; -	item = kzalloc(sizeof(*item), GFP_NOFS); +	item = kzalloc(sizeof(*item), GFP_ATOMIC);  	if (!item)  		return -ENOMEM; diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c index 16b712d260d..4c5fc8d77dc 100644 --- a/fs/ocfs2/dlmfs/dlmfs.c +++ b/fs/ocfs2/dlmfs/dlmfs.c @@ -224,7 +224,7 @@ static int dlmfs_file_setattr(struct dentry *dentry, struct iattr *attr)  static unsigned int dlmfs_file_poll(struct file *file, poll_table *wait)  {  	int event = 0; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct dlmfs_inode_private *ip = DLMFS_I(inode);  	poll_wait(file, &ip->ip_lockres.l_event, wait); @@ -245,7 +245,7 @@ static ssize_t dlmfs_file_read(struct file *filp,  	int bytes_left;  	ssize_t readlen, got;  	char *lvb_buf; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",  		inode->i_ino, count, *ppos); @@ -293,7 +293,7 @@ static ssize_t dlmfs_file_write(struct file *filp,  	int bytes_left;  	ssize_t writelen;  	char *lvb_buf; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	mlog(0, "inode %lu, count = %zu, *ppos = %llu\n",  		inode->i_ino, count, *ppos); diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c index 322216a5f0d..29651167190 100644 --- a/fs/ocfs2/export.c +++ b/fs/ocfs2/export.c @@ -195,11 +195,11 @@ static int ocfs2_encode_fh(struct inode *inode, u32 *fh_in, int *max_len,  	if (parent && (len < 6)) {  		*max_len = 6; -		type = 255; +		type = FILEID_INVALID;  		goto bail;  	} else if (len < 3) {  		*max_len = 3; -		type = 255; +		type = FILEID_INVALID;  		goto bail;  	} diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 0a2924a2d9e..6474cb44004 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -1950,7 +1950,7 @@ out:  int ocfs2_change_file_space(struct file *file, unsigned int cmd,  			    struct ocfs2_space_resv *sr)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);  	int ret; @@ -1978,7 +1978,7 @@ int ocfs2_change_file_space(struct file *file, unsigned int cmd,  static long ocfs2_fallocate(struct file *file, int mode, loff_t offset,  			    loff_t len)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);  	struct ocfs2_space_resv sr;  	int change_size = 1; @@ -2233,7 +2233,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,  	loff_t old_size, *ppos = &iocb->ki_pos;  	u32 old_clusters;  	struct file *file = iocb->ki_filp; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);  	int full_coherency = !(osb->s_mount_opt &  			       OCFS2_MOUNT_COHERENCY_BUFFERED); @@ -2517,7 +2517,7 @@ static ssize_t ocfs2_file_splice_read(struct file *in,  				      unsigned int flags)  {  	int ret = 0, lock_level = 0; -	struct inode *inode = in->f_path.dentry->d_inode; +	struct inode *inode = file_inode(in);  	trace_ocfs2_file_splice_read(inode, in, in->f_path.dentry,  			(unsigned long long)OCFS2_I(inode)->ip_blkno, @@ -2527,7 +2527,7 @@ static ssize_t ocfs2_file_splice_read(struct file *in,  	/*  	 * See the comment in ocfs2_file_aio_read()  	 */ -	ret = ocfs2_inode_lock_atime(inode, in->f_vfsmnt, &lock_level); +	ret = ocfs2_inode_lock_atime(inode, in->f_path.mnt, &lock_level);  	if (ret < 0) {  		mlog_errno(ret);  		goto bail; @@ -2547,7 +2547,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,  {  	int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0;  	struct file *filp = iocb->ki_filp; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	trace_ocfs2_file_aio_read(inode, filp, filp->f_path.dentry,  			(unsigned long long)OCFS2_I(inode)->ip_blkno, @@ -2590,7 +2590,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,  	 * like i_size. This allows the checks down below  	 * generic_file_aio_read() a chance of actually working.  	 */ -	ret = ocfs2_inode_lock_atime(inode, filp->f_vfsmnt, &lock_level); +	ret = ocfs2_inode_lock_atime(inode, filp->f_path.mnt, &lock_level);  	if (ret < 0) {  		mlog_errno(ret);  		goto bail; diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c index f20edcbfe70..752f0b26221 100644 --- a/fs/ocfs2/ioctl.c +++ b/fs/ocfs2/ioctl.c @@ -881,7 +881,7 @@ bail:  long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	unsigned int flags;  	int new_clusters;  	int status; @@ -994,7 +994,7 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)  {  	bool preserve;  	struct reflink_arguments args; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ocfs2_info info;  	void __user *argp = (void __user *)arg; diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 47a87dda54c..10d66c75cec 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -62,7 +62,7 @@ static int __ocfs2_page_mkwrite(struct file *file, struct buffer_head *di_bh,  				struct page *page)  {  	int ret = VM_FAULT_NOPAGE; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct address_space *mapping = inode->i_mapping;  	loff_t pos = page_offset(page);  	unsigned int len = PAGE_CACHE_SIZE; @@ -131,7 +131,7 @@ out:  static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct page *page = vmf->page; -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	struct buffer_head *di_bh = NULL;  	sigset_t oldset;  	int ret; @@ -180,13 +180,13 @@ int ocfs2_mmap(struct file *file, struct vm_area_struct *vma)  {  	int ret = 0, lock_level = 0; -	ret = ocfs2_inode_lock_atime(file->f_dentry->d_inode, -				    file->f_vfsmnt, &lock_level); +	ret = ocfs2_inode_lock_atime(file_inode(file), +				    file->f_path.mnt, &lock_level);  	if (ret < 0) {  		mlog_errno(ret);  		goto out;  	} -	ocfs2_inode_unlock(file->f_dentry->d_inode, lock_level); +	ocfs2_inode_unlock(file_inode(file), lock_level);  out:  	vma->vm_ops = &ocfs2_file_vm_ops;  	return 0; diff --git a/fs/ocfs2/move_extents.c b/fs/ocfs2/move_extents.c index 6083432f667..9f8dcadd9a5 100644 --- a/fs/ocfs2/move_extents.c +++ b/fs/ocfs2/move_extents.c @@ -1055,7 +1055,7 @@ int ocfs2_ioctl_move_extents(struct file *filp, void __user *argp)  {  	int status; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ocfs2_move_extents range;  	struct ocfs2_move_extents_context *context = NULL; diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 934a4ac3e7f..998b17eda09 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c @@ -2927,7 +2927,7 @@ int ocfs2_duplicate_clusters_by_page(handle_t *handle,  				     u32 new_cluster, u32 new_len)  {  	int ret = 0, partial; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ocfs2_caching_info *ci = INODE_CACHE(inode);  	struct super_block *sb = ocfs2_metadata_cache_get_super(ci);  	u64 new_block = ocfs2_clusters_to_blocks(sb, new_cluster); @@ -3020,7 +3020,7 @@ int ocfs2_duplicate_clusters_by_jbd(handle_t *handle,  				    u32 new_cluster, u32 new_len)  {  	int ret = 0; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct super_block *sb = inode->i_sb;  	struct ocfs2_caching_info *ci = INODE_CACHE(inode);  	int i, blocks = ocfs2_clusters_to_blocks(sb, new_len); diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c index f1fbb4b552a..66edce7ecfd 100644 --- a/fs/ocfs2/symlink.c +++ b/fs/ocfs2/symlink.c @@ -57,7 +57,7 @@  static int ocfs2_fast_symlink_readpage(struct file *unused, struct page *page)  {  	struct inode *inode = page->mapping->host; -	struct buffer_head *bh; +	struct buffer_head *bh = NULL;  	int status = ocfs2_read_inode_block(inode, &bh);  	struct ocfs2_dinode *fe;  	const char *link; diff --git a/fs/omfs/dir.c b/fs/omfs/dir.c index fb5b3ff79dc..acbaebcad3a 100644 --- a/fs/omfs/dir.c +++ b/fs/omfs/dir.c @@ -330,7 +330,7 @@ int omfs_is_bad(struct omfs_sb_info *sbi, struct omfs_header *header,  static int omfs_fill_chain(struct file *filp, void *dirent, filldir_t filldir,  		u64 fsblock, int hindex)  { -	struct inode *dir = filp->f_dentry->d_inode; +	struct inode *dir = file_inode(filp);  	struct buffer_head *bh;  	struct omfs_inode *oi;  	u64 self; @@ -405,7 +405,7 @@ out:  static int omfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *dir = filp->f_dentry->d_inode; +	struct inode *dir = file_inode(filp);  	struct buffer_head *bh;  	loff_t offset, res;  	unsigned int hchain, hindex; diff --git a/fs/open.c b/fs/open.c index 9b33c0cbfac..62f907e3bc3 100644 --- a/fs/open.c +++ b/fs/open.c @@ -228,7 +228,7 @@ SYSCALL_ALIAS(sys_ftruncate64, SyS_ftruncate64);  int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	long ret;  	if (offset < 0 || len <= 0) @@ -426,7 +426,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd)  	if (!f.file)  		goto out; -	inode = f.file->f_path.dentry->d_inode; +	inode = file_inode(f.file);  	error = -ENOTDIR;  	if (!S_ISDIR(inode->i_mode)) @@ -689,7 +689,7 @@ static int do_dentry_open(struct file *f,  		f->f_mode = FMODE_PATH;  	path_get(&f->f_path); -	inode = f->f_path.dentry->d_inode; +	inode = file_inode(f);  	if (f->f_mode & FMODE_WRITE) {  		error = __get_file_write_access(inode, f->f_path.mnt);  		if (error) @@ -699,7 +699,6 @@ static int do_dentry_open(struct file *f,  	}  	f->f_mapping = inode->i_mapping; -	f->f_pos = 0;  	file_sb_list_add(f, inode->i_sb);  	if (unlikely(f->f_mode & FMODE_PATH)) { @@ -810,23 +809,22 @@ struct file *dentry_open(const struct path *path, int flags,  	/* We must always pass in a valid mount pointer. */  	BUG_ON(!path->mnt); -	error = -ENFILE;  	f = get_empty_filp(); -	if (f == NULL) -		return ERR_PTR(error); - -	f->f_flags = flags; -	f->f_path = *path; -	error = do_dentry_open(f, NULL, cred); -	if (!error) { -		error = open_check_o_direct(f); -		if (error) { -			fput(f); +	if (!IS_ERR(f)) { +		f->f_flags = flags; +		f->f_path = *path; +		error = do_dentry_open(f, NULL, cred); +		if (!error) { +			/* from now on we need fput() to dispose of f */ +			error = open_check_o_direct(f); +			if (error) { +				fput(f); +				f = ERR_PTR(error); +			} +		} else {  +			put_filp(f);  			f = ERR_PTR(error);  		} -	} else {  -		put_filp(f); -		f = ERR_PTR(error);  	}  	return f;  } diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index 2ad080faca3..ae47fa7efb9 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -262,7 +262,7 @@ found:  static int openpromfs_readdir(struct file * filp, void * dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct op_inode_info *oi = OP_I(inode);  	struct device_node *dp = oi->u.node;  	struct device_node *child; diff --git a/fs/pipe.c b/fs/pipe.c index bd3479db4b6..64a494cef0a 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -361,7 +361,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,  	   unsigned long nr_segs, loff_t pos)  {  	struct file *filp = iocb->ki_filp; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct pipe_inode_info *pipe;  	int do_wakeup;  	ssize_t ret; @@ -486,7 +486,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,  	    unsigned long nr_segs, loff_t ppos)  {  	struct file *filp = iocb->ki_filp; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct pipe_inode_info *pipe;  	ssize_t ret;  	int do_wakeup; @@ -677,7 +677,7 @@ bad_pipe_w(struct file *filp, const char __user *buf, size_t count,  static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct pipe_inode_info *pipe;  	int count, buf, nrbufs; @@ -705,7 +705,7 @@ static unsigned int  pipe_poll(struct file *filp, poll_table *wait)  {  	unsigned int mask; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct pipe_inode_info *pipe = inode->i_pipe;  	int nrbufs; @@ -758,7 +758,7 @@ pipe_release(struct inode *inode, int decr, int decw)  static int  pipe_read_fasync(int fd, struct file *filp, int on)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int retval;  	mutex_lock(&inode->i_mutex); @@ -772,7 +772,7 @@ pipe_read_fasync(int fd, struct file *filp, int on)  static int  pipe_write_fasync(int fd, struct file *filp, int on)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int retval;  	mutex_lock(&inode->i_mutex); @@ -786,7 +786,7 @@ pipe_write_fasync(int fd, struct file *filp, int on)  static int  pipe_rdwr_fasync(int fd, struct file *filp, int on)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct pipe_inode_info *pipe = inode->i_pipe;  	int retval; @@ -1037,13 +1037,13 @@ int create_pipe_files(struct file **res, int flags)  	err = -ENFILE;  	f = alloc_file(&path, FMODE_WRITE, &write_pipefifo_fops); -	if (!f) +	if (IS_ERR(f))  		goto err_dentry;  	f->f_flags = O_WRONLY | (flags & (O_NONBLOCK | O_DIRECT));  	res[0] = alloc_file(&path, FMODE_READ, &read_pipefifo_fops); -	if (!res[0]) +	if (IS_ERR(res[0]))  		goto err_file;  	path_get(&path); @@ -1226,7 +1226,7 @@ int pipe_proc_fn(struct ctl_table *table, int write, void __user *buf,   */  struct pipe_inode_info *get_pipe_info(struct file *file)  { -	struct inode *i = file->f_path.dentry->d_inode; +	struct inode *i = file_inode(file);  	return S_ISFIFO(i->i_mode) ? i->i_pipe : NULL;  } diff --git a/fs/proc/base.c b/fs/proc/base.c index 9b43ff77a51..f3b133d7991 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -383,7 +383,7 @@ static int lstats_open(struct inode *inode, struct file *file)  static ssize_t lstats_write(struct file *file, const char __user *buf,  			    size_t count, loff_t *offs)  { -	struct task_struct *task = get_proc_task(file->f_dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	if (!task)  		return -ESRCH; @@ -602,7 +602,7 @@ static const struct inode_operations proc_def_inode_operations = {  static ssize_t proc_info_read(struct file * file, char __user * buf,  			  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	unsigned long page;  	ssize_t length;  	struct task_struct *task = get_proc_task(inode); @@ -668,7 +668,7 @@ static const struct file_operations proc_single_file_operations = {  static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	struct mm_struct *mm;  	if (!task) @@ -869,7 +869,7 @@ static const struct file_operations proc_environ_operations = {  static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count,  			    loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	char buffer[PROC_NUMBUF];  	int oom_adj = OOM_ADJUST_MIN;  	size_t len; @@ -916,7 +916,7 @@ static ssize_t oom_adj_write(struct file *file, const char __user *buf,  		goto out;  	} -	task = get_proc_task(file->f_path.dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task) {  		err = -ESRCH;  		goto out; @@ -976,7 +976,7 @@ static const struct file_operations proc_oom_adj_operations = {  static ssize_t oom_score_adj_read(struct file *file, char __user *buf,  					size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	char buffer[PROC_NUMBUF];  	short oom_score_adj = OOM_SCORE_ADJ_MIN;  	unsigned long flags; @@ -1019,7 +1019,7 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf,  		goto out;  	} -	task = get_proc_task(file->f_path.dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task) {  		err = -ESRCH;  		goto out; @@ -1067,7 +1067,7 @@ static const struct file_operations proc_oom_score_adj_operations = {  static ssize_t proc_loginuid_read(struct file * file, char __user * buf,  				  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	struct task_struct *task = get_proc_task(inode);  	ssize_t length;  	char tmpbuf[TMPBUFLEN]; @@ -1084,7 +1084,7 @@ static ssize_t proc_loginuid_read(struct file * file, char __user * buf,  static ssize_t proc_loginuid_write(struct file * file, const char __user * buf,  				   size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char *page, *tmp;  	ssize_t length;  	uid_t loginuid; @@ -1142,7 +1142,7 @@ static const struct file_operations proc_loginuid_operations = {  static ssize_t proc_sessionid_read(struct file * file, char __user * buf,  				  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	struct task_struct *task = get_proc_task(inode);  	ssize_t length;  	char tmpbuf[TMPBUFLEN]; @@ -1165,7 +1165,7 @@ static const struct file_operations proc_sessionid_operations = {  static ssize_t proc_fault_inject_read(struct file * file, char __user * buf,  				      size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	char buffer[PROC_NUMBUF];  	size_t len;  	int make_it_fail; @@ -1197,7 +1197,7 @@ static ssize_t proc_fault_inject_write(struct file * file,  	make_it_fail = simple_strtol(strstrip(buffer), &end, 0);  	if (*end)  		return -EINVAL; -	task = get_proc_task(file->f_dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task)  		return -ESRCH;  	task->make_it_fail = make_it_fail; @@ -1237,7 +1237,7 @@ static ssize_t  sched_write(struct file *file, const char __user *buf,  	    size_t count, loff_t *offset)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct task_struct *p;  	p = get_proc_task(inode); @@ -1288,7 +1288,7 @@ static ssize_t  sched_autogroup_write(struct file *file, const char __user *buf,  	    size_t count, loff_t *offset)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct task_struct *p;  	char buffer[PROC_NUMBUF];  	int nice; @@ -1343,7 +1343,7 @@ static const struct file_operations proc_pid_sched_autogroup_operations = {  static ssize_t comm_write(struct file *file, const char __user *buf,  				size_t count, loff_t *offset)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct task_struct *p;  	char buffer[TASK_COMM_LEN]; @@ -1711,7 +1711,7 @@ static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags)  		return -ECHILD;  	if (!capable(CAP_SYS_ADMIN)) { -		status = -EACCES; +		status = -EPERM;  		goto out_notask;  	} @@ -1844,7 +1844,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir,  	struct dentry *result;  	struct mm_struct *mm; -	result = ERR_PTR(-EACCES); +	result = ERR_PTR(-EPERM);  	if (!capable(CAP_SYS_ADMIN))  		goto out; @@ -1900,7 +1900,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)  	ino_t ino;  	int ret; -	ret = -EACCES; +	ret = -EPERM;  	if (!capable(CAP_SYS_ADMIN))  		goto out; @@ -2146,7 +2146,7 @@ out_no_task:  static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,  				  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char *p = NULL;  	ssize_t length;  	struct task_struct *task = get_proc_task(inode); @@ -2167,7 +2167,7 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,  static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,  				   size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char *page;  	ssize_t length;  	struct task_struct *task = get_proc_task(inode); @@ -2256,7 +2256,7 @@ static const struct inode_operations proc_attr_dir_inode_operations = {  static ssize_t proc_coredump_filter_read(struct file *file, char __user *buf,  					 size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	struct mm_struct *mm;  	char buffer[PROC_NUMBUF];  	size_t len; @@ -2308,7 +2308,7 @@ static ssize_t proc_coredump_filter_write(struct file *file,  		goto out_no_task;  	ret = -ESRCH; -	task = get_proc_task(file->f_dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task)  		goto out_no_task; @@ -2618,6 +2618,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)  	name.name = buf;  	name.len = snprintf(buf, sizeof(buf), "%d", pid); +	/* no ->d_hash() rejects on procfs */  	dentry = d_hash_and_lookup(mnt->mnt_root, &name);  	if (dentry) {  		shrink_dcache_parent(dentry); diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 76ddae83daa..2983dc52ca2 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -42,7 +42,7 @@ static ssize_t  __proc_file_read(struct file *file, char __user *buf, size_t nbytes,  	       loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char 	*page;  	ssize_t	retval=0;  	int	eof=0; @@ -188,7 +188,7 @@ static ssize_t  proc_file_read(struct file *file, char __user *buf, size_t nbytes,  	       loff_t *ppos)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	ssize_t rv = -EIO;  	spin_lock(&pde->pde_unload_lock); @@ -209,7 +209,7 @@ static ssize_t  proc_file_write(struct file *file, const char __user *buffer,  		size_t count, loff_t *ppos)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	ssize_t rv = -EIO;  	if (pde->write_proc) { @@ -412,8 +412,7 @@ static const struct dentry_operations proc_dentry_operations =  struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,  		struct dentry *dentry)  { -	struct inode *inode = NULL; -	int error = -ENOENT; +	struct inode *inode;  	spin_lock(&proc_subdir_lock);  	for (de = de->subdir; de ; de = de->next) { @@ -422,22 +421,16 @@ struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir,  		if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {  			pde_get(de);  			spin_unlock(&proc_subdir_lock); -			error = -ENOMEM;  			inode = proc_get_inode(dir->i_sb, de); -			goto out_unlock; +			if (!inode) +				return ERR_PTR(-ENOMEM); +			d_set_d_op(dentry, &proc_dentry_operations); +			d_add(dentry, inode); +			return NULL;  		}  	}  	spin_unlock(&proc_subdir_lock); -out_unlock: - -	if (inode) { -		d_set_d_op(dentry, &proc_dentry_operations); -		d_add(dentry, inode); -		return NULL; -	} -	if (de) -		pde_put(de); -	return ERR_PTR(error); +	return ERR_PTR(-ENOENT);  }  struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, @@ -460,7 +453,7 @@ int proc_readdir_de(struct proc_dir_entry *de, struct file *filp, void *dirent,  {  	unsigned int ino;  	int i; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int ret = 0;  	ino = inode->i_ino; @@ -522,7 +515,7 @@ out:  int proc_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	return proc_readdir_de(PDE(inode), filp, dirent, filldir);  } diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 439ae688650..70322e1a4f0 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -144,7 +144,7 @@ void pde_users_dec(struct proc_dir_entry *pde)  static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	loff_t rv = -EINVAL;  	loff_t (*llseek)(struct file *, loff_t, int); @@ -179,7 +179,7 @@ static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)  static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	ssize_t rv = -EIO;  	ssize_t (*read)(struct file *, char __user *, size_t, loff_t *); @@ -201,7 +201,7 @@ static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count,  static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	ssize_t rv = -EIO;  	ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); @@ -223,7 +223,7 @@ static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t  static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *pts)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	unsigned int rv = DEFAULT_POLLMASK;  	unsigned int (*poll)(struct file *, struct poll_table_struct *); @@ -245,7 +245,7 @@ static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *p  static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	long rv = -ENOTTY;  	long (*ioctl)(struct file *, unsigned int, unsigned long); @@ -268,7 +268,7 @@ static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigne  #ifdef CONFIG_COMPAT  static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	long rv = -ENOTTY;  	long (*compat_ioctl)(struct file *, unsigned int, unsigned long); @@ -291,7 +291,7 @@ static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned  static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)  { -	struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	struct proc_dir_entry *pde = PDE(file_inode(file));  	int rv = -EIO;  	int (*mmap)(struct file *, struct vm_area_struct *); @@ -445,12 +445,9 @@ static const struct file_operations proc_reg_file_ops_no_compat = {  struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)  { -	struct inode * inode; +	struct inode *inode = iget_locked(sb, de->low_ino); -	inode = iget_locked(sb, de->low_ino); -	if (!inode) -		return NULL; -	if (inode->i_state & I_NEW) { +	if (inode && (inode->i_state & I_NEW)) {  		inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;  		PROC_I(inode)->pde = de; @@ -482,10 +479,12 @@ struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)  	} else  	       pde_put(de);  	return inode; -}			 +}  int proc_fill_super(struct super_block *s)  { +	struct inode *root_inode; +  	s->s_flags |= MS_NODIRATIME | MS_NOSUID | MS_NOEXEC;  	s->s_blocksize = 1024;  	s->s_blocksize_bits = 10; @@ -494,11 +493,17 @@ int proc_fill_super(struct super_block *s)  	s->s_time_gran = 1;  	pde_get(&proc_root); -	s->s_root = d_make_root(proc_get_inode(s, &proc_root)); -	if (s->s_root) -		return 0; +	root_inode = proc_get_inode(s, &proc_root); +	if (!root_inode) { +		printk(KERN_ERR "proc_fill_super: get root inode failed\n"); +		return -ENOMEM; +	} -	printk("proc_read_super: get root inode failed\n"); -	pde_put(&proc_root); -	return -ENOMEM; +	s->s_root = d_make_root(root_inode); +	if (!s->s_root) { +		printk(KERN_ERR "proc_fill_super: allocate dentry failed\n"); +		return -ENOMEM; +	} + +	return 0;  } diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c index b1822dde55c..ccfd99bd1c5 100644 --- a/fs/proc/nommu.c +++ b/fs/proc/nommu.c @@ -45,7 +45,7 @@ static int nommu_region_show(struct seq_file *m, struct vm_region *region)  	file = region->vm_file;  	if (file) { -		struct inode *inode = region->vm_file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(region->vm_file);  		dev = inode->i_sb->s_dev;  		ino = inode->i_ino;  	} diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c index 3131a03d7d3..b4ac6572474 100644 --- a/fs/proc/proc_net.c +++ b/fs/proc/proc_net.c @@ -163,7 +163,7 @@ static int proc_tgid_net_readdir(struct file *filp, void *dirent,  	struct net *net;  	ret = -EINVAL; -	net = get_proc_task_net(filp->f_path.dentry->d_inode); +	net = get_proc_task_net(file_inode(filp));  	if (net != NULL) {  		ret = proc_readdir_de(net->proc_net, filp, dirent, filldir);  		put_net(net); diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 1827d88ad58..612df79cc6a 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -478,7 +478,7 @@ out:  static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf,  		size_t count, loff_t *ppos, int write)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ctl_table_header *head = grab_header(inode);  	struct ctl_table *table = PROC_I(inode)->sysctl_entry;  	ssize_t error; @@ -542,7 +542,7 @@ static int proc_sys_open(struct inode *inode, struct file *filp)  static unsigned int proc_sys_poll(struct file *filp, poll_table *wait)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct ctl_table_header *head = grab_header(inode);  	struct ctl_table *table = PROC_I(inode)->sysctl_entry;  	unsigned int ret = DEFAULT_POLLMASK; diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index ca5ce7f9f80..3e636d864d5 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -271,7 +271,7 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)  	const char *name = NULL;  	if (file) { -		struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(vma->vm_file);  		dev = inode->i_sb->s_dev;  		ino = inode->i_ino;  		pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT; @@ -743,7 +743,7 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,  		return rv;  	if (type < CLEAR_REFS_ALL || type > CLEAR_REFS_MAPPED)  		return -EINVAL; -	task = get_proc_task(file->f_path.dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task)  		return -ESRCH;  	mm = get_task_mm(task); @@ -1015,7 +1015,7 @@ static int pagemap_hugetlb_range(pte_t *pte, unsigned long hmask,  static ssize_t pagemap_read(struct file *file, char __user *buf,  			    size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	struct mm_struct *mm;  	struct pagemapread pm;  	int ret = -ESRCH; diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 1ccfa537f5f..56123a6f462 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c @@ -149,7 +149,7 @@ static int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma,  	file = vma->vm_file;  	if (file) { -		struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(vma->vm_file);  		dev = inode->i_sb->s_dev;  		ino = inode->i_ino;  		pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT; diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c index 7b0329468a5..28ce014b3ce 100644 --- a/fs/qnx4/dir.c +++ b/fs/qnx4/dir.c @@ -16,7 +16,7 @@  static int qnx4_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	unsigned int offset;  	struct buffer_head *bh;  	struct qnx4_inode_entry *de; diff --git a/fs/qnx6/dir.c b/fs/qnx6/dir.c index dc597353db3..8798d065e40 100644 --- a/fs/qnx6/dir.c +++ b/fs/qnx6/dir.c @@ -117,7 +117,7 @@ static int qnx6_dir_longfilename(struct inode *inode,  static int qnx6_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *s = inode->i_sb;  	struct qnx6_sb_info *sbi = QNX6_SB(s);  	loff_t pos = filp->f_pos & (QNX6_DIR_ENTRY_SIZE - 1); diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index d5378d02858..8d5b438cc18 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -202,7 +202,7 @@ unsigned long ramfs_nommu_get_unmapped_area(struct file *file,  					    unsigned long pgoff, unsigned long flags)  {  	unsigned long maxpages, lpages, nr, loop, ret; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct page **pages = NULL, **ptr, *page;  	loff_t isize; diff --git a/fs/read_write.c b/fs/read_write.c index bb34af31528..3ae6dbe828b 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -163,7 +163,7 @@ EXPORT_SYMBOL(no_llseek);  loff_t default_llseek(struct file *file, loff_t offset, int whence)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	loff_t retval;  	mutex_lock(&inode->i_mutex); @@ -290,7 +290,7 @@ int rw_verify_area(int read_write, struct file *file, loff_t *ppos, size_t count  	loff_t pos;  	int retval = -EINVAL; -	inode = file->f_path.dentry->d_inode; +	inode = file_inode(file);  	if (unlikely((ssize_t) count < 0))  		return retval;  	pos = *ppos; @@ -901,8 +901,8 @@ ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, size_t count,  	if (!(out.file->f_mode & FMODE_WRITE))  		goto fput_out;  	retval = -EINVAL; -	in_inode = in.file->f_path.dentry->d_inode; -	out_inode = out.file->f_path.dentry->d_inode; +	in_inode = file_inode(in.file); +	out_inode = file_inode(out.file);  	retval = rw_verify_area(WRITE, out.file, &out.file->f_pos, count);  	if (retval < 0)  		goto fput_out; diff --git a/fs/readdir.c b/fs/readdir.c index 5e69ef533b7..fee38e04fae 100644 --- a/fs/readdir.c +++ b/fs/readdir.c @@ -22,7 +22,7 @@  int vfs_readdir(struct file *file, filldir_t filler, void *buf)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int res = -ENOTDIR;  	if (!file->f_op || !file->f_op->readdir)  		goto out; diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index 50302d6f889..6165bd4784f 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c @@ -268,7 +268,7 @@ static ssize_t reiserfs_file_write(struct file *file,	/* the file we are going t  							 * new current position before returning. */  				   )  { -	struct inode *inode = file->f_path.dentry->d_inode;	// Inode of the file that we are writing to. +	struct inode *inode = file_inode(file);	// Inode of the file that we are writing to.  	/* To simplify coding at this time, we store  	   locked pages in array for now */  	struct reiserfs_transaction_handle th; diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 95d7680ead4..ea5061fd4f3 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -1603,10 +1603,10 @@ int reiserfs_encode_fh(struct inode *inode, __u32 * data, int *lenp,  	if (parent && (maxlen < 5)) {  		*lenp = 5; -		return 255; +		return FILEID_INVALID;  	} else if (maxlen < 3) {  		*lenp = 3; -		return 255; +		return FILEID_INVALID;  	}  	data[0] = inode->i_ino; diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c index 0c2185042d5..15cb5fe6b42 100644 --- a/fs/reiserfs/ioctl.c +++ b/fs/reiserfs/ioctl.c @@ -21,7 +21,7 @@   */  long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	unsigned int flags;  	int err = 0; diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index e60e87035bb..9cc0740adff 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c @@ -281,7 +281,7 @@ static int show_oidmap(struct seq_file *m, struct super_block *sb)  	}  #if defined( REISERFS_USE_OIDMAPF )  	if (sb_info->oidmap.use_file && (sb_info->oidmap.mapf != NULL)) { -		loff_t size = sb_info->oidmap.mapf->f_path.dentry->d_inode->i_size; +		loff_t size = file_inode(sb_info->oidmap.mapf)->i_size;  		total_used += size / sizeof(reiserfs_oidinterval_d_t);  	}  #endif diff --git a/fs/romfs/super.c b/fs/romfs/super.c index fd7c5f60b46..7e8d3a80bda 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c @@ -147,7 +147,7 @@ static const struct address_space_operations romfs_aops = {   */  static int romfs_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *i = filp->f_dentry->d_inode; +	struct inode *i = file_inode(filp);  	struct romfs_inode ri;  	unsigned long offset, maxoff;  	int j, ino, nextfh; diff --git a/fs/splice.c b/fs/splice.c index 6909d89d0da..718bd005638 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -569,7 +569,7 @@ static ssize_t kernel_readv(struct file *file, const struct iovec *vec,  	return res;  } -static ssize_t kernel_write(struct file *file, const char *buf, size_t count, +ssize_t kernel_write(struct file *file, const char *buf, size_t count,  			    loff_t pos)  {  	mm_segment_t old_fs; @@ -578,11 +578,12 @@ static ssize_t kernel_write(struct file *file, const char *buf, size_t count,  	old_fs = get_fs();  	set_fs(get_ds());  	/* The cast to a user pointer is valid due to the set_fs() */ -	res = vfs_write(file, (const char __user *)buf, count, &pos); +	res = vfs_write(file, (__force const char __user *)buf, count, &pos);  	set_fs(old_fs);  	return res;  } +EXPORT_SYMBOL(kernel_write);  ssize_t default_file_splice_read(struct file *in, loff_t *ppos,  				 struct pipe_inode_info *pipe, size_t len, @@ -1170,7 +1171,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,  	 * randomly drop data for eg socket -> socket splicing. Use the  	 * piped splicing for that!  	 */ -	i_mode = in->f_path.dentry->d_inode->i_mode; +	i_mode = file_inode(in)->i_mode;  	if (unlikely(!S_ISREG(i_mode) && !S_ISBLK(i_mode)))  		return -EINVAL; diff --git a/fs/squashfs/dir.c b/fs/squashfs/dir.c index b381305c9a4..57dc70ebbb1 100644 --- a/fs/squashfs/dir.c +++ b/fs/squashfs/dir.c @@ -102,7 +102,7 @@ static int get_dir_index_using_offset(struct super_block *sb,  static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;  	u64 block = squashfs_i(inode)->start + msblk->directory_table;  	int offset = squashfs_i(inode)->offset, length, dir_count, size, diff --git a/fs/stat.c b/fs/stat.c index 14f45459c83..04ce1ac20d2 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -37,17 +37,17 @@ void generic_fillattr(struct inode *inode, struct kstat *stat)  EXPORT_SYMBOL(generic_fillattr); -int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) +int vfs_getattr(struct path *path, struct kstat *stat)  { -	struct inode *inode = dentry->d_inode; +	struct inode *inode = path->dentry->d_inode;  	int retval; -	retval = security_inode_getattr(mnt, dentry); +	retval = security_inode_getattr(path->mnt, path->dentry);  	if (retval)  		return retval;  	if (inode->i_op->getattr) -		return inode->i_op->getattr(mnt, dentry, stat); +		return inode->i_op->getattr(path->mnt, path->dentry, stat);  	generic_fillattr(inode, stat);  	return 0; @@ -61,8 +61,7 @@ int vfs_fstat(unsigned int fd, struct kstat *stat)  	int error = -EBADF;  	if (f.file) { -		error = vfs_getattr(f.file->f_path.mnt, f.file->f_path.dentry, -				    stat); +		error = vfs_getattr(&f.file->f_path, stat);  		fdput(f);  	}  	return error; @@ -89,7 +88,7 @@ retry:  	if (error)  		goto out; -	error = vfs_getattr(path.mnt, path.dentry, stat); +	error = vfs_getattr(&path, stat);  	path_put(&path);  	if (retry_estale(error, lookup_flags)) {  		lookup_flags |= LOOKUP_REVAL; diff --git a/fs/sync.c b/fs/sync.c index 14eefeb4463..2c5d6639a66 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -332,7 +332,7 @@ SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes,  	if (!f.file)  		goto out; -	i_mode = f.file->f_path.dentry->d_inode->i_mode; +	i_mode = file_inode(f.file)->i_mode;  	ret = -ESPIPE;  	if (!S_ISREG(i_mode) && !S_ISBLK(i_mode) && !S_ISDIR(i_mode) &&  			!S_ISLNK(i_mode)) diff --git a/fs/sysfs/bin.c b/fs/sysfs/bin.c index 614b2b54488..2ce9a5db6ab 100644 --- a/fs/sysfs/bin.c +++ b/fs/sysfs/bin.c @@ -70,7 +70,7 @@ static ssize_t  read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off)  {  	struct bin_buffer *bb = file->private_data; -	int size = file->f_path.dentry->d_inode->i_size; +	int size = file_inode(file)->i_size;  	loff_t offs = *off;  	int count = min_t(size_t, bytes, PAGE_SIZE);  	char *temp; @@ -140,7 +140,7 @@ static ssize_t write(struct file *file, const char __user *userbuf,  		     size_t bytes, loff_t *off)  {  	struct bin_buffer *bb = file->private_data; -	int size = file->f_path.dentry->d_inode->i_size; +	int size = file_inode(file)->i_size;  	loff_t offs = *off;  	int count = min_t(size_t, bytes, PAGE_SIZE);  	char *temp; @@ -469,7 +469,7 @@ void unmap_bin_file(struct sysfs_dirent *attr_sd)  	mutex_lock(&sysfs_bin_lock);  	hlist_for_each_entry(bb, tmp, &attr_sd->s_bin_attr.buffers, list) { -		struct inode *inode = bb->file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(bb->file);  		unmap_mapping_range(inode->i_mapping, 0, 0, 1);  	} diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index a77c4215762..3799e8dac3e 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -68,7 +68,7 @@ static struct page * dir_get_page(struct inode *dir, unsigned long n)  static int sysv_readdir(struct file * filp, void * dirent, filldir_t filldir)  {  	unsigned long pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	unsigned offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT; diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c index 8a574776a49..de08c92f2e2 100644 --- a/fs/ubifs/dir.c +++ b/fs/ubifs/dir.c @@ -352,7 +352,7 @@ static int ubifs_readdir(struct file *file, void *dirent, filldir_t filldir)  	struct qstr nm;  	union ubifs_key key;  	struct ubifs_dent_node *dent; -	struct inode *dir = file->f_path.dentry->d_inode; +	struct inode *dir = file_inode(file);  	struct ubifs_info *c = dir->i_sb->s_fs_info;  	dbg_gen("dir ino %lu, f_pos %#llx", dir->i_ino, file->f_pos); diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 4f6493c130e..f12189d2db1 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -1444,7 +1444,7 @@ static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma,  				 struct vm_fault *vmf)  {  	struct page *page = vmf->page; -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	struct ubifs_info *c = inode->i_sb->s_fs_info;  	struct timespec now = ubifs_current_time(inode);  	struct ubifs_budget_req req = { .new_page = 1 }; diff --git a/fs/ubifs/ioctl.c b/fs/ubifs/ioctl.c index 1a7e2d8bdbe..648b143606c 100644 --- a/fs/ubifs/ioctl.c +++ b/fs/ubifs/ioctl.c @@ -147,7 +147,7 @@ out_unlock:  long ubifs_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  {  	int flags, err; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	switch (cmd) {  	case FS_IOC_GETFLAGS: diff --git a/fs/udf/dir.c b/fs/udf/dir.c index eb8bfe2b89a..b3e93f5e17c 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c @@ -186,7 +186,7 @@ out:  static int udf_readdir(struct file *filp, void *dirent, filldir_t filldir)  { -	struct inode *dir = filp->f_path.dentry->d_inode; +	struct inode *dir = file_inode(filp);  	int result;  	if (filp->f_pos == 0) { diff --git a/fs/udf/file.c b/fs/udf/file.c index 77b5953eaac..29569dd0816 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -139,7 +139,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  {  	ssize_t retval;  	struct file *file = iocb->ki_filp; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int err, pos;  	size_t count = iocb->ki_left;  	struct udf_inode_info *iinfo = UDF_I(inode); @@ -178,7 +178,7 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,  long udf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	long old_block, new_block;  	int result = -EINVAL; @@ -204,7 +204,7 @@ long udf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  		goto out;  	case UDF_RELOCATE_BLOCKS:  		if (!capable(CAP_SYS_ADMIN)) { -			result = -EACCES; +			result = -EPERM;  			goto out;  		}  		if (get_user(old_block, (long __user *)arg)) { diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 95fee278ab9..102c072c6bb 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c @@ -1270,10 +1270,10 @@ static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp,  	if (parent && (len < 5)) {  		*lenp = 5; -		return 255; +		return FILEID_INVALID;  	} else if (len < 3) {  		*lenp = 3; -		return 255; +		return FILEID_INVALID;  	}  	*lenp = 3; diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index dbc90994715..3a75ca09c50 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -433,7 +433,7 @@ static int  ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)  {  	loff_t pos = filp->f_pos; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct super_block *sb = inode->i_sb;  	unsigned int offset = pos & ~PAGE_CACHE_MASK;  	unsigned long n = pos >> PAGE_CACHE_SHIFT; diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index a8bd26b82ec..f852b082a08 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -78,14 +78,14 @@ xfs_swapext(  		goto out_put_tmp_file;  	} -	if (IS_SWAPFILE(f.file->f_path.dentry->d_inode) || -	    IS_SWAPFILE(tmp.file->f_path.dentry->d_inode)) { +	if (IS_SWAPFILE(file_inode(f.file)) || +	    IS_SWAPFILE(file_inode(tmp.file))) {  		error = XFS_ERROR(EINVAL);  		goto out_put_tmp_file;  	} -	ip = XFS_I(f.file->f_path.dentry->d_inode); -	tip = XFS_I(tmp.file->f_path.dentry->d_inode); +	ip = XFS_I(file_inode(f.file)); +	tip = XFS_I(file_inode(tmp.file));  	if (ip->i_mount != tip->i_mount) {  		error = XFS_ERROR(EINVAL); diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index a83611849ce..c585bc64639 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -48,7 +48,7 @@ static int xfs_fileid_length(int fileid_type)  	case FILEID_INO32_GEN_PARENT | XFS_FILEID_TYPE_64FLAG:  		return 6;  	} -	return 255; /* invalid */ +	return FILEID_INVALID;  }  STATIC int @@ -90,7 +90,7 @@ xfs_fs_encode_fh(  	len = xfs_fileid_length(fileid_type);  	if (*max_len < len) {  		*max_len = len; -		return 255; +		return FILEID_INVALID;  	}  	*max_len = len; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 67284edb84d..f03bf1a456f 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -811,7 +811,7 @@ xfs_file_fallocate(  	loff_t		offset,  	loff_t		len)  { -	struct inode	*inode = file->f_path.dentry->d_inode; +	struct inode	*inode = file_inode(file);  	long		error;  	loff_t		new_size = 0;  	xfs_flock64_t	bf; @@ -912,7 +912,7 @@ xfs_file_readdir(  	void		*dirent,  	filldir_t	filldir)  { -	struct inode	*inode = filp->f_path.dentry->d_inode; +	struct inode	*inode = file_inode(filp);  	xfs_inode_t	*ip = XFS_I(inode);  	int		error;  	size_t		bufsize; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index c1c3ef88a26..d681e34c295 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -80,7 +80,7 @@ xfs_find_handle(  		f = fdget(hreq->fd);  		if (!f.file)  			return -EBADF; -		inode = f.file->f_path.dentry->d_inode; +		inode = file_inode(f.file);  	} else {  		error = user_lpath((const char __user *)hreq->path, &path);  		if (error) @@ -168,7 +168,7 @@ xfs_handle_to_dentry(  	/*  	 * Only allow handle opens under a directory.  	 */ -	if (!S_ISDIR(parfilp->f_path.dentry->d_inode->i_mode)) +	if (!S_ISDIR(file_inode(parfilp)->i_mode))  		return ERR_PTR(-ENOTDIR);  	if (hlen != sizeof(xfs_handle_t)) @@ -1334,7 +1334,7 @@ xfs_file_ioctl(  	unsigned int		cmd,  	unsigned long		p)  { -	struct inode		*inode = filp->f_path.dentry->d_inode; +	struct inode		*inode = file_inode(filp);  	struct xfs_inode	*ip = XFS_I(inode);  	struct xfs_mount	*mp = ip->i_mount;  	void			__user *arg = (void __user *)p; diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 1244274a567..63b8fc43215 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -530,7 +530,7 @@ xfs_file_compat_ioctl(  	unsigned		cmd,  	unsigned long		p)  { -	struct inode		*inode = filp->f_path.dentry->d_inode; +	struct inode		*inode = file_inode(filp);  	struct xfs_inode	*ip = XFS_I(inode);  	struct xfs_mount	*mp = ip->i_mount;  	void			__user *arg = (void __user *)p; diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 0530b986035..c3a09149f79 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -111,7 +111,6 @@ extern int suid_dumpable;  extern int setup_arg_pages(struct linux_binprm * bprm,  			   unsigned long stack_top,  			   int executable_stack); -extern int bprm_mm_init(struct linux_binprm *bprm);  extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);  extern int copy_strings_kernel(int argc, const char *const *argv,  			       struct linux_binprm *bprm); diff --git a/include/linux/dcache.h b/include/linux/dcache.h index c1754b59ddd..1a6bb81f0fe 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -145,6 +145,7 @@ enum dentry_d_lock_class  struct dentry_operations {  	int (*d_revalidate)(struct dentry *, unsigned int); +	int (*d_weak_revalidate)(struct dentry *, unsigned int);  	int (*d_hash)(const struct dentry *, const struct inode *,  			struct qstr *);  	int (*d_compare)(const struct dentry *, const struct inode *, @@ -192,6 +193,8 @@ struct dentry_operations {  #define DCACHE_GENOCIDE		0x0200  #define DCACHE_SHRINK_LIST	0x0400 +#define DCACHE_OP_WEAK_REVALIDATE	0x0800 +  #define DCACHE_NFSFS_RENAMED	0x1000       /* this dentry has been "silly renamed" and has to be deleted on the last        * dput() */ @@ -293,9 +296,9 @@ extern void d_move(struct dentry *, struct dentry *);  extern struct dentry *d_ancestor(struct dentry *, struct dentry *);  /* appendix may either be NULL or be used for transname suffixes */ -extern struct dentry *d_lookup(struct dentry *, struct qstr *); +extern struct dentry *d_lookup(const struct dentry *, const struct qstr *);  extern struct dentry *d_hash_and_lookup(struct dentry *, struct qstr *); -extern struct dentry *__d_lookup(struct dentry *, struct qstr *); +extern struct dentry *__d_lookup(const struct dentry *, const struct qstr *);  extern struct dentry *__d_lookup_rcu(const struct dentry *parent,  				const struct qstr *name,  				unsigned *seq, struct inode *inode); @@ -333,7 +336,6 @@ extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);  extern char *__d_path(const struct path *, const struct path *, char *, int);  extern char *d_absolute_path(const struct path *, char *, int);  extern char *d_path(const struct path *, char *, int); -extern char *d_path_with_unreachable(const struct path *, char *, int);  extern char *dentry_path_raw(struct dentry *, char *, int);  extern char *dentry_path(struct dentry *, char *, int); diff --git a/include/linux/elf.h b/include/linux/elf.h index 8c9048e3346..40a3c0e01b2 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -10,6 +10,10 @@       Override in asm/elf.h as needed.  */  # define elf_read_implies_exec(ex, have_pt_gnu_stack)	0  #endif +#ifndef SET_PERSONALITY +#define SET_PERSONALITY(ex) \ +	set_personality(PER_LINUX | (current->personality & (~PER_MASK))) +#endif  #if ELF_CLASS == ELFCLASS32 diff --git a/include/linux/fs.h b/include/linux/fs.h index 7d2e893ec3d..4e686a09946 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -769,7 +769,6 @@ struct file {  	} f_u;  	struct path		f_path;  #define f_dentry	f_path.dentry -#define f_vfsmnt	f_path.mnt  	const struct file_operations	*f_op;  	/* @@ -1807,7 +1806,6 @@ struct file_system_type {  #define FS_HAS_SUBTYPE		4  #define FS_USERNS_MOUNT		8	/* Can be mounted by userns root */  #define FS_USERNS_DEV_MOUNT	16 /* A userns mount does not imply MNT_NODEV */ -#define FS_REVAL_DOT		16384	/* Check the paths ".", ".." for staleness */  #define FS_RENAME_DOES_D_MOVE	32768	/* FS will handle d_move() during rename() internally. */  	struct dentry *(*mount) (struct file_system_type *, int,  		       const char *, void *); @@ -2217,6 +2215,11 @@ static inline bool execute_ok(struct inode *inode)  	return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);  } +static inline struct inode *file_inode(struct file *f) +{ +	return f->f_path.dentry->d_inode; +} +  /*   * get_write_access() gets write permission for a file.   * put_write_access() releases this write permission. @@ -2239,7 +2242,7 @@ static inline int get_write_access(struct inode *inode)  }  static inline int deny_write_access(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	return atomic_dec_unless_positive(&inode->i_writecount) ? 0 : -ETXTBSY;  }  static inline void put_write_access(struct inode * inode) @@ -2249,7 +2252,7 @@ static inline void put_write_access(struct inode * inode)  static inline void allow_write_access(struct file *file)  {  	if (file) -		atomic_inc(&file->f_path.dentry->d_inode->i_writecount); +		atomic_inc(&file_inode(file)->i_writecount);  }  #ifdef CONFIG_IMA  static inline void i_readcount_dec(struct inode *inode) @@ -2274,6 +2277,7 @@ static inline void i_readcount_inc(struct inode *inode)  extern int do_pipe_flags(int *, int);  extern int kernel_read(struct file *, loff_t, char *, unsigned long); +extern ssize_t kernel_write(struct file *, const char *, size_t, loff_t);  extern struct file * open_exec(const char *);  /* fs/dcache.c -- generic fs support functions */ @@ -2463,7 +2467,7 @@ extern int page_symlink(struct inode *inode, const char *symname, int len);  extern const struct inode_operations page_symlink_inode_operations;  extern int generic_readlink(struct dentry *, char __user *, int);  extern void generic_fillattr(struct inode *, struct kstat *); -extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *); +extern int vfs_getattr(struct path *, struct kstat *);  void __inode_add_bytes(struct inode *inode, loff_t bytes);  void inode_add_bytes(struct inode *inode, loff_t bytes);  void inode_sub_bytes(struct inode *inode, loff_t bytes); diff --git a/include/linux/fsnotify.h b/include/linux/fsnotify.h index 0fbfb4646d1..a78680a92db 100644 --- a/include/linux/fsnotify.h +++ b/include/linux/fsnotify.h @@ -244,7 +244,7 @@ static inline void fsnotify_open(struct file *file)  static inline void fsnotify_close(struct file *file)  {  	struct path *path = &file->f_path; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	fmode_t mode = file->f_mode;  	__u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE; diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index eedc334fb6f..16e4e9a643f 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -281,7 +281,7 @@ static inline struct hstate *hstate_inode(struct inode *i)  static inline struct hstate *hstate_file(struct file *f)  { -	return hstate_inode(f->f_dentry->d_inode); +	return hstate_inode(file_inode(f));  }  static inline struct hstate *hstate_vma(struct vm_area_struct *vma) diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index f5a051a7927..0e62d84f9f7 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -291,7 +291,7 @@ int           nlmsvc_unlock_all_by_ip(struct sockaddr *server_addr);  static inline struct inode *nlmsvc_file_inode(struct nlm_file *file)  { -	return file->f_file->f_path.dentry->d_inode; +	return file_inode(file->f_file);  }  static inline int __nlm_privileged_request4(const struct sockaddr *sap) diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 023c9867ff4..e5c4f609f22 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -477,7 +477,7 @@ static int mqueue_unlink(struct inode *dir, struct dentry *dentry)  static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,  				size_t count, loff_t *off)  { -	struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode); +	struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));  	char buffer[FILENT_SIZE];  	ssize_t ret; @@ -498,13 +498,13 @@ static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,  	if (ret <= 0)  		return ret; -	filp->f_path.dentry->d_inode->i_atime = filp->f_path.dentry->d_inode->i_ctime = CURRENT_TIME; +	file_inode(filp)->i_atime = file_inode(filp)->i_ctime = CURRENT_TIME;  	return ret;  }  static int mqueue_flush_file(struct file *filp, fl_owner_t id)  { -	struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode); +	struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));  	spin_lock(&info->lock);  	if (task_tgid(current) == info->notify_owner) @@ -516,7 +516,7 @@ static int mqueue_flush_file(struct file *filp, fl_owner_t id)  static unsigned int mqueue_poll_file(struct file *filp, struct poll_table_struct *poll_tab)  { -	struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode); +	struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));  	int retval = 0;  	poll_wait(filp, &info->wait_q, poll_tab); @@ -973,7 +973,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,  		goto out;  	} -	inode = f.file->f_path.dentry->d_inode; +	inode = file_inode(f.file);  	if (unlikely(f.file->f_op != &mqueue_file_operations)) {  		ret = -EBADF;  		goto out_fput; @@ -1089,7 +1089,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,  		goto out;  	} -	inode = f.file->f_path.dentry->d_inode; +	inode = file_inode(f.file);  	if (unlikely(f.file->f_op != &mqueue_file_operations)) {  		ret = -EBADF;  		goto out_fput; @@ -1249,7 +1249,7 @@ retry:  		goto out;  	} -	inode = f.file->f_path.dentry->d_inode; +	inode = file_inode(f.file);  	if (unlikely(f.file->f_op != &mqueue_file_operations)) {  		ret = -EBADF;  		goto out_fput; @@ -1323,7 +1323,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,  		goto out;  	} -	inode = f.file->f_path.dentry->d_inode; +	inode = file_inode(f.file);  	if (unlikely(f.file->f_op != &mqueue_file_operations)) {  		ret = -EBADF;  		goto out_fput; diff --git a/ipc/shm.c b/ipc/shm.c index be3ec9ae454..cb858df061d 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -193,7 +193,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)  	if (!is_file_hugepages(shp->shm_file))  		shmem_lock(shp->shm_file, 0, shp->mlock_user);  	else if (shp->mlock_user) -		user_shm_unlock(shp->shm_file->f_path.dentry->d_inode->i_size, +		user_shm_unlock(file_inode(shp->shm_file)->i_size,  						shp->mlock_user);  	fput (shp->shm_file);  	security_shm_free(shp); @@ -529,7 +529,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)  	 * shmid gets reported as "inode#" in /proc/pid/maps.  	 * proc-ps tools use this. Changing this will break them.  	 */ -	file->f_dentry->d_inode->i_ino = shp->shm_perm.id; +	file_inode(file)->i_ino = shp->shm_perm.id;  	ns->shm_tot += numpages;  	error = shp->shm_perm.id; @@ -678,7 +678,7 @@ static void shm_add_rss_swap(struct shmid_kernel *shp,  {  	struct inode *inode; -	inode = shp->shm_file->f_path.dentry->d_inode; +	inode = file_inode(shp->shm_file);  	if (is_file_hugepages(shp->shm_file)) {  		struct address_space *mapping = inode->i_mapping; @@ -1042,7 +1042,8 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr,  			  is_file_hugepages(shp->shm_file) ?  				&shm_file_operations_huge :  				&shm_file_operations); -	if (!file) +	err = PTR_ERR(file); +	if (IS_ERR(file))  		goto out_free;  	file->private_data = sfd; @@ -1175,7 +1176,7 @@ SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)  			(vma->vm_start - addr)/PAGE_SIZE == vma->vm_pgoff) { -			size = vma->vm_file->f_path.dentry->d_inode->i_size; +			size = file_inode(vma->vm_file)->i_size;  			do_munmap(mm, vma->vm_start, vma->vm_end - vma->vm_start);  			/*  			 * We discovered the size of the shm segment, so diff --git a/kernel/acct.c b/kernel/acct.c index e8b1627ab9c..b9bd7f098ee 100644 --- a/kernel/acct.c +++ b/kernel/acct.c @@ -205,7 +205,7 @@ static int acct_on(struct filename *pathname)  	if (IS_ERR(file))  		return PTR_ERR(file); -	if (!S_ISREG(file->f_path.dentry->d_inode->i_mode)) { +	if (!S_ISREG(file_inode(file)->i_mode)) {  		filp_close(file, NULL);  		return -EACCES;  	} diff --git a/kernel/cgroup.c b/kernel/cgroup.c index b5c64327e71..fb2fb11fbb2 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -2645,7 +2645,7 @@ static struct dentry *cgroup_lookup(struct inode *dir, struct dentry *dentry, un   */  static inline struct cftype *__file_cft(struct file *file)  { -	if (file->f_dentry->d_inode->i_fop != &cgroup_file_operations) +	if (file_inode(file)->i_fop != &cgroup_file_operations)  		return ERR_PTR(-EINVAL);  	return __d_cft(file->f_dentry);  } @@ -3902,7 +3902,7 @@ static int cgroup_write_event_control(struct cgroup *cgrp, struct cftype *cft,  	/* the process need read permission on control file */  	/* AV: shouldn't we check that it's been opened for read instead? */ -	ret = inode_permission(cfile->f_path.dentry->d_inode, MAY_READ); +	ret = inode_permission(file_inode(cfile), MAY_READ);  	if (ret < 0)  		goto fail; @@ -5489,7 +5489,7 @@ struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id)  	struct inode *inode;  	struct cgroup_subsys_state *css; -	inode = f->f_dentry->d_inode; +	inode = file_inode(f);  	/* check in cgroup filesystem dir */  	if (inode->i_op != &cgroup_dir_inode_operations)  		return ERR_PTR(-EBADF); diff --git a/kernel/events/core.c b/kernel/events/core.c index 5c75791d726..ccc457e3635 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -3691,7 +3691,7 @@ unlock:  static int perf_fasync(int fd, struct file *filp, int on)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct perf_event *event = filp->private_data;  	int retval; diff --git a/kernel/fork.c b/kernel/fork.c index 4133876d8cd..8f62b2a0f12 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -413,7 +413,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)  		tmp->vm_next = tmp->vm_prev = NULL;  		file = tmp->vm_file;  		if (file) { -			struct inode *inode = file->f_path.dentry->d_inode; +			struct inode *inode = file_inode(file);  			struct address_space *mapping = file->f_mapping;  			get_file(file); diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 4bd4faa6323..397db02209e 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -76,7 +76,7 @@ static int irq_affinity_list_proc_show(struct seq_file *m, void *v)  static ssize_t write_irq_affinity(int type, struct file *file,  		const char __user *buffer, size_t count, loff_t *pos)  { -	unsigned int irq = (int)(long)PDE(file->f_path.dentry->d_inode)->data; +	unsigned int irq = (int)(long)PDE(file_inode(file))->data;  	cpumask_var_t new_value;  	int err; diff --git a/kernel/module.c b/kernel/module.c index 921bed4794e..0925c9a7197 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2541,7 +2541,7 @@ static int copy_module_from_fd(int fd, struct load_info *info)  	if (err)  		goto out; -	err = vfs_getattr(file->f_vfsmnt, file->f_dentry, &stat); +	err = vfs_getattr(&file->f_path, &stat);  	if (err)  		goto out; diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index b781e66a8f2..afc0456f227 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c @@ -250,7 +250,7 @@ SYSCALL_DEFINE2(setns, int, fd, int, nstype)  		return PTR_ERR(file);  	err = -EINVAL; -	ei = PROC_I(file->f_dentry->d_inode); +	ei = PROC_I(file_inode(file));  	ops = ei->ns_ops;  	if (nstype && (ops->type != nstype))  		goto out; diff --git a/kernel/relay.c b/kernel/relay.c index e8cd2027abb..01ab081ac53 100644 --- a/kernel/relay.c +++ b/kernel/relay.c @@ -1139,7 +1139,7 @@ static ssize_t relay_file_read_subbufs(struct file *filp, loff_t *ppos,  	if (!desc->count)  		return 0; -	mutex_lock(&filp->f_path.dentry->d_inode->i_mutex); +	mutex_lock(&file_inode(filp)->i_mutex);  	do {  		if (!relay_file_read_avail(buf, *ppos))  			break; @@ -1159,7 +1159,7 @@ static ssize_t relay_file_read_subbufs(struct file *filp, loff_t *ppos,  			*ppos = relay_file_read_end_pos(buf, read_start, ret);  		}  	} while (desc->count && ret); -	mutex_unlock(&filp->f_path.dentry->d_inode->i_mutex); +	mutex_unlock(&file_inode(filp)->i_mutex);  	return desc->written;  } diff --git a/kernel/sys.c b/kernel/sys.c index 2e18d33ca77..e10566bee39 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1794,14 +1794,14 @@ SYSCALL_DEFINE1(umask, int, mask)  static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)  {  	struct fd exe; -	struct dentry *dentry; +	struct inode *inode;  	int err;  	exe = fdget(fd);  	if (!exe.file)  		return -EBADF; -	dentry = exe.file->f_path.dentry; +	inode = file_inode(exe.file);  	/*  	 * Because the original mm->exe_file points to executable file, make @@ -1809,11 +1809,11 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)  	 * overall picture.  	 */  	err = -EACCES; -	if (!S_ISREG(dentry->d_inode->i_mode)	|| +	if (!S_ISREG(inode->i_mode)	||  	    exe.file->f_path.mnt->mnt_flags & MNT_NOEXEC)  		goto exit; -	err = inode_permission(dentry->d_inode, MAY_EXEC); +	err = inode_permission(inode, MAY_EXEC);  	if (err)  		goto exit; diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index b669ca1fa10..b25115e8c7f 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c @@ -970,7 +970,6 @@ out:  static ssize_t bin_intvec(struct file *file,  	void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)  { -	mm_segment_t old_fs = get_fs();  	ssize_t copied = 0;  	char *buffer;  	ssize_t result; @@ -983,13 +982,10 @@ static ssize_t bin_intvec(struct file *file,  	if (oldval && oldlen) {  		unsigned __user *vec = oldval;  		size_t length = oldlen / sizeof(*vec); -		loff_t pos = 0;  		char *str, *end;  		int i; -		set_fs(KERNEL_DS); -		result = vfs_read(file, buffer, BUFSZ - 1, &pos); -		set_fs(old_fs); +		result = kernel_read(file, 0, buffer, BUFSZ - 1);  		if (result < 0)  			goto out_kfree; @@ -1016,7 +1012,6 @@ static ssize_t bin_intvec(struct file *file,  	if (newval && newlen) {  		unsigned __user *vec = newval;  		size_t length = newlen / sizeof(*vec); -		loff_t pos = 0;  		char *str, *end;  		int i; @@ -1032,9 +1027,7 @@ static ssize_t bin_intvec(struct file *file,  			str += snprintf(str, end - str, "%lu\t", value);  		} -		set_fs(KERNEL_DS); -		result = vfs_write(file, buffer, str - buffer, &pos); -		set_fs(old_fs); +		result = kernel_write(file, buffer, str - buffer, 0);  		if (result < 0)  			goto out_kfree;  	} @@ -1048,7 +1041,6 @@ out:  static ssize_t bin_ulongvec(struct file *file,  	void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)  { -	mm_segment_t old_fs = get_fs();  	ssize_t copied = 0;  	char *buffer;  	ssize_t result; @@ -1061,13 +1053,10 @@ static ssize_t bin_ulongvec(struct file *file,  	if (oldval && oldlen) {  		unsigned long __user *vec = oldval;  		size_t length = oldlen / sizeof(*vec); -		loff_t pos = 0;  		char *str, *end;  		int i; -		set_fs(KERNEL_DS); -		result = vfs_read(file, buffer, BUFSZ - 1, &pos); -		set_fs(old_fs); +		result = kernel_read(file, 0, buffer, BUFSZ - 1);  		if (result < 0)  			goto out_kfree; @@ -1094,7 +1083,6 @@ static ssize_t bin_ulongvec(struct file *file,  	if (newval && newlen) {  		unsigned long __user *vec = newval;  		size_t length = newlen / sizeof(*vec); -		loff_t pos = 0;  		char *str, *end;  		int i; @@ -1110,9 +1098,7 @@ static ssize_t bin_ulongvec(struct file *file,  			str += snprintf(str, end - str, "%lu\t", value);  		} -		set_fs(KERNEL_DS); -		result = vfs_write(file, buffer, str - buffer, &pos); -		set_fs(old_fs); +		result = kernel_write(file, buffer, str - buffer, 0);  		if (result < 0)  			goto out_kfree;  	} @@ -1126,19 +1112,15 @@ out:  static ssize_t bin_uuid(struct file *file,  	void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)  { -	mm_segment_t old_fs = get_fs();  	ssize_t result, copied = 0;  	/* Only supports reads */  	if (oldval && oldlen) { -		loff_t pos = 0;  		char buf[40], *str = buf;  		unsigned char uuid[16];  		int i; -		set_fs(KERNEL_DS); -		result = vfs_read(file, buf, sizeof(buf) - 1, &pos); -		set_fs(old_fs); +		result = kernel_read(file, 0, buf, sizeof(buf) - 1);  		if (result < 0)  			goto out; @@ -1174,18 +1156,14 @@ out:  static ssize_t bin_dn_node_address(struct file *file,  	void __user *oldval, size_t oldlen, void __user *newval, size_t newlen)  { -	mm_segment_t old_fs = get_fs();  	ssize_t result, copied = 0;  	if (oldval && oldlen) { -		loff_t pos = 0;  		char buf[15], *nodep;  		unsigned long area, node;  		__le16 dnaddr; -		set_fs(KERNEL_DS); -		result = vfs_read(file, buf, sizeof(buf) - 1, &pos); -		set_fs(old_fs); +		result = kernel_read(file, 0, buf, sizeof(buf) - 1);  		if (result < 0)  			goto out; @@ -1214,7 +1192,6 @@ static ssize_t bin_dn_node_address(struct file *file,  	}  	if (newval && newlen) { -		loff_t pos = 0;  		__le16 dnaddr;  		char buf[15];  		int len; @@ -1231,9 +1208,7 @@ static ssize_t bin_dn_node_address(struct file *file,  				le16_to_cpu(dnaddr) >> 10,  				le16_to_cpu(dnaddr) & 0x3ff); -		set_fs(KERNEL_DS); -		result = vfs_write(file, buf, len, &pos); -		set_fs(old_fs); +		result = kernel_write(file, buf, len, 0);  		if (result < 0)  			goto out;  	} diff --git a/mm/cleancache.c b/mm/cleancache.c index 32e6f4136fa..d76ba74be2d 100644 --- a/mm/cleancache.c +++ b/mm/cleancache.c @@ -89,7 +89,7 @@ static int cleancache_get_key(struct inode *inode,  		fhfn = sb->s_export_op->encode_fh;  		if  (fhfn) {  			len = (*fhfn)(inode, &key->u.fh[0], &maxlen, NULL); -			if (len <= 0 || len == 255) +			if (len <= FILEID_ROOT || len == FILEID_INVALID)  				return -1;  			if (maxlen > CLEANCACHE_KEY_MAX)  				return -1; diff --git a/mm/fadvise.c b/mm/fadvise.c index 909ec558625..7e092689a12 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c @@ -39,7 +39,7 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice)  	if (!f.file)  		return -EBADF; -	if (S_ISFIFO(f.file->f_path.dentry->d_inode->i_mode)) { +	if (S_ISFIFO(file_inode(f.file)->i_mode)) {  		ret = -ESPIPE;  		goto out;  	} diff --git a/mm/filemap.c b/mm/filemap.c index c610076c30e..e1979fdca80 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1711,7 +1711,7 @@ EXPORT_SYMBOL(filemap_fault);  int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct page *page = vmf->page; -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	int ret = VM_FAULT_LOCKED;  	sb_start_pagefault(inode->i_sb); diff --git a/mm/hugetlb.c b/mm/hugetlb.c index cdb64e4d238..0a0be33bb19 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -127,7 +127,7 @@ static inline struct hugepage_subpool *subpool_inode(struct inode *inode)  static inline struct hugepage_subpool *subpool_vma(struct vm_area_struct *vma)  { -	return subpool_inode(vma->vm_file->f_dentry->d_inode); +	return subpool_inode(file_inode(vma->vm_file));  }  /* @@ -2479,7 +2479,7 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,  	address = address & huge_page_mask(h);  	pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) +  			vma->vm_pgoff; -	mapping = vma->vm_file->f_dentry->d_inode->i_mapping; +	mapping = file_inode(vma->vm_file)->i_mapping;  	/*  	 * Take the mapping lock for the duration of the table walk. As diff --git a/mm/mmap.c b/mm/mmap.c index 318e121affd..37a1fcac029 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -203,7 +203,7 @@ static void __remove_shared_vm_struct(struct vm_area_struct *vma,  		struct file *file, struct address_space *mapping)  {  	if (vma->vm_flags & VM_DENYWRITE) -		atomic_inc(&file->f_path.dentry->d_inode->i_writecount); +		atomic_inc(&file_inode(file)->i_writecount);  	if (vma->vm_flags & VM_SHARED)  		mapping->i_mmap_writable--; @@ -576,7 +576,7 @@ static void __vma_link_file(struct vm_area_struct *vma)  		struct address_space *mapping = file->f_mapping;  		if (vma->vm_flags & VM_DENYWRITE) -			atomic_dec(&file->f_path.dentry->d_inode->i_writecount); +			atomic_dec(&file_inode(file)->i_writecount);  		if (vma->vm_flags & VM_SHARED)  			mapping->i_mmap_writable++; @@ -1229,7 +1229,7 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,  			return -EAGAIN;  	} -	inode = file ? file->f_path.dentry->d_inode : NULL; +	inode = file ? file_inode(file) : NULL;  	if (file) {  		switch (flags & MAP_TYPE) { @@ -1431,7 +1431,7 @@ unsigned long mmap_region(struct file *file, unsigned long addr,  	int error;  	struct rb_node **rb_link, *rb_parent;  	unsigned long charged = 0; -	struct inode *inode =  file ? file->f_path.dentry->d_inode : NULL; +	struct inode *inode =  file ? file_inode(file) : NULL;  	/* Clear old maps */  	error = -ENOMEM; diff --git a/mm/nommu.c b/mm/nommu.c index da0d210fd40..e1932808753 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -943,7 +943,7 @@ static int validate_mmap_request(struct file *file,  		 */  		mapping = file->f_mapping;  		if (!mapping) -			mapping = file->f_path.dentry->d_inode->i_mapping; +			mapping = file_inode(file)->i_mapping;  		capabilities = 0;  		if (mapping && mapping->backing_dev_info) @@ -952,7 +952,7 @@ static int validate_mmap_request(struct file *file,  		if (!capabilities) {  			/* no explicit capabilities set, so assume some  			 * defaults */ -			switch (file->f_path.dentry->d_inode->i_mode & S_IFMT) { +			switch (file_inode(file)->i_mode & S_IFMT) {  			case S_IFREG:  			case S_IFBLK:  				capabilities = BDI_CAP_MAP_COPY; @@ -987,11 +987,11 @@ static int validate_mmap_request(struct file *file,  			    !(file->f_mode & FMODE_WRITE))  				return -EACCES; -			if (IS_APPEND(file->f_path.dentry->d_inode) && +			if (IS_APPEND(file_inode(file)) &&  			    (file->f_mode & FMODE_WRITE))  				return -EACCES; -			if (locks_verify_locked(file->f_path.dentry->d_inode)) +			if (locks_verify_locked(file_inode(file)))  				return -EAGAIN;  			if (!(capabilities & BDI_CAP_MAP_DIRECT)) @@ -1327,8 +1327,8 @@ unsigned long do_mmap_pgoff(struct file *file,  				continue;  			/* search for overlapping mappings on the same file */ -			if (pregion->vm_file->f_path.dentry->d_inode != -			    file->f_path.dentry->d_inode) +			if (file_inode(pregion->vm_file) != +			    file_inode(file))  				continue;  			if (pregion->vm_pgoff >= pgend) diff --git a/mm/shmem.c b/mm/shmem.c index 39de1d6a077..ed2befb4952 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1294,7 +1294,7 @@ unlock:  static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)  { -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	int error;  	int ret = VM_FAULT_LOCKED; @@ -1312,14 +1312,14 @@ static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)  #ifdef CONFIG_NUMA  static int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *mpol)  { -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	return mpol_set_shared_policy(&SHMEM_I(inode)->policy, vma, mpol);  }  static struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,  					  unsigned long addr)  { -	struct inode *inode = vma->vm_file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(vma->vm_file);  	pgoff_t index;  	index = ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; @@ -1329,7 +1329,7 @@ static struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,  int shmem_lock(struct file *file, int lock, struct user_struct *user)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct shmem_inode_info *info = SHMEM_I(inode);  	int retval = -ENOMEM; @@ -1464,7 +1464,7 @@ shmem_write_end(struct file *file, struct address_space *mapping,  static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_t *desc, read_actor_t actor)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct address_space *mapping = inode->i_mapping;  	pgoff_t index;  	unsigned long offset; @@ -1807,7 +1807,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence)  static long shmem_fallocate(struct file *file, int mode, loff_t offset,  							 loff_t len)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);  	struct shmem_falloc shmem_falloc;  	pgoff_t start, index, end; @@ -2350,7 +2350,7 @@ static int shmem_encode_fh(struct inode *inode, __u32 *fh, int *len,  {  	if (*len < 3) {  		*len = 3; -		return 255; +		return FILEID_INVALID;  	}  	if (inode_unhashed(inode)) { @@ -2879,6 +2879,16 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);  /* common code */ +static char *shmem_dname(struct dentry *dentry, char *buffer, int buflen) +{ +	return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)", +				dentry->d_name.name); +} + +static struct dentry_operations anon_ops = { +	.d_dname = shmem_dname +}; +  /**   * shmem_file_setup - get an unlinked file living in tmpfs   * @name: name for dentry (to be seen in /proc/<pid>/maps @@ -2887,15 +2897,14 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);   */  struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags)  { -	int error; -	struct file *file; +	struct file *res;  	struct inode *inode;  	struct path path; -	struct dentry *root; +	struct super_block *sb;  	struct qstr this;  	if (IS_ERR(shm_mnt)) -		return (void *)shm_mnt; +		return ERR_CAST(shm_mnt);  	if (size < 0 || size > MAX_LFS_FILESIZE)  		return ERR_PTR(-EINVAL); @@ -2903,18 +2912,19 @@ struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags  	if (shmem_acct_size(flags, size))  		return ERR_PTR(-ENOMEM); -	error = -ENOMEM; +	res = ERR_PTR(-ENOMEM);  	this.name = name;  	this.len = strlen(name);  	this.hash = 0; /* will go */ -	root = shm_mnt->mnt_root; -	path.dentry = d_alloc(root, &this); +	sb = shm_mnt->mnt_sb; +	path.dentry = d_alloc_pseudo(sb, &this);  	if (!path.dentry)  		goto put_memory; +	d_set_d_op(path.dentry, &anon_ops);  	path.mnt = mntget(shm_mnt); -	error = -ENOSPC; -	inode = shmem_get_inode(root->d_sb, NULL, S_IFREG | S_IRWXUGO, 0, flags); +	res = ERR_PTR(-ENOSPC); +	inode = shmem_get_inode(sb, NULL, S_IFREG | S_IRWXUGO, 0, flags);  	if (!inode)  		goto put_dentry; @@ -2923,23 +2933,23 @@ struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags  	clear_nlink(inode);	/* It is unlinked */  #ifndef CONFIG_MMU  	error = ramfs_nommu_expand_for_mapping(inode, size); +	res = ERR_PTR(error);  	if (error)  		goto put_dentry;  #endif -	error = -ENFILE; -	file = alloc_file(&path, FMODE_WRITE | FMODE_READ, +	res = alloc_file(&path, FMODE_WRITE | FMODE_READ,  		  &shmem_file_operations); -	if (!file) +	if (IS_ERR(res))  		goto put_dentry; -	return file; +	return res;  put_dentry:  	path_put(&path);  put_memory:  	shmem_unacct_size(flags, size); -	return ERR_PTR(error); +	return res;  }  EXPORT_SYMBOL_GPL(shmem_file_setup); diff --git a/mm/swapfile.c b/mm/swapfile.c index c72c648f750..a1f7772a01f 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1774,7 +1774,7 @@ static int swap_show(struct seq_file *swap, void *v)  	len = seq_path(swap, &file->f_path, " \t\n\\");  	seq_printf(swap, "%*s%s\t%u\t%u\t%d\n",  			len < 40 ? 40 - len : 1, " ", -			S_ISBLK(file->f_path.dentry->d_inode->i_mode) ? +			S_ISBLK(file_inode(file)->i_mode) ?  				"partition" : "file\t",  			si->pages << (PAGE_SHIFT - 10),  			si->inuse_pages << (PAGE_SHIFT - 10), diff --git a/net/atm/proc.c b/net/atm/proc.c index b4e75340b16..6ac35ff0d6b 100644 --- a/net/atm/proc.c +++ b/net/atm/proc.c @@ -385,7 +385,7 @@ static ssize_t proc_dev_atm_read(struct file *file, char __user *buf,  	page = get_zeroed_page(GFP_KERNEL);  	if (!page)  		return -ENOMEM; -	dev = PDE(file->f_path.dentry->d_inode)->data; +	dev = PDE(file_inode(file))->data;  	if (!dev->ops->proc_read)  		length = -EINVAL;  	else { diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 8acce01b6da..80e271d9e64 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -344,7 +344,7 @@ struct net *get_net_ns_by_fd(int fd)  	if (IS_ERR(file))  		return ERR_CAST(file); -	ei = PROC_I(file->f_dentry->d_inode); +	ei = PROC_I(file_inode(file));  	if (ei->ns_ops == &netns_operations)  		net = get_net(ei->ns);  	else diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index 75e33a7048f..5852b249054 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c @@ -657,7 +657,7 @@ static int clusterip_proc_release(struct inode *inode, struct file *file)  static ssize_t clusterip_proc_write(struct file *file, const char __user *input,  				size_t size, loff_t *ofs)  { -	struct clusterip_config *c = PDE(file->f_path.dentry->d_inode)->data; +	struct clusterip_config *c = PDE(file_inode(file))->data;  #define PROC_WRITELEN	10  	char buffer[PROC_WRITELEN+1];  	unsigned long nodenum; diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c index 31bf233dae9..d9cad315229 100644 --- a/net/netfilter/xt_recent.c +++ b/net/netfilter/xt_recent.c @@ -540,7 +540,7 @@ static ssize_t  recent_mt_proc_write(struct file *file, const char __user *input,  		     size_t size, loff_t *loff)  { -	const struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode); +	const struct proc_dir_entry *pde = PDE(file_inode(file));  	struct recent_table *t = pde->data;  	struct recent_entry *e;  	char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")]; diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 3d55e0c713e..8097b4f3ead 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -809,7 +809,7 @@ static struct sock *netlink_getsockbyportid(struct sock *ssk, u32 portid)  struct sock *netlink_getsockbyfilp(struct file *filp)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct sock *sock;  	if (!S_ISSOCK(inode->i_mode)) diff --git a/net/socket.c b/net/socket.c index ee0d029e513..88f759adf3a 100644 --- a/net/socket.c +++ b/net/socket.c @@ -369,16 +369,15 @@ struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname)  	file = alloc_file(&path, FMODE_READ | FMODE_WRITE,  		  &socket_file_ops); -	if (unlikely(!file)) { +	if (unlikely(IS_ERR(file))) {  		/* drop dentry, keep inode */  		ihold(path.dentry->d_inode);  		path_put(&path); -		return ERR_PTR(-ENFILE); +		return file;  	}  	sock->file = file;  	file->f_flags = O_RDWR | (flags & O_NONBLOCK); -	file->f_pos = 0;  	file->private_data = sock;  	return file;  } diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 6ea29f4ed6c..5257d2982ba 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -620,7 +620,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)  	const void *p, *end;  	void *buf;  	struct gss_upcall_msg *gss_msg; -	struct rpc_pipe *pipe = RPC_I(filp->f_dentry->d_inode)->pipe; +	struct rpc_pipe *pipe = RPC_I(file_inode(filp))->pipe;  	struct gss_cl_ctx *ctx;  	uid_t id;  	kuid_t uid; diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 9afa4393c21..f3897d10f64 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -755,7 +755,7 @@ static ssize_t cache_read(struct file *filp, char __user *buf, size_t count,  {  	struct cache_reader *rp = filp->private_data;  	struct cache_request *rq; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int err;  	if (count == 0) @@ -886,7 +886,7 @@ static ssize_t cache_write(struct file *filp, const char __user *buf,  			   struct cache_detail *cd)  {  	struct address_space *mapping = filp->f_mapping; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	ssize_t ret = -EINVAL;  	if (!cd->cache_parse) @@ -1454,7 +1454,7 @@ static ssize_t write_flush(struct file *file, const char __user *buf,  static ssize_t cache_read_procfs(struct file *filp, char __user *buf,  				 size_t count, loff_t *ppos)  { -	struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data; +	struct cache_detail *cd = PDE(file_inode(filp))->data;  	return cache_read(filp, buf, count, ppos, cd);  } @@ -1462,14 +1462,14 @@ static ssize_t cache_read_procfs(struct file *filp, char __user *buf,  static ssize_t cache_write_procfs(struct file *filp, const char __user *buf,  				  size_t count, loff_t *ppos)  { -	struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data; +	struct cache_detail *cd = PDE(file_inode(filp))->data;  	return cache_write(filp, buf, count, ppos, cd);  }  static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)  { -	struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data; +	struct cache_detail *cd = PDE(file_inode(filp))->data;  	return cache_poll(filp, wait, cd);  } @@ -1477,7 +1477,7 @@ static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)  static long cache_ioctl_procfs(struct file *filp,  			       unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct cache_detail *cd = PDE(inode)->data;  	return cache_ioctl(inode, filp, cmd, arg, cd); @@ -1546,7 +1546,7 @@ static int release_flush_procfs(struct inode *inode, struct file *filp)  static ssize_t read_flush_procfs(struct file *filp, char __user *buf,  			    size_t count, loff_t *ppos)  { -	struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data; +	struct cache_detail *cd = PDE(file_inode(filp))->data;  	return read_flush(filp, buf, count, ppos, cd);  } @@ -1555,7 +1555,7 @@ static ssize_t write_flush_procfs(struct file *filp,  				  const char __user *buf,  				  size_t count, loff_t *ppos)  { -	struct cache_detail *cd = PDE(filp->f_path.dentry->d_inode)->data; +	struct cache_detail *cd = PDE(file_inode(filp))->data;  	return write_flush(filp, buf, count, ppos, cd);  } @@ -1686,7 +1686,7 @@ EXPORT_SYMBOL_GPL(cache_destroy_net);  static ssize_t cache_read_pipefs(struct file *filp, char __user *buf,  				 size_t count, loff_t *ppos)  { -	struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private; +	struct cache_detail *cd = RPC_I(file_inode(filp))->private;  	return cache_read(filp, buf, count, ppos, cd);  } @@ -1694,14 +1694,14 @@ static ssize_t cache_read_pipefs(struct file *filp, char __user *buf,  static ssize_t cache_write_pipefs(struct file *filp, const char __user *buf,  				  size_t count, loff_t *ppos)  { -	struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private; +	struct cache_detail *cd = RPC_I(file_inode(filp))->private;  	return cache_write(filp, buf, count, ppos, cd);  }  static unsigned int cache_poll_pipefs(struct file *filp, poll_table *wait)  { -	struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private; +	struct cache_detail *cd = RPC_I(file_inode(filp))->private;  	return cache_poll(filp, wait, cd);  } @@ -1709,7 +1709,7 @@ static unsigned int cache_poll_pipefs(struct file *filp, poll_table *wait)  static long cache_ioctl_pipefs(struct file *filp,  			      unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct cache_detail *cd = RPC_I(inode)->private;  	return cache_ioctl(inode, filp, cmd, arg, cd); @@ -1778,7 +1778,7 @@ static int release_flush_pipefs(struct inode *inode, struct file *filp)  static ssize_t read_flush_pipefs(struct file *filp, char __user *buf,  			    size_t count, loff_t *ppos)  { -	struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private; +	struct cache_detail *cd = RPC_I(file_inode(filp))->private;  	return read_flush(filp, buf, count, ppos, cd);  } @@ -1787,7 +1787,7 @@ static ssize_t write_flush_pipefs(struct file *filp,  				  const char __user *buf,  				  size_t count, loff_t *ppos)  { -	struct cache_detail *cd = RPC_I(filp->f_path.dentry->d_inode)->private; +	struct cache_detail *cd = RPC_I(file_inode(filp))->private;  	return write_flush(filp, buf, count, ppos, cd);  } diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index fd10981ea79..7b9b40224a2 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -284,7 +284,7 @@ out:  static ssize_t  rpc_pipe_read(struct file *filp, char __user *buf, size_t len, loff_t *offset)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct rpc_pipe *pipe;  	struct rpc_pipe_msg *msg;  	int res = 0; @@ -328,7 +328,7 @@ out_unlock:  static ssize_t  rpc_pipe_write(struct file *filp, const char __user *buf, size_t len, loff_t *offset)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	int res;  	mutex_lock(&inode->i_mutex); @@ -342,7 +342,7 @@ rpc_pipe_write(struct file *filp, const char __user *buf, size_t len, loff_t *of  static unsigned int  rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct rpc_inode *rpci = RPC_I(inode);  	unsigned int mask = POLLOUT | POLLWRNORM; @@ -360,7 +360,7 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait)  static long  rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  { -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	struct rpc_pipe *pipe;  	int len; @@ -830,7 +830,7 @@ static int rpc_rmdir_depopulate(struct dentry *dentry,   * responses to upcalls.  They will result in calls to @msg->downcall.   *   * The @private argument passed here will be available to all these methods - * from the file pointer, via RPC_I(file->f_dentry->d_inode)->private. + * from the file pointer, via RPC_I(file_inode(file))->private.   */  struct dentry *rpc_mkpipe_dentry(struct dentry *parent, const char *name,  				 void *private, struct rpc_pipe *pipe) diff --git a/net/unix/garbage.c b/net/unix/garbage.c index b6f4b994eb3..d0f6545b001 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c @@ -99,7 +99,7 @@ unsigned int unix_tot_inflight;  struct sock *unix_get_socket(struct file *filp)  {  	struct sock *u_sock = NULL; -	struct inode *inode = filp->f_path.dentry->d_inode; +	struct inode *inode = file_inode(filp);  	/*  	 *	Socket ? diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c index 60f0c76a27d..859abdaac1e 100644 --- a/security/apparmor/domain.c +++ b/security/apparmor/domain.c @@ -349,8 +349,8 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm)  	unsigned int state;  	struct file_perms perms = {};  	struct path_cond cond = { -		bprm->file->f_path.dentry->d_inode->i_uid, -		bprm->file->f_path.dentry->d_inode->i_mode +		file_inode(bprm->file)->i_uid, +		file_inode(bprm->file)->i_mode  	};  	const char *name = NULL, *target = NULL, *info = NULL;  	int error = cap_bprm_set_creds(bprm); diff --git a/security/apparmor/file.c b/security/apparmor/file.c index cd21ec5b90a..fdaa50cb187 100644 --- a/security/apparmor/file.c +++ b/security/apparmor/file.c @@ -449,8 +449,8 @@ int aa_file_perm(int op, struct aa_profile *profile, struct file *file,  		 u32 request)  {  	struct path_cond cond = { -		.uid = file->f_path.dentry->d_inode->i_uid, -		.mode = file->f_path.dentry->d_inode->i_mode +		.uid = file_inode(file)->i_uid, +		.mode = file_inode(file)->i_mode  	};  	return aa_path_perm(op, profile, &file->f_path, PATH_DELEGATE_DELETED, diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index 8c2a7f6b35e..b21830eced4 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -379,7 +379,7 @@ static int apparmor_file_open(struct file *file, const struct cred *cred)  	struct aa_profile *profile;  	int error = 0; -	if (!mediated_filesystem(file->f_path.dentry->d_inode)) +	if (!mediated_filesystem(file_inode(file)))  		return 0;  	/* If in exec, permission is handled by bprm hooks. @@ -394,7 +394,7 @@ static int apparmor_file_open(struct file *file, const struct cred *cred)  	profile = aa_cred_profile(cred);  	if (!unconfined(profile)) { -		struct inode *inode = file->f_path.dentry->d_inode; +		struct inode *inode = file_inode(file);  		struct path_cond cond = { inode->i_uid, inode->i_mode };  		error = aa_path_perm(OP_OPEN, profile, &file->f_path, 0, @@ -432,7 +432,7 @@ static int common_file_perm(int op, struct file *file, u32 mask)  	BUG_ON(!fprofile);  	if (!file->f_path.mnt || -	    !mediated_filesystem(file->f_path.dentry->d_inode)) +	    !mediated_filesystem(file_inode(file)))  		return 0;  	profile = __aa_current_profile(); diff --git a/security/commoncap.c b/security/commoncap.c index 7ee08c756d6..c44b6fe6648 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -440,7 +440,7 @@ static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_c  	if (!file_caps_enabled)  		return 0; -	if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID) +	if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)  		return 0;  	dentry = dget(bprm->file->f_dentry); diff --git a/security/integrity/ima/ima_api.c b/security/integrity/ima/ima_api.c index d9030b29d84..1c03e8f1e0e 100644 --- a/security/integrity/ima/ima_api.c +++ b/security/integrity/ima/ima_api.c @@ -140,12 +140,12 @@ int ima_must_measure(struct inode *inode, int mask, int function)  int ima_collect_measurement(struct integrity_iint_cache *iint,  			    struct file *file)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	const char *filename = file->f_dentry->d_name.name;  	int result = 0;  	if (!(iint->flags & IMA_COLLECTED)) { -		u64 i_version = file->f_dentry->d_inode->i_version; +		u64 i_version = file_inode(file)->i_version;  		iint->ima_xattr.type = IMA_XATTR_DIGEST;  		result = ima_calc_file_hash(file, iint->ima_xattr.digest); @@ -182,7 +182,7 @@ void ima_store_measurement(struct integrity_iint_cache *iint,  	const char *op = "add_template_measure";  	const char *audit_cause = "ENOMEM";  	int result = -ENOMEM; -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct ima_template_entry *entry;  	int violation = 0; diff --git a/security/integrity/ima/ima_crypto.c b/security/integrity/ima/ima_crypto.c index b691e0f3830..a02e0791cf1 100644 --- a/security/integrity/ima/ima_crypto.c +++ b/security/integrity/ima/ima_crypto.c @@ -66,7 +66,7 @@ int ima_calc_file_hash(struct file *file, char *digest)  		file->f_mode |= FMODE_READ;  		read = 1;  	} -	i_size = i_size_read(file->f_dentry->d_inode); +	i_size = i_size_read(file_inode(file));  	while (offset < i_size) {  		int rbuf_len; diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c index 5b14a0946d6..3b3b7e6bf8d 100644 --- a/security/integrity/ima/ima_main.c +++ b/security/integrity/ima/ima_main.c @@ -126,7 +126,7 @@ static void ima_check_last_writer(struct integrity_iint_cache *iint,   */  void ima_file_free(struct file *file)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct integrity_iint_cache *iint;  	if (!iint_initialized || !S_ISREG(inode->i_mode)) @@ -142,7 +142,7 @@ void ima_file_free(struct file *file)  static int process_measurement(struct file *file, const char *filename,  			       int mask, int function)  { -	struct inode *inode = file->f_dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct integrity_iint_cache *iint;  	char *pathbuf = NULL;  	const char *pathname = NULL; diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index ef26e9611ff..84b591711ee 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -1528,7 +1528,7 @@ static int file_has_perm(const struct cred *cred,  			 u32 av)  {  	struct file_security_struct *fsec = file->f_security; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct common_audit_data ad;  	u32 sid = cred_sid(cred);  	int rc; @@ -1957,7 +1957,7 @@ static int selinux_bprm_set_creds(struct linux_binprm *bprm)  	struct task_security_struct *new_tsec;  	struct inode_security_struct *isec;  	struct common_audit_data ad; -	struct inode *inode = bprm->file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(bprm->file);  	int rc;  	rc = cap_bprm_set_creds(bprm); @@ -2929,7 +2929,7 @@ static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)  static int selinux_revalidate_file_permission(struct file *file, int mask)  {  	const struct cred *cred = current_cred(); -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */  	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE)) @@ -2941,7 +2941,7 @@ static int selinux_revalidate_file_permission(struct file *file, int mask)  static int selinux_file_permission(struct file *file, int mask)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct file_security_struct *fsec = file->f_security;  	struct inode_security_struct *isec = inode->i_security;  	u32 sid = current_sid(); @@ -3218,7 +3218,7 @@ static int selinux_file_open(struct file *file, const struct cred *cred)  	struct inode_security_struct *isec;  	fsec = file->f_security; -	isec = file->f_path.dentry->d_inode->i_security; +	isec = file_inode(file)->i_security;  	/*  	 * Save inode label and policy sequence number  	 * at open-time so that selinux_file_permission diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index 3a6e8731646..ff427733c29 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c @@ -202,7 +202,7 @@ static ssize_t sel_read_handle_unknown(struct file *filp, char __user *buf,  {  	char tmpbuf[TMPBUFLEN];  	ssize_t length; -	ino_t ino = filp->f_path.dentry->d_inode->i_ino; +	ino_t ino = file_inode(filp)->i_ino;  	int handle_unknown = (ino == SEL_REJECT_UNKNOWN) ?  		security_get_reject_unknown() : !security_get_allow_unknown(); @@ -671,7 +671,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {  static ssize_t selinux_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos)  { -	ino_t ino = file->f_path.dentry->d_inode->i_ino; +	ino_t ino = file_inode(file)->i_ino;  	char *data;  	ssize_t rv; @@ -1042,8 +1042,7 @@ static ssize_t sel_read_bool(struct file *filep, char __user *buf,  	ssize_t length;  	ssize_t ret;  	int cur_enforcing; -	struct inode *inode = filep->f_path.dentry->d_inode; -	unsigned index = inode->i_ino & SEL_INO_MASK; +	unsigned index = file_inode(filep)->i_ino & SEL_INO_MASK;  	const char *name = filep->f_path.dentry->d_name.name;  	mutex_lock(&sel_mutex); @@ -1077,8 +1076,7 @@ static ssize_t sel_write_bool(struct file *filep, const char __user *buf,  	char *page = NULL;  	ssize_t length;  	int new_value; -	struct inode *inode = filep->f_path.dentry->d_inode; -	unsigned index = inode->i_ino & SEL_INO_MASK; +	unsigned index = file_inode(filep)->i_ino & SEL_INO_MASK;  	const char *name = filep->f_path.dentry->d_name.name;  	mutex_lock(&sel_mutex); @@ -1486,13 +1484,11 @@ static int sel_make_avc_files(struct dentry *dir)  static ssize_t sel_read_initcon(struct file *file, char __user *buf,  				size_t count, loff_t *ppos)  { -	struct inode *inode;  	char *con;  	u32 sid, len;  	ssize_t ret; -	inode = file->f_path.dentry->d_inode; -	sid = inode->i_ino&SEL_INO_MASK; +	sid = file_inode(file)->i_ino&SEL_INO_MASK;  	ret = security_sid_to_context(sid, &con, &len);  	if (ret)  		return ret; @@ -1553,7 +1549,7 @@ static inline u32 sel_ino_to_perm(unsigned long ino)  static ssize_t sel_read_class(struct file *file, char __user *buf,  				size_t count, loff_t *ppos)  { -	unsigned long ino = file->f_path.dentry->d_inode->i_ino; +	unsigned long ino = file_inode(file)->i_ino;  	char res[TMPBUFLEN];  	ssize_t len = snprintf(res, sizeof(res), "%d", sel_ino_to_class(ino));  	return simple_read_from_buffer(buf, count, ppos, res, len); @@ -1567,7 +1563,7 @@ static const struct file_operations sel_class_ops = {  static ssize_t sel_read_perm(struct file *file, char __user *buf,  				size_t count, loff_t *ppos)  { -	unsigned long ino = file->f_path.dentry->d_inode->i_ino; +	unsigned long ino = file_inode(file)->i_ino;  	char res[TMPBUFLEN];  	ssize_t len = snprintf(res, sizeof(res), "%d", sel_ino_to_perm(ino));  	return simple_read_from_buffer(buf, count, ppos, res, len); @@ -1584,7 +1580,7 @@ static ssize_t sel_read_policycap(struct file *file, char __user *buf,  	int value;  	char tmpbuf[TMPBUFLEN];  	ssize_t length; -	unsigned long i_ino = file->f_path.dentry->d_inode->i_ino; +	unsigned long i_ino = file_inode(file)->i_ino;  	value = security_policycap_supported(i_ino & SEL_INO_MASK);  	length = scnprintf(tmpbuf, TMPBUFLEN, "%d", value); diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 38be92ce901..fa64740abb5 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -456,7 +456,7 @@ static int smack_sb_umount(struct vfsmount *mnt, int flags)   */  static int smack_bprm_set_creds(struct linux_binprm *bprm)  { -	struct inode *inode = bprm->file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(bprm->file);  	struct task_smack *bsp = bprm->cred->security;  	struct inode_smack *isp;  	int rc; @@ -1187,21 +1187,15 @@ static int smack_mmap_file(struct file *file,  	char *msmack;  	char *osmack;  	struct inode_smack *isp; -	struct dentry *dp;  	int may;  	int mmay;  	int tmay;  	int rc; -	if (file == NULL || file->f_dentry == NULL) -		return 0; - -	dp = file->f_dentry; - -	if (dp->d_inode == NULL) +	if (file == NULL)  		return 0; -	isp = dp->d_inode->i_security; +	isp = file_inode(file)->i_security;  	if (isp->smk_mmap == NULL)  		return 0;  	msmack = isp->smk_mmap; @@ -1359,7 +1353,7 @@ static int smack_file_receive(struct file *file)   */  static int smack_file_open(struct file *file, const struct cred *cred)  { -	struct inode_smack *isp = file->f_path.dentry->d_inode->i_security; +	struct inode_smack *isp = file_inode(file)->i_security;  	file->f_security = isp->smk_inode; diff --git a/security/tomoyo/securityfs_if.c b/security/tomoyo/securityfs_if.c index 8592f2fc6eb..fcf32783b66 100644 --- a/security/tomoyo/securityfs_if.c +++ b/security/tomoyo/securityfs_if.c @@ -135,7 +135,7 @@ static const struct file_operations tomoyo_self_operations = {   */  static int tomoyo_open(struct inode *inode, struct file *file)  { -	const int key = ((u8 *) file->f_path.dentry->d_inode->i_private) +	const int key = ((u8 *) file_inode(file)->i_private)  		- ((u8 *) NULL);  	return tomoyo_open_control(key, file);  } diff --git a/sound/core/info.c b/sound/core/info.c index 6b368d25073..5bb97e7d325 100644 --- a/sound/core/info.c +++ b/sound/core/info.c @@ -496,7 +496,7 @@ static long snd_info_entry_ioctl(struct file *file, unsigned int cmd,  static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct snd_info_private_data *data;  	struct snd_info_entry *entry; diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 09b4286c65f..71ae86ca64a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -1586,7 +1586,7 @@ static struct file *snd_pcm_file_fd(int fd, int *fput_needed)  	file = fget_light(fd, fput_needed);  	if (!file)  		return NULL; -	inode = file->f_path.dentry->d_inode; +	inode = file_inode(file);  	if (!S_ISCHR(inode->i_mode) ||  	    imajor(inode) != snd_major) {  		fput_light(file, *fput_needed); diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 536c4c0514d..11ff7c55240 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -642,7 +642,7 @@ static int mixer_ioctl(unsigned int cmd, unsigned long arg)  static long dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  { -	int minor = iminor(file->f_path.dentry->d_inode); +	int minor = iminor(file_inode(file));  	int ret;  	if (cmd == OSS_GETVERSION) { @@ -1012,7 +1012,7 @@ static int dsp_write(const char __user *buf, size_t len)  static ssize_t dev_read(struct file *file, char __user *buf, size_t count, loff_t *off)  { -	int minor = iminor(file->f_path.dentry->d_inode); +	int minor = iminor(file_inode(file));  	if (minor == dev.dsp_minor)  		return dsp_read(buf, count);  	else @@ -1021,7 +1021,7 @@ static ssize_t dev_read(struct file *file, char __user *buf, size_t count, loff_  static ssize_t dev_write(struct file *file, const char __user *buf, size_t count, loff_t *off)  { -	int minor = iminor(file->f_path.dentry->d_inode); +	int minor = iminor(file_inode(file));  	if (minor == dev.dsp_minor)  		return dsp_write(buf, count);  	else diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index 7c7793a0eb2..e7780349cc5 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c @@ -143,7 +143,7 @@ static int get_mixer_levels(void __user * arg)  static ssize_t sound_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)  { -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	int ret = -EINVAL;  	/* @@ -176,7 +176,7 @@ static ssize_t sound_read(struct file *file, char __user *buf, size_t count, lof  static ssize_t sound_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)  { -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	int ret = -EINVAL;  	mutex_lock(&soundcard_mutex); @@ -333,7 +333,7 @@ static int sound_mixer_ioctl(int mixdev, unsigned int cmd, void __user *arg)  static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  {  	int len = 0, dtype; -	int dev = iminor(file->f_dentry->d_inode); +	int dev = iminor(file_inode(file));  	long ret = -EINVAL;  	void __user *p = (void __user *)arg; @@ -406,7 +406,7 @@ static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  static unsigned int sound_poll(struct file *file, poll_table * wait)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	int dev = iminor(inode);  	DEB(printk("sound_poll(dev=%d)\n", dev)); @@ -431,7 +431,7 @@ static int sound_mmap(struct file *file, struct vm_area_struct *vma)  	int dev_class;  	unsigned long size;  	struct dma_buffparms *dmap = NULL; -	int dev = iminor(file->f_path.dentry->d_inode); +	int dev = iminor(file_inode(file));  	dev_class = dev & 0x0f;  	dev >>= 4; diff --git a/sound/sound_firmware.c b/sound/sound_firmware.c index 37711a5d0d6..e1490346805 100644 --- a/sound/sound_firmware.c +++ b/sound/sound_firmware.c @@ -19,7 +19,7 @@ static int do_mod_firmware_load(const char *fn, char **fp)  		printk(KERN_INFO "Unable to load '%s'.\n", fn);  		return 0;  	} -	l = i_size_read(filp->f_path.dentry->d_inode); +	l = i_size_read(file_inode(filp));  	if (l <= 0 || l > 131072)  	{  		printk(KERN_INFO "Invalid firmware '%s'\n", fn); |