Use struct path in struct nameidata
Subsystems (30)
cover Use struct path in struct nameidata
This is a respin of the patch series Andreas posted last month. It leaves out the restructuring of the intent which will be done at a later point in time.
There are three preparing patches that remove unneeded code IMHO. I haven't got feedback from Takashi since he is on holiday. Please, can somebody else acknowledge the changes?
Comments?
Jan
PATCH 1/10 Dont touch fs_struct in drivers
The sound drivers and the pnpbios core test for current->root != NULL. This test seems to be unnecessary since we always have rootfs mounted before initializing the drivers.
--- drivers/pnp/pnpbios/core.c | 2 -- sound/core/seq/seq_clientmgr.c | 4 ++-- sound/core/seq/seq_device.c | 3 --- sound/core/sound.c | 4 ---- sound/core/timer.c | 2 -- sound/ppc/daca.c | 5 ++--- sound/ppc/tumbler.c | 5 ++--- 7 files changed, 6 insertions(+), 19 deletions(-)
drivers/pnp/pnpbios/core.c +0 -2
@@ -105,8 +105,6 @@ static int pnp_dock_event(int dock, struchar *argv[3 ], **envp, *buf, *scratch;int i =0 , value; -if (!current->fs->root) -return -EAGAIN ;if (!(envp =kcalloc (20 ,sizeof (char *),GFP_KERNEL )))return -ENOMEM ;if (!(buf =kzalloc (256 ,GFP_KERNEL ))) {
sound/core/seq/seq_clientmgr.c +2 -2
@@ -152,13 +152,13 @@ struct snd_seq_client *snd_seq_client_us }spin_unlock_irqrestore (&clients_lock, flags);#ifdef CONFIG_KMOD -if (!in_interrupt () && current->fs->root) { +if (!in_interrupt ()) {static char client_requested[SNDRV_SEQ_GLOBAL_CLIENTS ];static char card_requested[SNDRV_CARDS ];if (clientid <SNDRV_SEQ_GLOBAL_CLIENTS ) {int idx; -if (! client_requested[clientid] && current->fs->root) { +if (!client_requested[clientid]) { client_requested[clientid] =1 ;for (idx =0 ; idx <15 ; idx++) {if (seq_client_load[idx] <0 )
sound/core/seq/seq_device.c +0 -3
@@ -150,9 +150,6 @@ void snd_seq_device_load_drivers(void)if (snd_seq_in_init)return ; -if (! current->fs->root) -return ; -mutex_lock (&ops_mutex);list_for_each_entry (ops, &opslist, list) { if (! (ops->driver & DRIVER_LOADED) &&
sound/core/sound.c +0 -4
@@ -72,8 +72,6 @@ static DEFINE_MUTEX(sound_mutex);*/ void snd_request_card (int card) { -if (! current->fs->root) -return ;if (snd_card_locked (card))return ;if (card <0 || card >= cards_limit)
@@ -87,8 +85,6 @@ static void snd_request_other(int minor) {char *str; -if (! current->fs->root) -return ;switch (minor) {case SNDRV_MINOR_SEQUENCER : str ="snd-seq" ;break ;case SNDRV_MINOR_TIMER : str ="snd-timer" ;break ;
sound/core/timer.c +0 -2
@@ -148,8 +148,6 @@ static struct snd_timer *snd_timer_find(static void snd_timer_request (struct snd_timer_id *tid) { -if (! current->fs->root) -return ;switch (tid->dev_class) {case SNDRV_TIMER_CLASS_GLOBAL :if (tid->device < timer_limit)
sound/ppc/daca.c +2 -3
@@ -254,9 +254,8 @@ int __init snd_pmac_daca_init(struct sndstruct pmac_daca *mix;#ifdef CONFIG_KMOD -if (current->fs->root) -request_module ("i2c-powermac" ); -#endif /* CONFIG_KMOD */ +request_module ("i2c-powermac" ); +#endif /* CONFIG_KMOD */ mix =kzalloc (sizeof (*mix),GFP_KERNEL );if (! mix)
sound/ppc/tumbler.c +2 -3
@@ -1327,9 +1327,8 @@ int __init snd_pmac_tumbler_init(structchar *chipname;#ifdef CONFIG_KMOD -if (current->fs->root) -request_module ("i2c-powermac" ); -#endif /* CONFIG_KMOD */ +request_module ("i2c-powermac" ); +#endif /* CONFIG_KMOD */ mix =kzalloc (sizeof (*mix),GFP_KERNEL );if (! mix)
Re: [patch 01/10] Dont touch fs_struct in drivers
Quoted 3 lines · On Thu, Sep 27, 2007 at 04:12:01PM +0200, [email protected] wrote:
The sound drivers and the pnpbios core test for
current->root!= NULL. This test seems to be unnecessary since we always have rootfs mounted before initializing the drivers.
Looks good. Amazing how far this crap has spread..
PATCH 2/10 Dont touch fs_struct in usermodehelper
In reply to [email protected]This test seems to be unnecessary since we always have rootfs mounted before calling a usermodehelper.
--- kernel/kmod.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
kernel/kmod.c +1 -4
@@ -173,10 +173,7 @@ static int ____call_usermodehelper(void*/ set_user_nice (current,0 ); - retval = -EPERM ; -if (current->fs->root) - retval =kernel_execve (sub_info->path, - sub_info->argv, sub_info->envp); + retval =kernel_execve (sub_info->path, sub_info->argv, sub_info->envp);/* Exec failed? */ sub_info->retval = retval;
Re: [patch 02/10] Dont touch fs_struct in usermodehelper
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:02PM +0200, [email protected] wrote:
This test seems to be unnecessary since we always have rootfs mounted before calling a usermodehelper.
Are you sure this is true? I thought we called the usermode helper for hotplug _very_ early in the boot sequence when the device tree starts to get populated.
But things could have changed from the 2.5 days when this was first added, if so, nevermind me :)
thanks,
greg k-h
Re: [patch 02/10] Dont touch fs_struct in usermodehelper
Quoted 7 lines · Greg KH
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:02PM +0200, [email protected] wrote:
This test seems to be unnecessary since we always have rootfs mounted before calling a usermodehelper.
Are you sure this is true? I thought we called the usermode helper for hotplug _very_ early in the boot sequence when the device tree starts to get populated.
rootfs is mounted by init_mount_tree, and curret->fs is set up for init there aswell. This is called by mnt_init, which is called by vfs_caches_init, which is called by start_kernel far before we go to rest_init which finally creates a thread to call kernel_init which then calls do_basic_setup which calls do_initcalls to initialize drivers and afterwards runs the initrd/initramfs.
While the actual function names in main.c changed quite a bit we've initialized the initial namespace very early on since the 2.5 days.
Re: [patch 02/10] Dont touch fs_struct in usermodehelper
Quoted 16 lines · Christoph Hellwig
Quoted 7 lines · Greg KH
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:02PM +0200, [email protected] wrote:
This test seems to be unnecessary since we always have rootfs mounted before calling a usermodehelper.
Are you sure this is true? I thought we called the usermode helper for hotplug _very_ early in the boot sequence when the device tree starts to get populated.
rootfs is mounted by
init_mount_tree, andcurret->fsis set up for init there aswell. This is called bymnt_init, which is called byvfs_caches_init, which is called bystart_kernelfar before we go torest_initwhich finally creates a thread to callkernel_initwhich then callsdo_basic_setupwhich callsdo_initcallsto initialize drivers and afterwards runs the initrd/initramfs.
Quoted 2 lines
While the actual function names in
main.cchanged quite a bit we've initialized the initial namespace very early on since the 2.5 days.
Ah, ok, great, thanks for correcting me. I have no objection to this patch then.
thanks,
greg k-h
Re: [patch 02/10] Dont touch fs_struct in usermodehelper
In reply to [email protected]Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:02PM +0200, [email protected] wrote:
This test seems to be unnecessary since we always have rootfs mounted before calling a usermodehelper.
Ok.
PATCH 3/10 Remove path_release_on_umount()
In reply to [email protected]path_release_on_umount() should only be called from sys_umount(). I merged the function into sys_umount() instead of having in in namei.c.
--- fs/namei.c | 10 ---------- fs/namespace.c | 4 +++- include/linux/namei.h | 1 - 3 files changed, 3 insertions(+), 12 deletions(-)
fs/namei.c +0 -10
@@ -353,16 +353,6 @@ void path_release(struct nameidata *nd)mntput (nd->mnt); } -/* -* umount() mustn't call path_release()/mntput() as that would clear -* mnt_expiry_mark -*/ -void path_release_on_umount (struct nameidata *nd) -{ -dput (nd->dentry); -mntput_no_expire (nd->mnt); -} -/** * release_open_intent - free up open intent resources * @nd: pointer to nameidata
fs/namespace.c +3 -1
@@ -648,7 +648,9 @@ asmlinkage long sys_umount(char __user * retval =do_umount (nd.mnt, flags); dput_and_out: -path_release_on_umount (&nd); +/* we mustn't call path_put() as that would clear mnt_expiry_mark */ +dput (nd.dentry); +mntput_no_expire (nd.mnt); out:return retval; }
include/linux/namei.h +0 -1
@@ -72,7 +72,6 @@ extern int FASTCALL(path_lookup(const chextern int vfs_path_lookup (struct dentry *,struct vfsmount *,const char *,unsigned int ,struct nameidata *);extern void path_release (struct nameidata *); -extern void path_release_on_umount (struct nameidata *);extern int __user_path_lookup_open (const char __user *,unsigned lookup_flags,struct nameidata *nd,int open_flags);extern int path_lookup_open (int dfd,const char *name,unsigned lookup_flags,struct nameidata *,int open_flags);
Re: [patch 03/10] Remove path_release_on_umount()
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:03PM +0200, [email protected] wrote:
path_release_on_umount()should only be called fromsys_umount(). I merged the function intosys_umount()instead of having in innamei.c.
Yeah, getting rid of this one makes a lot sense.
PATCH 4/10 Move struct path into its own header
In reply to [email protected]Move the definition of struct path into its own header file for further patches.
--- include/linux/namei.h | 6 +----- include/linux/path.h | 12 ++++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-)
include/linux/namei.h +1 -5
@@ -3,6 +3,7 @@#include <linux/dcache.h> #include <linux/linkage.h> +#include <linux/path.h> struct vfsmount ;
@@ -29,11 +30,6 @@ struct nameidata { } intent; }; -struct path { -struct vfsmount *mnt; -struct dentry *dentry; -}; -/* * Type of the last component on LOOKUP_PARENT */
include/linux/path.h new file +12 -0
@@ -0,0 +1,12 @@ +#ifndef _LINUX_PATH_H +#define _LINUX_PATH_H + +struct dentry ; +struct vfsmount ; + +struct path { +struct vfsmount *mnt; +struct dentry *dentry; +}; + +#endif /* _LINUX_PATH_H */
Re: [patch 04/10] Move struct path into its own header
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:04PM +0200, [email protected] wrote:
Move the definition of struct path into its own header file for further patches.
Ok.
PATCH 5/10 Embed a struct path into struct nameidata instead of nd->{dentry,mnt}
In reply to [email protected]Switch from nd->{dentry,mnt} to nd->path.{dentry,mnt} everywhere.
--- arch/alpha/kernel/osf_sys.c | 2 arch/mips/kernel/sysirix.c | 6 arch/parisc/hpux/sys_hpux.c | 2 arch/powerpc/platforms/cell/spufs/inode.c | 18 +- arch/sparc64/solaris/fs.c | 8 - arch/um/drivers/mconsole_kern.c | 6 drivers/md/dm-table.c | 2 drivers/mtd/mtdsuper.c | 10 - fs/afs/mntpt.c | 22 +- fs/autofs4/root.c | 3 fs/block_dev.c | 4 fs/coda/pioctl.c | 2 fs/compat.c | 4 fs/configfs/symlink.c | 4 fs/dquot.c | 7 fs/ecryptfs/dentry.c | 12 - fs/ecryptfs/inode.c | 26 +-- fs/ecryptfs/main.c | 4 fs/exec.c | 8 - fs/ext3/super.c | 4 fs/ext4/super.c | 4 fs/gfs2/ops_fstype.c | 5 fs/inotify_user.c | 2 fs/namei.c | 223 +++++++++++++++--------------- fs/namespace.c | 183 +++++++++++++----------- fs/nfs/namespace.c | 27 ++- fs/nfs/nfs4proc.c | 15 -- fs/nfsctl.c | 2 fs/nfsd/export.c | 35 ++-- fs/nfsd/nfs4recover.c | 32 ++-- fs/nfsd/nfs4state.c | 2 fs/open.c | 31 ++-- fs/proc/base.c | 3 fs/proc/proc_sysctl.c | 2 fs/reiserfs/super.c | 6 fs/stat.c | 13 - fs/utimes.c | 2 fs/xattr.c | 16 +- fs/xfs/linux-2.6/xfs_ioctl.c | 6 include/linux/namei.h | 3 kernel/auditfilter.c | 11 - net/sunrpc/rpc_pipe.c | 5 net/unix/af_unix.c | 20 +- security/selinux/hooks.c | 4 44 files changed, 414 insertions(+), 392 deletions(-)
arch/alpha/kernel/osf_sys.c +1 -1
@@ -260,7 +260,7 @@ osf_statfs(char __user *path, struct osf retval =user_path_walk (path, &nd);if (!retval) { - retval =do_osf_statfs (nd.dentry, buffer, bufsiz); + retval =do_osf_statfs (nd.path.dentry, buffer, bufsiz);path_release (&nd); }return retval;
arch/mips/kernel/sysirix.c +3 -3
@@ -694,7 +694,7 @@ asmlinkage int irix_statfs(const char __if (error) goto out; - error =vfs_statfs (nd.dentry, &kbuf); + error =vfs_statfs (nd.path.dentry, &kbuf);if (error) goto dput_and_out;
@@ -1360,7 +1360,7 @@ asmlinkage int irix_statvfs(char __user error =user_path_walk (fname, &nd);if (error) goto out; - error =vfs_statfs (nd.dentry, &kbuf); + error =vfs_statfs (nd.path.dentry, &kbuf);if (error) goto dput_and_out;
@@ -1611,7 +1611,7 @@ asmlinkage int irix_statvfs64(char __use error =user_path_walk (fname, &nd);if (error) goto out; - error =vfs_statfs (nd.dentry, &kbuf); + error =vfs_statfs (nd.path.dentry, &kbuf);if (error) goto dput_and_out;
arch/parisc/hpux/sys_hpux.c +1 -1
@@ -219,7 +219,7 @@ asmlinkage long hpux_statfs(const char _ error =user_path_walk (path, &nd);if (!error) {struct hpux_statfs tmp; - error =vfs_statfs_hpux (nd.dentry, &tmp); + error =vfs_statfs_hpux (nd.path.dentry, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ;path_release (&nd);
arch/powerpc/platforms/cell/spufs/inode.c +10 -8
@@ -1,3 +1,4 @@ +/* * SPU file system *
@@ -577,7 +578,7 @@ long spufs_create(struct nameidata *nd, ret = -EINVAL ;/* check if we are on spufs */ -if (nd->dentry->d_sb->s_type != &spufs_type) +if (nd->path.dentry->d_sb->s_type != &spufs_type) goto out;/* don't accept undefined flags */
@@ -585,9 +586,9 @@ long spufs_create(struct nameidata *nd, goto out;/* only threads can be underneath a gang */ -if (nd->dentry != nd->dentry->d_sb->s_root) { +if (nd->path.dentry != nd->path.dentry->d_sb->s_root) {if ((flags &SPU_CREATE_GANG ) || - !SPUFS_I (nd->dentry->d_inode)->i_gang) + !SPUFS_I (nd->path.dentry->d_inode)->i_gang) goto out; }
@@ -603,16 +604,17 @@ long spufs_create(struct nameidata *nd, mode &= ~current->fs->umask;if (flags &SPU_CREATE_GANG ) -return spufs_create_gang (nd->dentry->d_inode, - dentry, nd->mnt, mode); +return spufs_create_gang (nd->path.dentry->d_inode, + dentry, nd->path.mnt, mode);else -return spufs_create_context (nd->dentry->d_inode, - dentry, nd->mnt, flags, mode, filp); +return spufs_create_context (nd->path.dentry->d_inode, + dentry, nd->path.mnt, flags, mode, + filp); out_dput:dput (dentry); out_dir: -mutex_unlock (&nd->dentry->d_inode->i_mutex); +mutex_unlock (&nd->path.dentry->d_inode->i_mutex); out:return ret; }
arch/sparc64/solaris/fs.c +4 -4
@@ -434,8 +434,8 @@ asmlinkage int solaris_statvfs(u32 path, error =user_path_walk (A (path),&nd);if (!error) { -struct inode * inode = nd.dentry->d_inode; - error =report_statvfs (nd.mnt, inode, buf); +struct inode *inode = nd.path.dentry->d_inode; + error =report_statvfs (nd.path.mnt, inode, buf);path_release (&nd); }return error;
@@ -464,8 +464,8 @@ asmlinkage int solaris_statvfs64(u32 patlock_kernel (); error =user_path_walk (A (path), &nd);if (!error) { -struct inode * inode = nd.dentry->d_inode; - error =report_statvfs64 (nd.mnt, inode, buf); +struct inode *inode = nd.path.dentry->d_inode; + error =report_statvfs64 (nd.path.mnt, inode, buf);path_release (&nd); }unlock_kernel ();
arch/um/drivers/mconsole_kern.c +3 -3
@@ -153,8 +153,8 @@ void mconsole_proc(struct mc_request *re }up_write (&super->s_umount); - nd.dentry = super->s_root; - nd.mnt =NULL ; + nd.path.dentry = super->s_root; + nd.path.mnt =NULL ; nd.flags =O_RDONLY +1 ; nd.last_type =LAST_ROOT ;
@@ -167,7 +167,7 @@ void mconsole_proc(struct mc_request *re goto out_kill; } - file =dentry_open (nd.dentry, nd.mnt,O_RDONLY ); + file =dentry_open (nd.path.dentry, nd.path.mnt,O_RDONLY );if (IS_ERR (file)){mconsole_reply (req,"Failed to open file" ,1 ,0 ); goto out_kill;
drivers/md/dm-table.c +1 -1
@@ -356,7 +356,7 @@ static int lookup_device(const char *patif ((r =path_lookup (path,LOOKUP_FOLLOW , &nd)))return r; - inode = nd.dentry->d_inode; + inode = nd.path.dentry->d_inode;if (!inode) { r = -ENOENT ; goto out;
drivers/mtd/mtdsuper.c +5 -5
@@ -184,25 +184,25 @@ int get_sb_mtd(struct file_system_type * ret =path_lookup (dev_name,LOOKUP_FOLLOW , &nd);DEBUG (1 ,"MTDSB: path_lookup() returned %d, inode %p\n" , - ret, nd.dentry ? nd.dentry->d_inode :NULL ); + ret, nd.path.dentry ? nd.path.dentry->d_inode :NULL );if (ret)return ret; ret = -EINVAL ; -if (!S_ISBLK (nd.dentry->d_inode->i_mode)) +if (!S_ISBLK (nd.path.dentry->d_inode->i_mode)) goto out; -if (nd.mnt->mnt_flags &MNT_NODEV ) { +if (nd.path.mnt->mnt_flags &MNT_NODEV ) { ret = -EACCES ; goto out; } -if (imajor (nd.dentry->d_inode) !=MTD_BLOCK_MAJOR ) +if (imajor (nd.path.dentry->d_inode) !=MTD_BLOCK_MAJOR ) goto not_an_MTD_device; - mtdnr =iminor (nd.dentry->d_inode); + mtdnr =iminor (nd.path.dentry->d_inode);path_release (&nd); return get_sb_mtd_nr(fs_type, flags, dev_name, data, mtdnr, fill_super,
fs/afs/mntpt.c +11 -11
@@ -218,14 +218,14 @@ static void *afs_mntpt_follow_link(struc_enter ("%p{%s},{%s:%p{%s},}" , dentry, dentry->d_name.name, - nd->mnt->mnt_devname, + nd->path.mnt->mnt_devname, dentry, - nd->dentry->d_name.name); + nd->path.dentry->d_name.name); -dput (nd->dentry); - nd->dentry =dget (dentry); +dput (nd->path.dentry); + nd->path.dentry =dget (dentry); - newmnt =afs_mntpt_do_automount (nd->dentry); + newmnt =afs_mntpt_do_automount (nd->path.dentry);if (IS_ERR (newmnt)) {path_release (nd);return (void *)newmnt;
@@ -235,17 +235,17 @@ static void *afs_mntpt_follow_link(struc err =do_add_mount (newmnt, nd,MNT_SHRINKABLE , &afs_vfsmounts);switch (err) {case 0 : -dput (nd->dentry); -mntput (nd->mnt); - nd->mnt = newmnt; - nd->dentry =dget (newmnt->mnt_root); +dput (nd->path.dentry); +mntput (nd->path.mnt); + nd->path.mnt = newmnt; + nd->path.dentry =dget (newmnt->mnt_root);schedule_delayed_work (&afs_mntpt_expiry_timer, afs_mntpt_expiry_timeout *HZ );break ;case -EBUSY :/* someone else made a mount here whilst we were busy */ -while (d_mountpoint (nd->dentry) && -follow_down (&nd->mnt, &nd->dentry)) +while (d_mountpoint (nd->path.dentry) && +follow_down (&nd->path.mnt, &nd->path.dentry)) ; err =0 ;default :
fs/autofs4/root.c +2 -1
@@ -368,7 +368,8 @@ static void *autofs4_follow_link(struct* so we don't need to follow the mount. */ if (d_mountpoint (dentry)) { -if (!autofs4_follow_mount (&nd->mnt, &nd->dentry)) { +if (!autofs4_follow_mount (&nd->path.mnt, + &nd->path.dentry)) { status = -ENOENT ; goto out_error; }
fs/block_dev.c +2 -2
@@ -1386,12 +1386,12 @@ struct block_device *lookup_bdev(const cif (error)return ERR_PTR (error); - inode = nd.dentry->d_inode; + inode = nd.path.dentry->d_inode; error = -ENOTBLK ;if (!S_ISBLK (inode->i_mode)) goto fail; error = -EACCES ; -if (nd.mnt->mnt_flags &MNT_NODEV ) +if (nd.path.mnt->mnt_flags &MNT_NODEV ) goto fail; error = -ENOMEM ; bdev =bd_acquire (inode);
fs/coda/pioctl.c +1 -1
@@ -75,7 +75,7 @@ static int coda_pioctl(struct inode * inif ( error ) {return error; }else { - target_inode = nd.dentry->d_inode; + target_inode = nd.path.dentry->d_inode; }/* return if it is not a Coda inode */
fs/compat.c +2 -2
@@ -241,7 +241,7 @@ asmlinkage long compat_sys_statfs(const error =user_path_walk (path, &nd);if (!error) {struct kstatfs tmp; - error =vfs_statfs (nd.dentry, &tmp); + error =vfs_statfs (nd.path.dentry, &tmp);if (!error) error =put_compat_statfs (buf, &tmp);path_release (&nd);
@@ -309,7 +309,7 @@ asmlinkage long compat_sys_statfs64(cons error =user_path_walk (path, &nd);if (!error) {struct kstatfs tmp; - error =vfs_statfs (nd.dentry, &tmp); + error =vfs_statfs (nd.path.dentry, &tmp);if (!error) error =put_compat_statfs64 (buf, &tmp);path_release (&nd);
fs/configfs/symlink.c +2 -2
@@ -99,8 +99,8 @@ static int get_target(const char *symnam ret =path_lookup (symname,LOOKUP_FOLLOW |LOOKUP_DIRECTORY , nd);if (!ret) { -if (nd->dentry->d_sb == configfs_sb) { - *target =configfs_get_config_item (nd->dentry); +if (nd->path.dentry->d_sb == configfs_sb) { + *target =configfs_get_config_item (nd->path.dentry);if (!*target) { ret = -ENOENT ;path_release (nd);
fs/dquot.c +4 -3
@@ -1543,14 +1543,15 @@ int vfs_quota_on(struct super_block *sb, error =path_lookup (path,LOOKUP_FOLLOW , &nd);if (error <0 )return error; - error =security_quota_on (nd.dentry); + error =security_quota_on (nd.path.dentry);if (error) goto out_path;/* Quota file not on the same filesystem? */ -if (nd.mnt->mnt_sb != sb) +if (nd.path.mnt->mnt_sb != sb) error = -EXDEV ;else - error =vfs_quota_on_inode (nd.dentry->d_inode, type, format_id); + error =vfs_quota_on_inode (nd.path.dentry->d_inode, type, + format_id); out_path:path_release (&nd);return error;
fs/ecryptfs/dentry.c +6 -6
@@ -51,13 +51,13 @@ static int ecryptfs_d_revalidate(structif (!lower_dentry->d_op || !lower_dentry->d_op->d_revalidate) goto out; - dentry_save = nd->dentry; - vfsmount_save = nd->mnt; - nd->dentry = lower_dentry; - nd->mnt = lower_mnt; + dentry_save = nd->path.dentry; + vfsmount_save = nd->path.mnt; + nd->path.dentry = lower_dentry; + nd->path.mnt = lower_mnt; rc = lower_dentry->d_op->d_revalidate (lower_dentry, nd); - nd->dentry = dentry_save; - nd->mnt = vfsmount_save; + nd->path.dentry = dentry_save; + nd->path.mnt = vfsmount_save;if (dentry->d_inode) {struct inode *lower_inode =ecryptfs_inode_to_lower (dentry->d_inode);
fs/ecryptfs/inode.c +13 -13
@@ -77,13 +77,13 @@ ecryptfs_create_underlying_file(struct istruct vfsmount *vfsmount_save;int rc; - dentry_save = nd->dentry; - vfsmount_save = nd->mnt; - nd->dentry = lower_dentry; - nd->mnt = lower_mnt; + dentry_save = nd->path.dentry; + vfsmount_save = nd->path.mnt; + nd->path.dentry = lower_dentry; + nd->path.mnt = lower_mnt; rc =vfs_create (lower_dir_inode, lower_dentry, mode, nd); - nd->dentry = dentry_save; - nd->mnt = vfsmount_save; + nd->path.dentry = dentry_save; + nd->path.mnt = vfsmount_save;return rc; }
@@ -375,7 +375,7 @@ static struct dentry *ecryptfs_lookup(stif (!(crypt_stat->flags &ECRYPTFS_POLICY_APPLIED ))ecryptfs_set_default_sizes (crypt_stat); rc =ecryptfs_read_and_validate_header_region (page_virt, lower_dentry, - nd->mnt); + nd->path.mnt);if (rc) { rc =ecryptfs_read_and_validate_xattr_region (page_virt, dentry);if (rc) {
@@ -864,14 +864,14 @@ ecryptfs_permission(struct inode *inode,int rc;if (nd) { -struct vfsmount *vfsmnt_save = nd->mnt; -struct dentry *dentry_save = nd->dentry; +struct vfsmount *vfsmnt_save = nd->path.mnt; +struct dentry *dentry_save = nd->path.dentry; - nd->mnt =ecryptfs_dentry_to_lower_mnt (nd->dentry); - nd->dentry =ecryptfs_dentry_to_lower (nd->dentry); + nd->path.mnt =ecryptfs_dentry_to_lower_mnt (nd->path.dentry); + nd->path.dentry =ecryptfs_dentry_to_lower (nd->path.dentry); rc =permission (ecryptfs_inode_to_lower (inode), mask, nd); - nd->mnt = vfsmnt_save; - nd->dentry = dentry_save; + nd->path.mnt = vfsmnt_save; + nd->path.dentry = dentry_save; }else rc =permission (ecryptfs_inode_to_lower (inode), mask,NULL );return rc;
fs/ecryptfs/main.c +2 -2
@@ -489,8 +489,8 @@ static int ecryptfs_read_super(struct suecryptfs_printk (KERN_WARNING ,"path_lookup() failed\n" ); goto out; } - lower_root = nd.dentry; - lower_mnt = nd.mnt; + lower_root = nd.path.dentry; + lower_mnt = nd.path.mnt;ecryptfs_set_superblock_lower (sb, lower_root->d_sb); sb->s_maxbytes = lower_root->d_sb->s_maxbytes;ecryptfs_set_dentry_lower (sb->s_root, lower_root);
fs/exec.c +4 -4
@@ -135,10 +135,10 @@ asmlinkage long sys_uselib(const char __ goto out; error = -EACCES ; -if (nd.mnt->mnt_flags &MNT_NOEXEC ) +if (nd.path.mnt->mnt_flags &MNT_NOEXEC ) goto exit; error = -EINVAL ; -if (!S_ISREG (nd.dentry->d_inode->i_mode)) +if (!S_ISREG (nd.path.dentry->d_inode->i_mode)) goto exit; error =vfs_permission (&nd,MAY_READ |MAY_EXEC );
@@ -678,9 +678,9 @@ struct file *open_exec(const char *name) file =ERR_PTR (err);if (!err) { -struct inode *inode = nd.dentry->d_inode; +struct inode *inode = nd.path.dentry->d_inode; file =ERR_PTR (-EACCES ); -if (!(nd.mnt->mnt_flags &MNT_NOEXEC ) && +if (!(nd.path.mnt->mnt_flags &MNT_NOEXEC ) &&S_ISREG (inode->i_mode)) {int err =vfs_permission (&nd,MAY_EXEC ); file =ERR_PTR (err);
fs/ext3/super.c +2 -2
@@ -2647,12 +2647,12 @@ static int ext3_quota_on(struct super_blif (err)return err;/* Quotafile not on the same filesystem? */ -if (nd.mnt->mnt_sb != sb) { +if (nd.path.mnt->mnt_sb != sb) {path_release (&nd);return -EXDEV ; }/* Quotafile not of fs root? */ -if (nd.dentry->d_parent->d_inode != sb->s_root->d_inode) +if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode)printk (KERN_WARNING "EXT3-fs: Quota file not on filesystem root. " "Journalled quota will not work.\n" );
fs/ext4/super.c +2 -2
@@ -2767,12 +2767,12 @@ static int ext4_quota_on(struct super_blif (err)return err;/* Quotafile not on the same filesystem? */ -if (nd.mnt->mnt_sb != sb) { +if (nd.path.mnt->mnt_sb != sb) {path_release (&nd);return -EXDEV ; }/* Quotafile not of fs root? */ -if (nd.dentry->d_parent->d_inode != sb->s_root->d_inode) +if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode)printk (KERN_WARNING "EXT4-fs: Quota file not on filesystem root. " "Journalled quota will not work.\n" );
fs/gfs2/ops_fstype.c +3 -2
@@ -827,13 +827,14 @@ static struct super_block* get_gfs2_sb(c dev_name); goto out; } - error =vfs_getattr (nd.mnt, nd.dentry, &stat); + error =vfs_getattr (nd.path.mnt, nd.path.dentry, &stat); fstype =get_fs_type ("gfs2" );list_for_each (l, &fstype->fs_supers) { s = list_entry(l, struct super_block, s_instances);if ((S_ISBLK (stat.mode) && s->s_dev == stat.rdev) || - (S_ISDIR (stat.mode) && s == nd.dentry->d_inode->i_sb)) { + (S_ISDIR (stat.mode) && + s == nd.path.dentry->d_inode->i_sb)) { sb = s; goto free_nd; }
fs/inotify_user.c +1 -1
@@ -639,7 +639,7 @@ asmlinkage long sys_inotify_add_watch(in goto fput_and_out;/* inode held in place by reference to nd; dev by fget on fd */ - inode = nd.dentry->d_inode; + inode = nd.path.dentry->d_inode; dev = filp->private_data;mutex_lock (&dev->up_mutex);
fs/namei.c +115 -108
575 lines not on this page · raw message
fs/namespace.c +97 -86
397 lines not on this page · raw message
fs/nfs/namespace.c +15 -12
@@ -107,38 +107,40 @@ static void * nfs_follow_mountpoint(struBUG_ON (IS_ROOT (dentry));dprintk ("%s: enter\n" , __FUNCTION__); -dput (nd->dentry); - nd->dentry =dget (dentry); +dput (nd->path.dentry); + nd->path.dentry =dget (dentry);/* Look it up again */ - parent =dget_parent (nd->dentry); + parent =dget_parent (nd->path.dentry); err = server->nfs_client->rpc_ops->lookup (parent->d_inode, - &nd->dentry->d_name, + &nd->path.dentry->d_name, &fh, &fattr);dput (parent);if (err !=0 ) goto out_err;if (fattr.valid &NFS_ATTR_FATTR_V4_REFERRAL ) - mnt =nfs_do_refmount (nd->mnt, nd->dentry); + mnt =nfs_do_refmount (nd->path.mnt, nd->path.dentry);else - mnt =nfs_do_submount (nd->mnt, nd->dentry, &fh, &fattr); + mnt =nfs_do_submount (nd->path.mnt, nd->path.dentry, &fh, + &fattr); err =PTR_ERR (mnt);if (IS_ERR (mnt)) goto out_err;mntget (mnt); - err =do_add_mount (mnt, nd, nd->mnt->mnt_flags|MNT_SHRINKABLE , &nfs_automount_list); + err =do_add_mount (mnt, nd, nd->path.mnt->mnt_flags|MNT_SHRINKABLE , + &nfs_automount_list);if (err <0 ) {mntput (mnt);if (err == -EBUSY ) goto out_follow; goto out_err; } -mntput (nd->mnt); -dput (nd->dentry); - nd->mnt = mnt; - nd->dentry =dget (mnt->mnt_root); +mntput (nd->path.mnt); +dput (nd->path.dentry); + nd->path.mnt = mnt; + nd->path.dentry =dget (mnt->mnt_root);schedule_delayed_work (&nfs_automount_task, nfs_mountpoint_expiry_timeout); out:dprintk ("%s: done, returned %d\n" , __FUNCTION__, err);
@@ -149,7 +151,8 @@ out_err:path_release (nd); goto out; out_follow: -while (d_mountpoint (nd->dentry) &&follow_down (&nd->mnt, &nd->dentry)) +while (d_mountpoint (nd->path.dentry) && +follow_down (&nd->path.mnt, &nd->path.dentry)) ; err =0 ; goto out;
fs/nfs/nfs4proc.c +3 -12
@@ -1403,10 +1403,7 @@ out_close:struct dentry *nfs4_atomic_open (struct inode *dir,struct dentry *dentry,struct nameidata *nd) { -struct path path = { - .mnt = nd->mnt, - .dentry = dentry, - }; +struct path path = nd->path;struct iattr attr;struct rpc_cred *cred;struct nfs4_state *state;
@@ -1442,10 +1439,7 @@ nfs4_atomic_open(struct inode *dir, struint nfs4_open_revalidate (struct inode *dir,struct dentry *dentry,int openflags,struct nameidata *nd) { -struct path path = { - .mnt = nd->mnt, - .dentry = dentry, - }; +struct path path = nd->path;struct rpc_cred *cred;struct nfs4_state *state;
@@ -1885,10 +1879,7 @@ static int nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, int flags, struct nameidata *nd) { - struct path path = { - .mnt = nd->mnt, - .dentry = dentry, - }; + struct path path = nd->path;struct nfs4_state *state;struct rpc_cred *cred;int status =0 ;
fs/nfsctl.c +1 -1
@@ -41,7 +41,7 @@ static struct file *do_open(char *name, error =may_open (&nd,MAY_WRITE ,FMODE_WRITE );if (!error) -return dentry_open (nd.dentry, nd.mnt, flags); +return dentry_open (nd.path.dentry, nd.path.mnt, flags);path_release (&nd);return ERR_PTR (error);
fs/nfsd/export.c +18 -17
@@ -169,8 +169,8 @@ static int expkey_parse(struct cache_det goto out;dprintk ("Found the path %s\n" , buf); - key.ek_mnt = nd.mnt; - key.ek_dentry = nd.dentry; + key.ek_mnt = nd.path.mnt; + key.ek_dentry = nd.path.dentry; ek =svc_expkey_update (&key, ek);if (ek)
@@ -509,7 +509,7 @@ static int svc_export_parse(struct cachestruct svc_export exp, *expp;int an_int; - nd.dentry =NULL ; + nd.path.dentry =NULL ; exp.ex_path =NULL ;/* fs locations */
@@ -549,8 +549,8 @@ static int svc_export_parse(struct cache exp.h.flags =0 ; exp.ex_client = dom; - exp.ex_mnt = nd.mnt; - exp.ex_dentry = nd.dentry; + exp.ex_mnt = nd.path.mnt; + exp.ex_dentry = nd.path.dentry; exp.ex_path =kstrdup (buf,GFP_KERNEL ); err = -ENOMEM ;if (!exp.ex_path)
@@ -612,7 +612,7 @@ static int svc_export_parse(struct cache goto out; } - err =check_export (nd.dentry->d_inode, exp.ex_flags, + err =check_export (nd.path.dentry->d_inode, exp.ex_flags, exp.ex_uuid);if (err) goto out; }
@@ -631,7 +631,7 @@ static int svc_export_parse(struct cachenfsd4_fslocs_free (&exp.ex_fslocs);kfree (exp.ex_uuid);kfree (exp.ex_path); -if (nd.dentry) +if (nd.path.dentry)path_release (&nd); out_no_path:if (dom)
@@ -1032,7 +1032,7 @@ exp_export(struct nfsctl_export *nxp) goto out_unlock; err = -EINVAL ; - exp =exp_get_by_name (clp, nd.mnt, nd.dentry,NULL ); + exp =exp_get_by_name (clp, nd.path.mnt, nd.path.dentry,NULL );memset (&new,0 ,sizeof (new));
@@ -1040,7 +1040,8 @@ exp_export(struct nfsctl_export *nxp)if ((nxp->ex_flags &NFSEXP_FSID ) && (!IS_ERR (fsid_key =exp_get_fsid_key (clp, nxp->ex_dev))) && fsid_key->ek_mnt && - (fsid_key->ek_mnt != nd.mnt || fsid_key->ek_dentry != nd.dentry) ) + (fsid_key->ek_mnt != nd.path.mnt || + fsid_key->ek_dentry != nd.path.dentry)) goto finish;if (!IS_ERR (exp)) {
@@ -1056,7 +1057,7 @@ exp_export(struct nfsctl_export *nxp) goto finish; } - err =check_export (nd.dentry->d_inode, nxp->ex_flags,NULL ); + err =check_export (nd.path.dentry->d_inode, nxp->ex_flags,NULL );if (err) goto finish; err = -ENOMEM ;
@@ -1069,8 +1070,8 @@ exp_export(struct nfsctl_export *nxp)if (!new.ex_path) goto finish; new.ex_client = clp; - new.ex_mnt = nd.mnt; - new.ex_dentry = nd.dentry; + new.ex_mnt = nd.path.mnt; + new.ex_dentry = nd.path.dentry; new.ex_flags = nxp->ex_flags; new.ex_anon_uid = nxp->ex_anon_uid; new.ex_anon_gid = nxp->ex_anon_gid;
@@ -1150,7 +1151,7 @@ exp_unexport(struct nfsctl_export *nxp) goto out_domain; err = -EINVAL ; - exp =exp_get_by_name (dom, nd.mnt, nd.dentry,NULL ); + exp =exp_get_by_name (dom, nd.path.mnt, nd.path.dentry,NULL );path_release (&nd);if (IS_ERR (exp)) goto out_domain;
@@ -1187,12 +1188,12 @@ exp_rootfh(svc_client *clp, char *path,printk ("nfsd: exp_rootfh path not found %s" , path);return err; } - inode = nd.dentry->d_inode; + inode = nd.path.dentry->d_inode;dprintk ("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n" , - path, nd.dentry, clp->name, + path, nd.path.dentry, clp->name, inode->i_sb->s_id, inode->i_ino); - exp =exp_parent (clp, nd.mnt, nd.dentry,NULL ); + exp =exp_parent (clp, nd.path.mnt, nd.path.dentry,NULL );if (IS_ERR (exp)) { err =PTR_ERR (exp); goto out;
@@ -1202,7 +1203,7 @@ exp_rootfh(svc_client *clp, char *path,* fh must be initialized before calling fh_compose */ fh_init (&fh, maxsize); -if (fh_compose (&fh, exp, nd.dentry,NULL )) +if (fh_compose (&fh, exp, nd.path.dentry,NULL )) err = -EINVAL ;else err =0 ;
fs/nfsd/nfs4recover.c +16 -16
@@ -122,9 +122,9 @@ out_no_tfm:static void nfsd4_sync_rec_dir (void ) { -mutex_lock (&rec_dir.dentry->d_inode->i_mutex); -nfsd_sync_dir (rec_dir.dentry); -mutex_unlock (&rec_dir.dentry->d_inode->i_mutex); +mutex_lock (&rec_dir.path.dentry->d_inode->i_mutex); +nfsd_sync_dir (rec_dir.path.dentry); +mutex_unlock (&rec_dir.path.dentry->d_inode->i_mutex); }int
@@ -144,9 +144,9 @@ nfsd4_create_clid_dir(struct nfs4_clientnfs4_save_user (&uid, &gid);/* lock the parent */ -mutex_lock (&rec_dir.dentry->d_inode->i_mutex); +mutex_lock (&rec_dir.path.dentry->d_inode->i_mutex); - dentry =lookup_one_len (dname, rec_dir.dentry,HEXDIR_LEN -1 ); + dentry =lookup_one_len (dname, rec_dir.path.dentry,HEXDIR_LEN -1 );if (IS_ERR (dentry)) { status =PTR_ERR (dentry); goto out_unlock;
@@ -156,11 +156,11 @@ nfsd4_create_clid_dir(struct nfs4_clientdprintk ("NFSD: nfsd4_create_clid_dir: DIRECTORY EXISTS\n" ); goto out_put; } - status =vfs_mkdir (rec_dir.dentry->d_inode, dentry,S_IRWXU ); + status =vfs_mkdir (rec_dir.path.dentry->d_inode, dentry,S_IRWXU ); out_put:dput (dentry); out_unlock: -mutex_unlock (&rec_dir.dentry->d_inode->i_mutex); +mutex_unlock (&rec_dir.path.dentry->d_inode->i_mutex);if (status ==0 ) { clp->cl_firststate =1 ;nfsd4_sync_rec_dir ();
@@ -223,7 +223,7 @@ nfsd4_list_rec_dir(struct dentry *dir, rnfs4_save_user (&uid, &gid); - filp =dentry_open (dget (dir),mntget (rec_dir.mnt),O_RDONLY ); + filp =dentry_open (dget (dir),mntget (rec_dir.path.mnt),O_RDONLY ); status =PTR_ERR (filp);if (IS_ERR (filp)) goto out;
@@ -288,9 +288,9 @@ nfsd4_unlink_clid_dir(char *name, int nadprintk ("NFSD: nfsd4_unlink_clid_dir. name %.*s\n" , namlen, name); -mutex_lock (&rec_dir.dentry->d_inode->i_mutex); - dentry =lookup_one_len (name, rec_dir.dentry, namlen); -mutex_unlock (&rec_dir.dentry->d_inode->i_mutex); +mutex_lock (&rec_dir.path.dentry->d_inode->i_mutex); + dentry =lookup_one_len (name, rec_dir.path.dentry, namlen); +mutex_unlock (&rec_dir.path.dentry->d_inode->i_mutex);if (IS_ERR (dentry)) { status =PTR_ERR (dentry);return status;
@@ -299,7 +299,7 @@ nfsd4_unlink_clid_dir(char *name, int naif (!dentry->d_inode) goto out; - status =nfsd4_clear_clid_dir (rec_dir.dentry, dentry); + status =nfsd4_clear_clid_dir (rec_dir.path.dentry, dentry); out:dput (dentry);return status;
@@ -349,12 +349,12 @@ nfsd4_recdir_purge_old(void) {if (!rec_dir_init)return ; - status =nfsd4_list_rec_dir (rec_dir.dentry, purge_old); + status =nfsd4_list_rec_dir (rec_dir.path.dentry, purge_old);if (status ==0 )nfsd4_sync_rec_dir ();if (status)printk ("nfsd4: failed to purge old clients from recovery" -" directory %s\n" , rec_dir.dentry->d_name.name); +" directory %s\n" , rec_dir.path.dentry->d_name.name);return ; }
@@ -375,10 +375,10 @@ intnfsd4_recdir_load (void) {int status; - status =nfsd4_list_rec_dir (rec_dir.dentry, load_recdir); + status =nfsd4_list_rec_dir (rec_dir.path.dentry, load_recdir);if (status)printk ("nfsd4: failed loading clients from recovery" -" directory %s\n" , rec_dir.dentry->d_name.name); +" directory %s\n" , rec_dir.path.dentry->d_name.name);return status; }
fs/nfsd/nfs4state.c +1 -1
@@ -3338,7 +3338,7 @@ nfs4_reset_recoverydir(char *recdir)if (status)return status; status = -ENOTDIR ; -if (S_ISDIR (nd.dentry->d_inode->i_mode)) { +if (S_ISDIR (nd.path.dentry->d_inode->i_mode)) {nfs4_set_recdir (recdir); status =0 ; }
fs/open.c +16 -15
@@ -127,7 +127,7 @@ asmlinkage long sys_statfs(const char __ error =user_path_walk (path, &nd);if (!error) {struct statfs tmp; - error =vfs_statfs_native (nd.dentry, &tmp); + error =vfs_statfs_native (nd.path.dentry, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ;path_release (&nd);
@@ -146,7 +146,7 @@ asmlinkage long sys_statfs64(const char error =user_path_walk (path, &nd);if (!error) {struct statfs64 tmp; - error =vfs_statfs64 (nd.dentry, &tmp); + error =vfs_statfs64 (nd.path.dentry, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ;path_release (&nd);
@@ -233,7 +233,7 @@ static long do_sys_truncate(const char _ error =user_path_walk (path, &nd);if (error) goto out; - inode = nd.dentry->d_inode; + inode = nd.path.dentry->d_inode;/* For directories it's -EISDIR, for other non-regulars - -EINVAL */ error = -EISDIR ;
@@ -271,7 +271,7 @@ static long do_sys_truncate(const char _ error =locks_verify_truncate (inode,NULL , length);if (!error) {DQUOT_INIT (inode); - error =do_truncate (nd.dentry, length,0 ,NULL ); + error =do_truncate (nd.path.dentry, length,0 ,NULL ); } put_write_and_out:
@@ -455,10 +455,10 @@ asmlinkage long sys_faccessat(int dfd, c res =vfs_permission (&nd, mode);/* SuS v2 requires we report a read only fs too */ if (res || !(mode &S_IWOTH ) || -special_file (nd.dentry->d_inode->i_mode)) +special_file (nd.path.dentry->d_inode->i_mode)) goto out_path_release; -if (IS_RDONLY (nd.dentry->d_inode)) +if (IS_RDONLY (nd.path.dentry->d_inode)) res = -EROFS ; out_path_release:
@@ -490,7 +490,7 @@ asmlinkage long sys_chdir(const char __uif (error) goto dput_and_out; -set_fs_pwd (current->fs, nd.mnt, nd.dentry); +set_fs_pwd (current->fs, nd.path.mnt, nd.path.dentry); dput_and_out:path_release (&nd);
@@ -545,7 +545,7 @@ asmlinkage long sys_chroot(const char __if (!capable (CAP_SYS_CHROOT )) goto dput_and_out; -set_fs_root (current->fs, nd.mnt, nd.dentry); +set_fs_root (current->fs, nd.path.mnt, nd.path.dentry);set_fs_altroot (); error =0 ; dput_and_out:
@@ -602,7 +602,7 @@ asmlinkage long sys_fchmodat(int dfd, co error =__user_walk_fd (dfd, filename,LOOKUP_FOLLOW , &nd);if (error) goto out; - inode = nd.dentry->d_inode; + inode = nd.path.dentry->d_inode; error = -EROFS ;if (IS_RDONLY (inode))
@@ -617,7 +617,7 @@ asmlinkage long sys_fchmodat(int dfd, co mode = inode->i_mode; newattrs.ia_mode = (mode &S_IALLUGO ) | (inode->i_mode & ~S_IALLUGO ); newattrs.ia_valid =ATTR_MODE |ATTR_CTIME ; - error =notify_change (nd.dentry, &newattrs); + error =notify_change (nd.path.dentry, &newattrs);mutex_unlock (&inode->i_mutex); dput_and_out:
@@ -674,7 +674,7 @@ asmlinkage long sys_chown(const char __u error =user_path_walk (filename, &nd);if (error) goto out; - error =chown_common (nd.dentry, user, group); + error =chown_common (nd.path.dentry, user, group);path_release (&nd); out:return error;
@@ -694,7 +694,7 @@ asmlinkage long sys_fchownat(int dfd, co error =__user_walk_fd (dfd, filename, follow, &nd);if (error) goto out; - error =chown_common (nd.dentry, user, group); + error =chown_common (nd.path.dentry, user, group);path_release (&nd); out:return error;
@@ -708,7 +708,7 @@ asmlinkage long sys_lchown(const char __ error =user_path_walk_link (filename, &nd);if (error) goto out; - error =chown_common (nd.dentry, user, group); + error =chown_common (nd.path.dentry, user, group);path_release (&nd); out:return error;
@@ -858,7 +858,7 @@ struct file *lookup_instantiate_filp(str goto out;if (IS_ERR (dentry)) goto out_err; - nd->intent.open.file =__dentry_open (dget (dentry),mntget (nd->mnt), + nd->intent.open.file =__dentry_open (dget (dentry),mntget (nd->path.mnt), nd->intent.open.flags -1 , nd->intent.open.file, open);
@@ -886,7 +886,8 @@ struct file *nameidata_to_filp(struct na filp = nd->intent.open.file;/* Has the filesystem initialised the file for us? */ if (filp->f_path.dentry ==NULL ) - filp =__dentry_open (nd->dentry, nd->mnt, flags, filp,NULL ); + filp =__dentry_open (nd->path.dentry, nd->path.mnt, flags, filp, +NULL );else path_release (nd);return filp;
fs/proc/base.c +2 -1
@@ -944,7 +944,8 @@ static void *proc_pid_follow_link(structif (!proc_fd_access_allowed (inode)) goto out; - error =PROC_I (inode)->op.proc_get_link (inode, &nd->dentry, &nd->mnt); + error =PROC_I (inode)->op.proc_get_link (inode, &nd->path.dentry, + &nd->path.mnt); nd->last_type =LAST_BIND ; out:return ERR_PTR (error);
fs/proc/proc_sysctl.c +1 -1
@@ -405,7 +405,7 @@ static int proc_sys_permission(struct inif (!nd || !depth) goto out; - dentry = nd->dentry; + dentry = nd->path.dentry; table =do_proc_sys_lookup (dentry->d_parent, &dentry->d_name, &head);/* If the entry does not exist deny permission */
fs/reiserfs/super.c +3 -3
@@ -1985,12 +1985,12 @@ static int reiserfs_quota_on(struct supeif (err)return err;/* Quotafile not on the same filesystem? */ -if (nd.mnt->mnt_sb != sb) { +if (nd.path.mnt->mnt_sb != sb) {path_release (&nd);return -EXDEV ; }/* We must not pack tails for quota files on reiserfs for quota IO to work */ -if (!REISERFS_I (nd.dentry->d_inode)->i_flags & i_nopack_mask) { +if (!REISERFS_I (nd.path.dentry->d_inode)->i_flags & i_nopack_mask) {reiserfs_warning (sb,"reiserfs: Quota file must have tail packing disabled." );path_release (&nd);
@@ -2003,7 +2003,7 @@ static int reiserfs_quota_on(struct supereturn vfs_quota_on (sb, type, format_id, path); }/* Quotafile not of fs root? */ -if (nd.dentry->d_parent->d_inode != sb->s_root->d_inode) +if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode)reiserfs_warning (sb,"reiserfs: Quota file not on filesystem root. " "Journalled quota will not work." );
fs/stat.c +7 -6
@@ -62,7 +62,7 @@ int vfs_stat_fd(int dfd, char __user *na error =__user_walk_fd (dfd, name,LOOKUP_FOLLOW , &nd);if (!error) { - error =vfs_getattr (nd.mnt, nd.dentry, stat); + error =vfs_getattr (nd.path.mnt, nd.path.dentry, stat);path_release (&nd); }return error;
@@ -82,7 +82,7 @@ int vfs_lstat_fd(int dfd, char __user *n error =__user_walk_fd (dfd, name,0 , &nd);if (!error) { - error =vfs_getattr (nd.mnt, nd.dentry, stat); + error =vfs_getattr (nd.path.mnt, nd.path.dentry, stat);path_release (&nd); }return error;
@@ -302,14 +302,15 @@ asmlinkage long sys_readlinkat(int dfd, error =__user_walk_fd (dfd, path,0 , &nd);if (!error) { -struct inode * inode = nd.dentry->d_inode; +struct inode *inode = nd.path.dentry->d_inode; error = -EINVAL ;if (inode->i_op && inode->i_op->readlink) { - error =security_inode_readlink (nd.dentry); + error =security_inode_readlink (nd.path.dentry);if (!error) { -touch_atime (nd.mnt, nd.dentry); - error = inode->i_op->readlink (nd.dentry, buf, bufsiz); +touch_atime (nd.path.mnt, nd.path.dentry); + error = inode->i_op->readlink (nd.path.dentry, + buf, bufsiz); } }path_release (&nd);
fs/utimes.c +1 -1
@@ -70,7 +70,7 @@ long do_utimes(int dfd, char __user *filif (error) goto out; - dentry = nd.dentry; + dentry = nd.path.dentry; } inode = dentry->d_inode;
fs/xattr.c +8 -8
@@ -235,7 +235,7 @@ sys_setxattr(char __user *path, char __u error =user_path_walk (path, &nd);if (error)return error; - error =setxattr (nd.dentry, name, value, size, flags); + error =setxattr (nd.path.dentry, name, value, size, flags);path_release (&nd);return error; }
@@ -250,7 +250,7 @@ sys_lsetxattr(char __user *path, char __ error =user_path_walk_link (path, &nd);if (error)return error; - error =setxattr (nd.dentry, name, value, size, flags); + error =setxattr (nd.path.dentry, name, value, size, flags);path_release (&nd);return error; }
@@ -320,7 +320,7 @@ sys_getxattr(char __user *path, char __u error =user_path_walk (path, &nd);if (error)return error; - error =getxattr (nd.dentry, name, value, size); + error =getxattr (nd.path.dentry, name, value, size);path_release (&nd);return error; }
@@ -335,7 +335,7 @@ sys_lgetxattr(char __user *path, char __ error =user_path_walk_link (path, &nd);if (error)return error; - error =getxattr (nd.dentry, name, value, size); + error =getxattr (nd.path.dentry, name, value, size);path_release (&nd);return error; }
@@ -394,7 +394,7 @@ sys_listxattr(char __user *path, char __ error =user_path_walk (path, &nd);if (error)return error; - error =listxattr (nd.dentry, list, size); + error =listxattr (nd.path.dentry, list, size);path_release (&nd);return error; }
@@ -408,7 +408,7 @@ sys_llistxattr(char __user *path, char _ error =user_path_walk_link (path, &nd);if (error)return error; - error =listxattr (nd.dentry, list, size); + error =listxattr (nd.path.dentry, list, size);path_release (&nd);return error; }
@@ -455,7 +455,7 @@ sys_removexattr(char __user *path, char error =user_path_walk (path, &nd);if (error)return error; - error =removexattr (nd.dentry, name); + error =removexattr (nd.path.dentry, name);path_release (&nd);return error; }
@@ -469,7 +469,7 @@ sys_lremovexattr(char __user *path, char error =user_path_walk_link (path, &nd);if (error)return error; - error =removexattr (nd.dentry, name); + error =removexattr (nd.path.dentry, name);path_release (&nd);return error; }
fs/xfs/linux-2.6/xfs_ioctl.c +3 -3
@@ -91,9 +91,9 @@ xfs_find_handle(if (error)return error; -ASSERT (nd.dentry); -ASSERT (nd.dentry->d_inode); - inode =igrab (nd.dentry->d_inode); +ASSERT (nd.path.dentry); +ASSERT (nd.path.dentry->d_inode); + inode =igrab (nd.path.dentry->d_inode);path_release (&nd);break ; }
include/linux/namei.h +1 -2
@@ -16,8 +16,7 @@ struct open_intent {enum {MAX_NESTED_LINKS =8 };struct nameidata { -struct dentry *dentry; -struct vfsmount *mnt; +struct path path;struct qstr last;unsigned int flags;int last_type;
kernel/auditfilter.c +6 -5
@@ -167,8 +167,8 @@ static struct audit_parent *audit_init_pinotify_init_watch (&parent->wdata);/* grab a ref so inotify watch hangs around until we take audit_filter_mutex */ get_inotify_watch (&parent->wdata); - wd =inotify_add_watch (audit_ih, &parent->wdata, ndp->dentry->d_inode, -AUDIT_IN_WATCH ); + wd =inotify_add_watch (audit_ih, &parent->wdata, + ndp->path.dentry->d_inode,AUDIT_IN_WATCH );if (wd <0 ) {audit_free_parent (&parent->wdata);return ERR_PTR (wd);
@@ -1176,8 +1176,8 @@ static int audit_add_watch(struct audit_/* update watch filter fields */ if (ndw) { - watch->dev = ndw->dentry->d_inode->i_sb->s_dev; - watch->ino = ndw->dentry->d_inode->i_ino; + watch->dev = ndw->path.dentry->d_inode->i_sb->s_dev; + watch->ino = ndw->path.dentry->d_inode->i_ino; }/* The audit_filter_mutex must not be held during inotify calls because
@@ -1187,7 +1187,8 @@ static int audit_add_watch(struct audit_*/ mutex_unlock (&audit_filter_mutex); -if (inotify_find_watch (audit_ih, ndp->dentry->d_inode, &i_watch) <0 ) { +if (inotify_find_watch (audit_ih, ndp->path.dentry->d_inode, + &i_watch) <0 ) { parent =audit_init_parent (ndp);if (IS_ERR (parent)) {/* caller expects mutex locked */
net/sunrpc/rpc_pipe.c +3 -2
@@ -655,7 +655,8 @@ rpc_lookup_negative(char *path, struct nif ((error =rpc_lookup_parent (path, nd)) !=0 )return ERR_PTR (error); - dentry =rpc_lookup_create (nd->dentry, nd->last.name, nd->last.len,1 ); + dentry =rpc_lookup_create (nd->path.dentry, nd->last.name, nd->last.len, +1 );if (IS_ERR (dentry))rpc_release_path (nd);return dentry;
@@ -673,7 +674,7 @@ rpc_mkdir(char *path, struct rpc_clnt *r dentry =rpc_lookup_negative (path, &nd);if (IS_ERR (dentry))return dentry; - dir = nd.dentry->d_inode; + dir = nd.path.dentry->d_inode;if ((error =__rpc_mkdir (dir, dentry)) !=0 ) goto err_dput;RPC_I (dentry->d_inode)->private = rpc_client;
net/unix/af_unix.c +10 -10
@@ -734,14 +734,14 @@ static struct sock *unix_find_other(stru goto put_fail; err = -ECONNREFUSED ; -if (!S_ISSOCK (nd.dentry->d_inode->i_mode)) +if (!S_ISSOCK (nd.path.dentry->d_inode->i_mode)) goto put_fail; - u=unix_find_socket_byinode (nd.dentry->d_inode); + u =unix_find_socket_byinode (nd.path.dentry->d_inode);if (!u) goto put_fail;if (u->sk_type == type) -touch_atime (nd.mnt, nd.dentry); +touch_atime (nd.path.mnt, nd.path.dentry);path_release (&nd);
@@ -834,12 +834,12 @@ static int unix_bind(struct socket *sock*/ mode =S_IFSOCK | (SOCK_INODE (sock)->i_mode & ~current->fs->umask); - err =vfs_mknod (nd.dentry->d_inode, dentry, mode,0 ); + err =vfs_mknod (nd.path.dentry->d_inode, dentry, mode,0 );if (err) goto out_mknod_dput; -mutex_unlock (&nd.dentry->d_inode->i_mutex); -dput (nd.dentry); - nd.dentry = dentry; +mutex_unlock (&nd.path.dentry->d_inode->i_mutex); +dput (nd.path.dentry); + nd.path.dentry = dentry; addr->hash =UNIX_HASH_SIZE ; }
@@ -857,8 +857,8 @@ static int unix_bind(struct socket *sock list = &unix_socket_table[addr->hash]; }else { list = &unix_socket_table[dentry->d_inode->i_ino & (UNIX_HASH_SIZE -1 )]; - u->dentry = nd.dentry; - u->mnt = nd.mnt; + u->dentry = nd.path.dentry; + u->mnt = nd.path.mnt; } err =0 ;
@@ -876,7 +876,7 @@ out: out_mknod_dput:dput (dentry); out_mknod_unlock: -mutex_unlock (&nd.dentry->d_inode->i_mutex); +mutex_unlock (&nd.path.dentry->d_inode->i_mutex);path_release (&nd); out_mknod_parent:if (err==-EEXIST )
security/selinux/hooks.c +2 -2
@@ -2089,10 +2089,10 @@ static int selinux_mount(char * dev_namereturn rc;if (flags &MS_REMOUNT ) -return superblock_has_perm (current, nd->mnt->mnt_sb, +return superblock_has_perm (current, nd->path.mnt->mnt_sb,FILESYSTEM__REMOUNT ,NULL );else -return dentry_has_perm (current, nd->mnt, nd->dentry, +return dentry_has_perm (current, nd->path.mnt, nd->path.dentry,FILE__MOUNTON ); }
Re: [patch 05/10] Embed a struct path into struct nameidata instead of nd->{dentry,mnt}
Quoted 1 line · On Thu, Sep 27, 2007 at 04:12:05PM +0200, [email protected] wrote:
Switch from nd->{dentry,mnt} to nd->path.{dentry,mnt} everywhere.
Ok.
PATCH 6/10 Introduce path_put()
In reply to [email protected]* Add path_put() functions for releasing a reference to the dentry and vfsmount of a struct path in the right order
* Switch from path_release(nd) to path_put(&nd->path)
* Rename dput_path() to path_put_conditional()
--- arch/alpha/kernel/osf_sys.c | 2 arch/mips/kernel/sysirix.c | 6 +- arch/parisc/hpux/sys_hpux.c | 2 arch/powerpc/platforms/cell/spufs/syscalls.c | 2 arch/sparc64/solaris/fs.c | 4 - drivers/md/dm-table.c | 2 drivers/mtd/mtdsuper.c | 4 - fs/afs/mntpt.c | 2 fs/autofs4/root.c | 2 fs/block_dev.c | 2 fs/coda/pioctl.c | 4 - fs/compat.c | 4 - fs/configfs/symlink.c | 4 - fs/dquot.c | 2 fs/ecryptfs/main.c | 2 fs/exec.c | 4 - fs/ext3/super.c | 4 - fs/ext4/super.c | 4 - fs/gfs2/ops_fstype.c | 2 fs/inotify_user.c | 4 - fs/namei.c | 56 ++++++++++++++------------- fs/namespace.c | 20 ++++----- fs/nfs/namespace.c | 2 fs/nfsctl.c | 2 fs/nfsd/export.c | 10 ++-- fs/nfsd/nfs4recover.c | 2 fs/nfsd/nfs4state.c | 2 fs/open.c | 22 +++++----- fs/proc/base.c | 2 fs/reiserfs/super.c | 8 +-- fs/stat.c | 6 +- fs/utimes.c | 2 fs/xattr.c | 16 +++---- fs/xfs/linux-2.6/xfs_ioctl.c | 2 include/linux/namei.h | 1 include/linux/path.h | 2 kernel/auditfilter.c | 4 - net/sunrpc/rpc_pipe.c | 2 net/unix/af_unix.c | 6 +- 39 files changed, 118 insertions(+), 111 deletions(-)
arch/alpha/kernel/osf_sys.c +1 -1
@@ -261,7 +261,7 @@ osf_statfs(char __user *path, struct osf retval =user_path_walk (path, &nd);if (!retval) { retval =do_osf_statfs (nd.path.dentry, buffer, bufsiz); -path_release (&nd); +path_put (&nd.path); }return retval; }
arch/mips/kernel/sysirix.c +3 -3
@@ -711,7 +711,7 @@ asmlinkage int irix_statfs(const char __ } dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -1385,7 +1385,7 @@ asmlinkage int irix_statvfs(char __user error |=__put_user (0 , &buf->f_fstr[i]); dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -1636,7 +1636,7 @@ asmlinkage int irix_statvfs64(char __use error |=__put_user (0 , &buf->f_fstr[i]); dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
arch/parisc/hpux/sys_hpux.c +1 -1
@@ -222,7 +222,7 @@ asmlinkage long hpux_statfs(const char _ error =vfs_statfs_hpux (nd.path.dentry, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ; -path_release (&nd); +path_put (&nd.path); }return error; }
arch/powerpc/platforms/cell/spufs/syscalls.c +1 -1
@@ -91,7 +91,7 @@ asmlinkage long do_spu_create(const char LOOKUP_OPEN|LOOKUP_CREATE, &nd);if (!ret) { ret =spufs_create (&nd, flags, mode, neighbor); -path_release (&nd); +path_put (&nd.path); }putname (tmp); }
arch/sparc64/solaris/fs.c +2 -2
@@ -436,7 +436,7 @@ asmlinkage int solaris_statvfs(u32 path,if (!error) {struct inode *inode = nd.path.dentry->d_inode; error =report_statvfs (nd.path.mnt, inode, buf); -path_release (&nd); +path_put (&nd.path); }return error; }
@@ -466,7 +466,7 @@ asmlinkage int solaris_statvfs64(u32 patif (!error) {struct inode *inode = nd.path.dentry->d_inode; error =report_statvfs64 (nd.path.mnt, inode, buf); -path_release (&nd); +path_put (&nd.path); }unlock_kernel ();return error;
drivers/md/dm-table.c +1 -1
@@ -370,7 +370,7 @@ static int lookup_device(const char *pat *dev = inode->i_rdev; out: -path_release (&nd); +path_put (&nd.path);return r; }
drivers/mtd/mtdsuper.c +2 -2
@@ -203,7 +203,7 @@ int get_sb_mtd(struct file_system_type * goto not_an_MTD_device; mtdnr =iminor (nd.path.dentry->d_inode); -path_release (&nd); +path_put (&nd.path);return get_sb_mtd_nr (fs_type, flags, dev_name, data, mtdnr, fill_super, mnt);
@@ -214,7 +214,7 @@ not_an_MTD_device:"MTD: Attempt to mount non-MTD device \"%s\"\n" , dev_name); out: -path_release (&nd); +path_put (&nd.path);return ret; }
fs/afs/mntpt.c +1 -1
@@ -227,7 +227,7 @@ static void *afs_mntpt_follow_link(struc newmnt =afs_mntpt_do_automount (nd->path.dentry);if (IS_ERR (newmnt)) { -path_release (nd); +path_put (&nd->path);return (void *)newmnt; }
fs/autofs4/root.c +1 -1
@@ -383,7 +383,7 @@ done:return NULL ; out_error: -path_release (nd); +path_put (&nd->path);return ERR_PTR (status); }
fs/block_dev.c +1 -1
@@ -1398,7 +1398,7 @@ struct block_device *lookup_bdev(const cif (!bdev) goto fail; out: -path_release (&nd); +path_put (&nd.path);return bdev; fail: bdev =ERR_PTR (error);
fs/coda/pioctl.c +2 -2
@@ -80,7 +80,7 @@ static int coda_pioctl(struct inode * in/* return if it is not a Coda inode */ if ( target_inode->i_sb != inode->i_sb ) { -path_release (&nd); +path_put (&nd.path);return -EINVAL ; }
@@ -89,7 +89,7 @@ static int coda_pioctl(struct inode * in error =venus_pioctl (inode->i_sb, &(cnp->c_fid), cmd, &data); -path_release (&nd); +path_put (&nd.path);return error; }
fs/compat.c +2 -2
@@ -244,7 +244,7 @@ asmlinkage long compat_sys_statfs(const error =vfs_statfs (nd.path.dentry, &tmp);if (!error) error =put_compat_statfs (buf, &tmp); -path_release (&nd); +path_put (&nd.path); }return error; }
@@ -312,7 +312,7 @@ asmlinkage long compat_sys_statfs64(cons error =vfs_statfs (nd.path.dentry, &tmp);if (!error) error =put_compat_statfs64 (buf, &tmp); -path_release (&nd); +path_put (&nd.path); }return error; }
fs/configfs/symlink.c +2 -2
@@ -103,7 +103,7 @@ static int get_target(const char *symnam *target =configfs_get_config_item (nd->path.dentry);if (!*target) { ret = -ENOENT ; -path_release (nd); +path_put (&nd->path); } }else ret = -EPERM ;
@@ -141,7 +141,7 @@ int configfs_symlink(struct inode *dir, ret =create_link (parent_item, target_item, dentry);config_item_put (target_item); -path_release (&nd); +path_put (&nd.path); out_put:config_item_put (parent_item);
fs/dquot.c +1 -1
@@ -1553,7 +1553,7 @@ int vfs_quota_on(struct super_block *sb, error =vfs_quota_on_inode (nd.path.dentry->d_inode, type, format_id); out_path: -path_release (&nd); +path_put (&nd.path);return error; }
fs/ecryptfs/main.c +1 -1
@@ -500,7 +500,7 @@ static int ecryptfs_read_super(struct su rc =0 ; goto out; out_free: -path_release (&nd); +path_put (&nd.path); out:return rc; }
fs/exec.c +2 -2
@@ -174,7 +174,7 @@ out:return error; exit:release_open_intent (&nd); -path_release (&nd); +path_put (&nd.path); goto out; }
@@ -698,7 +698,7 @@ out: } }release_open_intent (&nd); -path_release (&nd); +path_put (&nd.path); } goto out; }
fs/ext3/super.c +2 -2
@@ -2648,7 +2648,7 @@ static int ext3_quota_on(struct super_blreturn err;/* Quotafile not on the same filesystem? */ if (nd.path.mnt->mnt_sb != sb) { -path_release (&nd); +path_put (&nd.path);return -EXDEV ; }/* Quotafile not of fs root? */
@@ -2656,7 +2656,7 @@ static int ext3_quota_on(struct super_blprintk (KERN_WARNING "EXT3-fs: Quota file not on filesystem root. " "Journalled quota will not work.\n" ); -path_release (&nd); +path_put (&nd.path);return vfs_quota_on (sb, type, format_id, path); }
fs/ext4/super.c +2 -2
@@ -2768,7 +2768,7 @@ static int ext4_quota_on(struct super_blreturn err;/* Quotafile not on the same filesystem? */ if (nd.path.mnt->mnt_sb != sb) { -path_release (&nd); +path_put (&nd.path);return -EXDEV ; }/* Quotafile not of fs root? */
@@ -2776,7 +2776,7 @@ static int ext4_quota_on(struct super_blprintk (KERN_WARNING "EXT4-fs: Quota file not on filesystem root. " "Journalled quota will not work.\n" ); -path_release (&nd); +path_put (&nd.path);return vfs_quota_on (sb, type, format_id, path); }
fs/gfs2/ops_fstype.c +1 -1
@@ -844,7 +844,7 @@ static struct super_block* get_gfs2_sb(c "mount point %s\n", dev_name); free_nd: -path_release (&nd); +path_put (&nd.path); out:return sb; }
fs/inotify_user.c +2 -2
@@ -351,7 +351,7 @@ static int find_inode(const char __user/* you can only watch an inode if you have read permissions on it */ error =vfs_permission (nd,MAY_READ );if (error) -path_release (nd); +path_put (&nd->path);return error; }
@@ -648,7 +648,7 @@ asmlinkage long sys_inotify_add_watch(in ret =create_watch (dev, inode, mask);mutex_unlock (&dev->up_mutex); -path_release (&nd); +path_put (&nd.path); fput_and_out:fput_light (filp, fput_needed);return ret;
fs/namei.c +31 -25
170 lines not on this page · raw message
fs/namespace.c +10 -10
@@ -942,7 +942,7 @@ static int do_loopback(struct nameidata out:up_write (&namespace_sem); -path_release (&old_nd); +path_put (&old_nd.path);return err; }
@@ -1057,8 +1057,8 @@ out1: out:up_write (&namespace_sem);if (!err) -path_release (&parent_nd); -path_release (&old_nd); +path_put (&parent_nd.path); +path_put (&old_nd.path);return err; }
@@ -1442,7 +1442,7 @@ long do_mount(char *dev_name, char *dir_ retval =do_new_mount (&nd, type_page, flags, mnt_flags, dev_name, data_page); dput_out: -path_release (&nd); +path_put (&nd.path);return retval; }
@@ -1698,7 +1698,7 @@ asmlinkage long sys_pivot_root(const cha error =security_sb_pivotroot (&old_nd, &new_nd);if (error) { -path_release (&old_nd); +path_put (&old_nd.path); goto out1; }
@@ -1761,15 +1761,15 @@ asmlinkage long sys_pivot_root(const chachroot_fs_refs (&user_nd, &new_nd);security_sb_post_pivotroot (&user_nd, &new_nd); error =0 ; -path_release (&root_parent); -path_release (&parent_nd); +path_put (&root_parent.path); +path_put (&parent_nd.path); out2:mutex_unlock (&old_nd.path.dentry->d_inode->i_mutex);up_write (&namespace_sem); -path_release (&user_nd); -path_release (&old_nd); +path_put (&user_nd.path); +path_put (&old_nd.path); out1: -path_release (&new_nd); +path_put (&new_nd.path); out0:unlock_kernel ();return error;
fs/nfs/namespace.c +1 -1
@@ -148,7 +148,7 @@ out:dprintk ("<-- nfs_follow_mountpoint() = %d\n" , err);return ERR_PTR (err); out_err: -path_release (nd); +path_put (&nd->path); goto out; out_follow: while (d_mountpoint(nd->path.dentry) &&
fs/nfsctl.c +1 -1
@@ -43,7 +43,7 @@ static struct file *do_open(char *name,if (!error)return dentry_open (nd.path.dentry, nd.path.mnt, flags); -path_release (&nd); +path_put (&nd.path);return ERR_PTR (error); }
fs/nfsd/export.c +5 -5
@@ -177,7 +177,7 @@ static int expkey_parse(struct cache_detcache_put (&ek->h, &svc_expkey_cache); else err = -ENOMEM ; -path_release (&nd); +path_put (&nd.path); }cache_flush (); out:
@@ -632,7 +632,7 @@ static int svc_export_parse(struct cachekfree (exp.ex_uuid);kfree (exp.ex_path);if (nd.path.dentry) -path_release (&nd); +path_put (&nd.path); out_no_path:if (dom)auth_domain_put (dom);
@@ -1100,7 +1100,7 @@ finish:cache_put (&fsid_key->h, &svc_expkey_cache);if (clp)auth_domain_put (clp); -path_release (&nd); +path_put (&nd.path); out_unlock:exp_writeunlock (); out:
@@ -1152,7 +1152,7 @@ exp_unexport(struct nfsctl_export *nxp) err = -EINVAL ; exp =exp_get_by_name (dom, nd.path.mnt, nd.path.dentry,NULL ); -path_release (&nd); +path_put (&nd.path);if (IS_ERR (exp)) goto out_domain;
@@ -1211,7 +1211,7 @@ exp_rootfh(svc_client *clp, char *path,fh_put (&fh);exp_put (exp); out: -path_release (&nd); +path_put (&nd.path);return err; }
fs/nfsd/nfs4recover.c +1 -1
@@ -417,5 +417,5 @@ nfsd4_shutdown_recdir(void)if (!rec_dir_init)return ; rec_dir_init =0 ; -path_release (&rec_dir); +path_put (&rec_dir.path); }
fs/nfsd/nfs4state.c +1 -1
@@ -3342,7 +3342,7 @@ nfs4_reset_recoverydir(char *recdir)nfs4_set_recdir (recdir); status =0 ; } -path_release (&nd); +path_put (&nd.path);return status; }
fs/open.c +11 -11
@@ -130,7 +130,7 @@ asmlinkage long sys_statfs(const char __ error =vfs_statfs_native (nd.path.dentry, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ; -path_release (&nd); +path_put (&nd.path); }return error; }
@@ -149,7 +149,7 @@ asmlinkage long sys_statfs64(const char error =vfs_statfs64 (nd.path.dentry, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ; -path_release (&nd); +path_put (&nd.path); }return error; }
@@ -277,7 +277,7 @@ static long do_sys_truncate(const char _ put_write_and_out:put_write_access (inode); dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -462,7 +462,7 @@ asmlinkage long sys_faccessat(int dfd, c res = -EROFS ; out_path_release: -path_release (&nd); +path_put (&nd.path); out: current->fsuid = old_fsuid; current->fsgid = old_fsgid;
@@ -493,7 +493,7 @@ asmlinkage long sys_chdir(const char __uset_fs_pwd (current->fs, nd.path.mnt, nd.path.dentry); dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -549,7 +549,7 @@ asmlinkage long sys_chroot(const char __set_fs_altroot (); error =0 ; dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -621,7 +621,7 @@ asmlinkage long sys_fchmodat(int dfd, comutex_unlock (&inode->i_mutex); dput_and_out: -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -675,7 +675,7 @@ asmlinkage long sys_chown(const char __uif (error) goto out; error =chown_common (nd.path.dentry, user, group); -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -695,7 +695,7 @@ asmlinkage long sys_fchownat(int dfd, coif (error) goto out; error =chown_common (nd.path.dentry, user, group); -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -709,7 +709,7 @@ asmlinkage long sys_lchown(const char __if (error) goto out; error =chown_common (nd.path.dentry, user, group); -path_release (&nd); +path_put (&nd.path); out:return error; }
@@ -889,7 +889,7 @@ struct file *nameidata_to_filp(struct na filp =__dentry_open (nd->path.dentry, nd->path.mnt, flags, filp,NULL ); else -path_release (nd ); + path_put(&nd->path);return filp; }
fs/proc/base.c +1 -1
@@ -938,7 +938,7 @@ static void *proc_pid_follow_link(structint error = -EACCES ;/* We don't need a base pointer in the /proc filesystem */ -path_release (nd); +path_put (&nd->path);/* Are we allowed to snoop on the tasks file descriptors? */ if (!proc_fd_access_allowed (inode))
fs/reiserfs/super.c +4 -4
@@ -1986,20 +1986,20 @@ static int reiserfs_quota_on(struct supereturn err;/* Quotafile not on the same filesystem? */ if (nd.path.mnt->mnt_sb != sb) { -path_release (&nd); +path_put (&nd.path);return -EXDEV ; }/* We must not pack tails for quota files on reiserfs for quota IO to work */ if (!REISERFS_I (nd.path.dentry->d_inode)->i_flags & i_nopack_mask) {reiserfs_warning (sb,"reiserfs: Quota file must have tail packing disabled." ); -path_release (&nd); +path_put (&nd.path);return -EINVAL ; }/* Not journalling quota? No more tests needed... */ if (!REISERFS_SB (sb)->s_qf_names[USRQUOTA ] && !REISERFS_SB (sb)->s_qf_names[GRPQUOTA ]) { -path_release (&nd); +path_put (&nd.path);return vfs_quota_on (sb, type, format_id, path); }/* Quotafile not of fs root? */
@@ -2007,7 +2007,7 @@ static int reiserfs_quota_on(struct supereiserfs_warning (sb,"reiserfs: Quota file not on filesystem root. " "Journalled quota will not work." ); -path_release (&nd); +path_put (&nd.path);return vfs_quota_on (sb, type, format_id, path); }
fs/stat.c +3 -3
@@ -63,7 +63,7 @@ int vfs_stat_fd(int dfd, char __user *na error =__user_walk_fd (dfd, name,LOOKUP_FOLLOW , &nd);if (!error) { error =vfs_getattr (nd.path.mnt, nd.path.dentry, stat); -path_release (&nd); +path_put (&nd.path); }return error; }
@@ -83,7 +83,7 @@ int vfs_lstat_fd(int dfd, char __user *n error =__user_walk_fd (dfd, name,0 , &nd);if (!error) { error =vfs_getattr (nd.path.mnt, nd.path.dentry, stat); -path_release (&nd); +path_put (&nd.path); }return error; }
@@ -313,7 +313,7 @@ asmlinkage long sys_readlinkat(int dfd, buf, bufsiz); } } -path_release (&nd); +path_put (&nd.path); }return error; }
fs/utimes.c +1 -1
@@ -124,7 +124,7 @@ dput_and_out:if (f)fput (f);else -path_release (&nd); +path_put (&nd.path); out:return error; }
fs/xattr.c +8 -8
@@ -236,7 +236,7 @@ sys_setxattr(char __user *path, char __uif (error)return error; error =setxattr (nd.path.dentry, name, value, size, flags); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -251,7 +251,7 @@ sys_lsetxattr(char __user *path, char __if (error)return error; error =setxattr (nd.path.dentry, name, value, size, flags); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -321,7 +321,7 @@ sys_getxattr(char __user *path, char __uif (error)return error; error =getxattr (nd.path.dentry, name, value, size); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -336,7 +336,7 @@ sys_lgetxattr(char __user *path, char __if (error)return error; error =getxattr (nd.path.dentry, name, value, size); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -395,7 +395,7 @@ sys_listxattr(char __user *path, char __if (error)return error; error =listxattr (nd.path.dentry, list, size); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -409,7 +409,7 @@ sys_llistxattr(char __user *path, char _if (error)return error; error =listxattr (nd.path.dentry, list, size); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -456,7 +456,7 @@ sys_removexattr(char __user *path, charif (error)return error; error =removexattr (nd.path.dentry, name); -path_release (&nd); +path_put (&nd.path);return error; }
@@ -470,7 +470,7 @@ sys_lremovexattr(char __user *path, charif (error)return error; error =removexattr (nd.path.dentry, name); -path_release (&nd); +path_put (&nd.path);return error; }
fs/xfs/linux-2.6/xfs_ioctl.c +1 -1
@@ -94,7 +94,7 @@ xfs_find_handle(ASSERT (nd.path.dentry);ASSERT (nd.path.dentry->d_inode); inode =igrab (nd.path.dentry->d_inode); -path_release (&nd); +path_put (&nd.path);break ; }
include/linux/namei.h +0 -1
@@ -66,7 +66,6 @@ extern int FASTCALL(__user_walk_fd(int dextern int FASTCALL (path_lookup (const char *,unsigned ,struct nameidata *));extern int vfs_path_lookup (struct dentry *,struct vfsmount *,const char *,unsigned int ,struct nameidata *); -extern void path_release (struct nameidata *);extern int __user_path_lookup_open (const char __user *,unsigned lookup_flags,struct nameidata *nd,int open_flags);extern int path_lookup_open (int dfd,const char *name,unsigned lookup_flags,struct nameidata *,int open_flags);
include/linux/path.h +2 -0
@@ -9,4 +9,6 @@ struct path { struct dentry *dentry; }; +extern void path_put (struct path *); +#endif /* _LINUX_PATH_H */
kernel/auditfilter.c +2 -2
@@ -1123,11 +1123,11 @@ static int audit_get_nd(char *path, strustatic void audit_put_nd (struct nameidata *ndp,struct nameidata *ndw) {if (ndp) { -path_release (ndp); +path_put (&ndp->path);kfree (ndp); }if (ndw) { -path_release (ndw); +path_put (&ndw->path);kfree (ndw); } }
net/sunrpc/rpc_pipe.c +1 -1
@@ -483,7 +483,7 @@ rpc_lookup_parent(char *path, struct namstatic void rpc_release_path (struct nameidata *nd) { -path_release (nd); +path_put (&nd->path);rpc_put_mount (); }
net/unix/af_unix.c +3 -3
@@ -743,7 +743,7 @@ static struct sock *unix_find_other(struif (u->sk_type == type)touch_atime (nd.path.mnt, nd.path.dentry); -path_release (&nd); +path_put (&nd.path); err=-EPROTOTYPE ;if (u->sk_type != type) {
@@ -764,7 +764,7 @@ static struct sock *unix_find_other(strureturn u; put_fail: -path_release (&nd); +path_put (&nd.path); fail: *error=err;return NULL ;
@@ -877,7 +877,7 @@ out_mknod_dput:dput (dentry); out_mknod_unlock:mutex_unlock (&nd.path.dentry->d_inode->i_mutex); -path_release (&nd); +path_put (&nd.path); out_mknod_parent:if (err==-EEXIST ) err=-EADDRINUSE ;
Re: [patch 06/10] Introduce path_put()
Quoted 6 lines · On Thu, Sep 27, 2007 at 04:12:06PM +0200, [email protected] wrote:
* Add
path_put()functions for releasing a reference to the dentry and vfsmount of a struct path in the right order* Switch from
path_release(nd)topath_put(&nd->path)* Rename
dput_path()topath_put_conditional()
Looks correct. As mentioned in the previous round I'm not a big fan personally of killing path_release, but as others are I'm not going to NACK this.
PATCH 7/10 Use path_put() in a few places instead of {mnt,d}put()
In reply to [email protected]Use path_put() in a few places instead of {mnt,d}put()
--- fs/afs/mntpt.c | 3 +-- fs/namei.c | 15 +++++---------- 2 files changed, 6 insertions(+), 12 deletions(-)
fs/afs/mntpt.c +1 -2
@@ -235,8 +235,7 @@ static void *afs_mntpt_follow_link(struc err =do_add_mount (newmnt, nd,MNT_SHRINKABLE , &afs_vfsmounts);switch (err) {case 0 : -dput (nd->path.dentry); -mntput (nd->path.mnt); +path_put (&nd->path); nd->path.mnt = newmnt; nd->path.dentry =dget (newmnt->mnt_root); schedule_delayed_work(&afs_mntpt_expiry_timer,
fs/namei.c +5 -10
@@ -610,8 +610,7 @@ static __always_inline int __do_follow_lif (dentry->d_inode->i_op->put_link) dentry->d_inode->i_op->put_link (dentry, nd, cookie); } -dput (dentry); -mntput (path->mnt); +path_put (path);return error; }
@@ -1018,8 +1017,7 @@ static int fastcall link_path_walk(const result =__link_path_walk (name, nd); } -dput (save.path.dentry); -mntput (save.path.mnt); +path_put (&save.path);return result; }
@@ -1041,8 +1039,7 @@ static int __emul_lookup_dentry(const chif (!nd->path.dentry->d_inode ||S_ISDIR (nd->path.dentry->d_inode->i_mode)) { -struct dentry *old_dentry = nd->path.dentry; -struct vfsmount *old_mnt = nd->path.mnt; +struct path old_path = nd->path;struct qstr last = nd->last;int last_type = nd->last_type;struct fs_struct *fs = current->fs;
@@ -1058,14 +1055,12 @@ static int __emul_lookup_dentry(const chread_unlock (&fs->lock);if (path_walk (name, nd) ==0 ) {if (nd->path.dentry->d_inode) { -dput (old_dentry); -mntput (old_mnt); +path_put (&old_path);return 1 ; }path_put (&nd->path); } - nd->path.dentry = old_dentry; - nd->path.mnt = old_mnt; + nd->path = old_path; nd->last = last; nd->last_type = last_type; }
Re: [patch 07/10] Use path_put() in a few places instead of {mnt,d}put()
Quoted 1 line · On Thu, Sep 27, 2007 at 04:12:07PM +0200, [email protected] wrote:
Use
path_put()in a few places instead of {mnt,d}put()
Looks good.
PATCH 8/10 Introduce path_get()
In reply to [email protected]This introduces the symmetric function to path_put() for getting a reference to the dentry and vfsmount of a struct path in the right order.
--- fs/namei.c | 17 +++++++++++++++-- include/linux/path.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-)
fs/namei.c +15 -2
@@ -348,6 +348,20 @@ int deny_write_access(struct file * file }/** +* path_get - get a reference to a path +* @path: path to get the reference to +* +* Given a path increment the reference count to the dentry and the vfsmount. +*/ +struct path *path_get (struct path *path) +{ +mntget (path->mnt); +dget (path->dentry); +return path; +} +EXPORT_SYMBOL (path_get); + +/** * path_put - put a reference to a path * @path: path to put the reference to *
@@ -1145,8 +1159,7 @@ static int fastcall do_path_lookup(int dif (retval) goto fput_fail; - nd->path.mnt =mntget (file->f_path.mnt); - nd->path.dentry =dget (dentry); + nd->path = *path_get (&file->f_path);fput_light (file, fput_needed); }
include/linux/path.h +1 -0
@@ -9,6 +9,7 @@ struct path { struct dentry *dentry; }; +extern struct path *path_get (struct path *);extern void path_put (struct path *);#endif /* _LINUX_PATH_H */
Re: [patch 08/10] Introduce path_get()
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:08PM +0200, [email protected] wrote:
This introduces the symmetric function to
path_put()for getting a reference to the dentry and vfsmount of a struct path in the right order.
Looks good in general,
fs/namei.c int deny_write_access(struct file * file · line 361
Quoted 12 lines
/**
+ *path_get- get a reference to a path
+ * @path: path to get the reference to
+ *
+ * Given a path increment the reference count to the dentry and the vfsmount.
+ */fs/namei.c +6
-0+struct path *path_get (struct path *path) +{ +mntget (path->mnt); +dget (path->dentry); +return path; +}
but the calling convention is rather odd, because the only thing callers might do with this is to dereference and then assign it. Maybe this should just return void to make it more clear what's going on?
PATCH 9/10 Use struct path in fs_struct
In reply to [email protected]* Use struct path in fs_struct.
--- fs/dcache.c | 31 +++++++++---------------- fs/namei.c | 47 +++++++++++++------------------------- fs/namespace.c | 56 +++++++++++++++++++--------------------------- fs/proc/base.c | 8 +++--- include/linux/fs_struct.h | 6 +--- init/do_mounts.c | 6 ++-- kernel/auditsc.c | 4 +-- kernel/exit.c | 12 +++------ kernel/fork.c | 17 +++++-------- 9 files changed, 75 insertions(+), 112 deletions(-)
fs/dcache.c +12 -19
@@ -1854,8 +1854,7 @@ char * d_path(struct dentry *dentry, str char *buf, int buflen) {char *res; -struct vfsmount *rootmnt; -struct dentry *root; +struct path root;/* * We have various synthetic filesystems that never get mounted. On
@@ -1868,14 +1867,12 @@ char * d_path(struct dentry *dentry, strreturn dentry->d_op->d_dname (dentry, buf, buflen);read_lock (¤t->fs->lock); - rootmnt =mntget (current->fs->rootmnt); - root =dget (current->fs->root); + root = *path_get (¤t->fs->root);read_unlock (¤t->fs->lock);spin_lock (&dcache_lock); - res =__d_path (dentry, vfsmnt, root, rootmnt, buf, buflen); + res =__d_path (dentry, vfsmnt, root.dentry, root.mnt, buf, buflen);spin_unlock (&dcache_lock); -dput (root); -mntput (rootmnt); +path_put (&root);return res; }
@@ -1921,28 +1918,26 @@ char *dynamic_dname(struct dentry *dentrasmlinkage long sys_getcwd (char __user *buf,unsigned long size) {int error; -struct vfsmount *pwdmnt, *rootmnt; -struct dentry *pwd, *root; +struct path pwd, root;char *page = (char *)__get_free_page (GFP_USER );if (!page)return -ENOMEM ;read_lock (¤t->fs->lock); - pwdmnt =mntget (current->fs->pwdmnt); - pwd =dget (current->fs->pwd); - rootmnt =mntget (current->fs->rootmnt); - root =dget (current->fs->root); + pwd = *path_get (¤t->fs->pwd); + root = *path_get (¤t->fs->root);read_unlock (¤t->fs->lock); error = -ENOENT ;/* Has the current directory has been unlinked? */ spin_lock (&dcache_lock); -if (pwd->d_parent == pwd || !d_unhashed (pwd)) { +if (pwd.dentry->d_parent == pwd.dentry || !d_unhashed (pwd.dentry)) {unsigned long len;char * cwd; - cwd =__d_path (pwd, pwdmnt, root, rootmnt, page,PAGE_SIZE ); + cwd =__d_path (pwd.dentry, pwd.mnt, root.dentry, root.mnt, + page,PAGE_SIZE );spin_unlock (&dcache_lock); error =PTR_ERR (cwd);
@@ -1960,10 +1955,8 @@ asmlinkage long sys_getcwd(char __user *spin_unlock (&dcache_lock); out: -dput (pwd); -mntput (pwdmnt); -dput (root); -mntput (rootmnt); +path_put (&pwd); +path_put (&root);free_page ((unsigned long ) page);return error; }
fs/namei.c +17 -30
99 lines not on this page · raw message
fs/namespace.c +24 -32
113 lines not on this page · raw message
fs/proc/base.c +4 -4
@@ -162,8 +162,8 @@ static int proc_cwd_link(struct inode *i }if (fs) {read_lock (&fs->lock); - *mnt =mntget (fs->pwdmnt); - *dentry =dget (fs->pwd); + *mnt =mntget (fs->pwd.mnt); + *dentry =dget (fs->pwd.dentry);read_unlock (&fs->lock); result =0 ;put_fs_struct (fs);
@@ -183,8 +183,8 @@ static int proc_root_link(struct inode * }if (fs) {read_lock (&fs->lock); - *mnt =mntget (fs->rootmnt); - *dentry =dget (fs->root); + *mnt =mntget (fs->root.mnt); + *dentry =dget (fs->root.dentry);read_unlock (&fs->lock); result =0 ;put_fs_struct (fs);
include/linux/fs_struct.h +2 -4
@@ -1,15 +1,13 @@#ifndef _LINUX_FS_STRUCT_H#define _LINUX_FS_STRUCT_H -struct dentry ; -struct vfsmount ; +#include <linux/path.h> struct fs_struct {atomic_t count;rwlock_t lock;int umask; -struct dentry * root, * pwd, * altroot; -struct vfsmount * rootmnt, * pwdmnt, * altrootmnt; +struct path root, pwd, altroot; };#define INIT_FS { \
init/do_mounts.c +3 -3
@@ -286,10 +286,10 @@ static int __init do_mount_root(char *nareturn err;sys_chdir ("/root" ); -ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev; +ROOT_DEV = current->fs->pwd.mnt->mnt_sb->s_dev;printk ("VFS: Mounted root (%s filesystem)%s.\n" , - current->fs->pwdmnt->mnt_sb->s_type->name, - current->fs->pwdmnt->mnt_sb->s_flags &MS_RDONLY ? + current->fs->pwd.mnt->mnt_sb->s_type->name, + current->fs->pwd.mnt->mnt_sb->s_flags &MS_RDONLY ?" readonly" :"" );return 0 ; }
kernel/auditsc.c +2 -2
@@ -1313,8 +1313,8 @@ void __audit_getname(const char *name) ++context->name_count;if (!context->pwd) {read_lock (¤t->fs->lock); - context->pwd =dget (current->fs->pwd); - context->pwdmnt =mntget (current->fs->pwdmnt); + context->pwd =dget (current->fs->pwd.dentry); + context->pwdmnt =mntget (current->fs->pwd.mnt);read_unlock (¤t->fs->lock); }
kernel/exit.c +4 -8
@@ -514,14 +514,10 @@ static inline void __put_fs_struct(struc {/* No need to hold fs->lock if we are killing it */ if (atomic_dec_and_test (&fs->count)) { -dput (fs->root); -mntput (fs->rootmnt); -dput (fs->pwd); -mntput (fs->pwdmnt); -if (fs->altroot) { -dput (fs->altroot); -mntput (fs->altrootmnt); - } +path_put (&fs->root); +path_put (&fs->pwd); +if (fs->altroot.dentry) +path_put (&fs->altroot);kmem_cache_free (fs_cachep, fs); } }
kernel/fork.c +7 -10
@@ -582,16 +582,13 @@ static inline struct fs_struct *__copy_frwlock_init (&fs->lock); fs->umask = old->umask;read_lock (&old->lock); - fs->rootmnt =mntget (old->rootmnt); - fs->root =dget (old->root); - fs->pwdmnt =mntget (old->pwdmnt); - fs->pwd =dget (old->pwd); -if (old->altroot) { - fs->altrootmnt =mntget (old->altrootmnt); - fs->altroot =dget (old->altroot); - }else { - fs->altrootmnt =NULL ; - fs->altroot =NULL ; + fs->root = *path_get (&old->root); + fs->pwd = *path_get (&old->pwd); +if (old->altroot.dentry) + fs->altroot = *path_get (&old->altroot); +else { + fs->altroot.mnt =NULL ; + fs->altroot.dentry =NULL ; }read_unlock (&old->lock); }
Re: [patch 09/10] Use struct path in fs_struct
fs/dcache.c char * d_path(struct dentry *dentry, str · line 1873
Quoted 2 lines
fs/dcache.c +1
-1- res =__d_path (dentry, vfsmnt, root, rootmnt, buf, buflen); + res =__d_path (dentry, vfsmnt, root.dentry, root.mnt, buf, buflen);
__d_path should probably switch to taking a struct path * aswell.
Otherwise fine.
Re: [patch 09/10] Use struct path in fs_struct
Quoted 1 line · Christoph Hellwig
__d_pathshould probably switch to taking a struct path * aswell.
Indeed, it now easily can. Here we go...
One less parameter to __d_path
All callers to __d_path pass the dentry and vfsmount of a struct path to __d_path. Pass the struct path directly, instead.
fs/dcache.c +5 -7
@@ -1781,9 +1781,8 @@ shouldnt_be_hashed:* * "buflen" should be positive. Caller holds the dcache_lock. */ -static char *__d_path (struct dentry *dentry,struct vfsmount *vfsmnt, -struct dentry *root,struct vfsmount *rootmnt, -char *buffer,int buflen) +static char *__d_path (struct dentry *dentry,struct vfsmount *vfsmnt, +struct path *root,char *buffer,int buflen) {char * end = buffer+buflen;char * retval;
@@ -1808,7 +1807,7 @@ static char * __d_path( struct dentry *dfor (;;) {struct dentry * parent; -if (dentry == root && vfsmnt == rootmnt) +if (dentry == root->dentry && vfsmnt == root->mnt)break ;if (dentry == vfsmnt->mnt_root ||IS_ROOT (dentry)) {/* Global root? */
@@ -1870,7 +1869,7 @@ char * d_path(struct dentry *dentry, str root = *path_get (¤t->fs->root);read_unlock (¤t->fs->lock);spin_lock (&dcache_lock); - res =__d_path (dentry, vfsmnt, root.dentry, root.mnt, buf, buflen); + res =__d_path (dentry, vfsmnt, &root, buf, buflen);spin_unlock (&dcache_lock);path_put (&root);return res;
@@ -1936,8 +1935,7 @@ asmlinkage long sys_getcwd(char __user *unsigned long len;char * cwd; - cwd =__d_path (pwd.dentry, pwd.mnt, root.dentry, root.mnt, - page,PAGE_SIZE ); + cwd =__d_path (pwd.dentry, pwd.mnt, &root, page,PAGE_SIZE );spin_unlock (&dcache_lock); error =PTR_ERR (cwd);
Re: [patch 09/10] Use struct path in fs_struct
Quoted 10 lines · Andreas Gruenbacher
Quoted 1 line · Christoph Hellwig
__d_pathshould probably switch to taking a struct path * aswell.Indeed, it now easily can. Here we go...
One less parameter to
__d_pathAll callers to
__d_pathpass the dentry and vfsmount of a struct path to__d_path. Pass the struct path directly, instead.
Looks good. If you have some sparse time left the dentry and vfsmnt arguments of __d_path and d_path should probably be switched over to a struct path aswell. For about half of the callers that works out easily because they have a struct file, and some need some reshuffling (e.g. /proc/ symlink code or the dcookies that want to store a struct path aswell)
Re: [patch 09/10] Use struct path in fs_struct
Quoted 12 lines · Christoph Hellwig
Quoted 10 lines · Andreas Gruenbacher
Quoted 1 line · Christoph Hellwig
__d_pathshould probably switch to taking a struct path * aswell.Indeed, it now easily can. Here we go...
One less parameter to
__d_pathAll callers to
__d_pathpass the dentry and vfsmount of a struct path to__d_path. Pass the struct path directly, instead.
Quoted 6 lines
Looks good. If you have some sparse time left the dentry and vfsmnt arguments of
__d_pathandd_pathshould probably be switched over to a struct path aswell. For about half of the callers that works out easily because they have a struct file, and some need some reshuffling (e.g./proc/symlink code or the dcookies that want to store a struct path aswell)
And thinking about it the function should also grow a better name, say print_path. And if you really touch it moving the kerneldoc comment to d_path from __d_path would also be very useful.
PATCH 10/10 Make set_fs_{root,pwd} take a struct path
In reply to [email protected]In nearly all cases the set_fs_{root,pwd}() calls work on a struct path. Change the function to reflect this and use path_get() here.
--- fs/namespace.c | 26 ++++++++++++-------------- fs/open.c | 12 ++++-------- include/linux/fs_struct.h | 4 ++-- 3 files changed, 18 insertions(+), 24 deletions(-)
fs/namespace.c +12 -14
@@ -1580,15 +1580,13 @@ out1:* Replace the fs->{rootmnt,root} with {mnt,dentry}. Put the old values. * It can block. Requires the big lock held. */ -void set_fs_root (struct fs_struct *fs,struct vfsmount *mnt, -struct dentry *dentry) +void set_fs_root (struct fs_struct *fs,struct path *path) {struct path old_root;write_lock (&fs->lock); old_root = fs->root; - fs->root.mnt =mntget (mnt); - fs->root.dentry =dget (dentry); + fs->root = *path_get (path);write_unlock (&fs->lock);if (old_root.dentry)path_put (&old_root);
@@ -1598,15 +1596,13 @@ void set_fs_root(struct fs_struct *fs, s* Replace the fs->{pwdmnt,pwd} with {mnt,dentry}. Put the old values. * It can block. Requires the big lock held. */ -void set_fs_pwd (struct fs_struct *fs,struct vfsmount *mnt, -struct dentry *dentry) +void set_fs_pwd (struct fs_struct *fs,struct path *path) {struct path old_pwd;write_lock (&fs->lock); old_pwd = fs->pwd; - fs->pwd.mnt =mntget (mnt); - fs->pwd.dentry =dget (dentry); + fs->pwd = *path_get (path);write_unlock (&fs->lock);if (old_pwd.dentry)
@@ -1627,12 +1623,10 @@ static void chroot_fs_refs(struct nameidtask_unlock (p);if (fs->root.dentry == old_nd->path.dentry && fs->root.mnt == old_nd->path.mnt) -set_fs_root (fs, new_nd->path.mnt, - new_nd->path.dentry); +set_fs_root (fs, &new_nd->path);if (fs->pwd.dentry == old_nd->path.dentry && fs->pwd.mnt == old_nd->path.mnt) -set_fs_pwd (fs, new_nd->path.mnt, - new_nd->path.dentry); +set_fs_pwd (fs, &new_nd->path);put_fs_struct (fs); }else task_unlock (p);
@@ -1774,6 +1768,7 @@ static void __init init_mount_tree(void) {struct vfsmount *mnt;struct mnt_namespace *ns; +struct path root; mnt =do_kern_mount ("rootfs" ,0 ,"rootfs" ,NULL );if (IS_ERR (mnt))
@@ -1792,8 +1787,11 @@ static void __init init_mount_tree(void) init_task.nsproxy->mnt_ns = ns;get_mnt_ns (ns); -set_fs_pwd (current->fs, ns->root, ns->root->mnt_root); -set_fs_root (current->fs, ns->root, ns->root->mnt_root); + root.mnt = ns->root; + root.dentry = ns->root->mnt_root; + +set_fs_pwd (current->fs, &root); +set_fs_root (current->fs, &root); }void __init mnt_init (unsigned long mempages)
fs/open.c +4 -8
@@ -490,7 +490,7 @@ asmlinkage long sys_chdir(const char __uif (error) goto dput_and_out; -set_fs_pwd (current->fs, nd.path.mnt, nd.path.dentry); +set_fs_pwd (current->fs, &nd.path); dput_and_out:path_put (&nd.path);
@@ -501,9 +501,7 @@ out:asmlinkage long sys_fchdir (unsigned int fd) {struct file *file; -struct dentry *dentry;struct inode *inode; -struct vfsmount *mnt;int error; error = -EBADF ;
@@ -511,9 +509,7 @@ asmlinkage long sys_fchdir(unsigned intif (!file) goto out; - dentry = file->f_path.dentry; - mnt = file->f_path.mnt; - inode = dentry->d_inode; + inode = file->f_path.dentry->d_inode; error = -ENOTDIR ;if (!S_ISDIR (inode->i_mode))
@@ -521,7 +517,7 @@ asmlinkage long sys_fchdir(unsigned int error =file_permission (file,MAY_EXEC );if (!error) -set_fs_pwd (current->fs, mnt, dentry); +set_fs_pwd (current->fs, &file->f_path); out_putf:fput (file); out:
@@ -545,7 +541,7 @@ asmlinkage long sys_chroot(const char __if (!capable (CAP_SYS_CHROOT )) goto dput_and_out; -set_fs_root (current->fs, nd.path.mnt, nd.path.dentry); +set_fs_root (current->fs, &nd.path);set_fs_altroot (); error =0 ; dput_and_out:
include/linux/fs_struct.h +2 -2
@@ -20,8 +20,8 @@ extern struct kmem_cache *fs_cachep;extern void exit_fs (struct task_struct *);extern void set_fs_altroot (void ); -extern void set_fs_root (struct fs_struct *,struct vfsmount *,struct dentry *); -extern void set_fs_pwd (struct fs_struct *,struct vfsmount *,struct dentry *); +extern void set_fs_root (struct fs_struct *,struct path *); +extern void set_fs_pwd (struct fs_struct *,struct path *);extern struct fs_struct *copy_fs_struct (struct fs_struct *);extern void put_fs_struct (struct fs_struct *);
Re: [patch 10/10] Make set_fs_{root,pwd} take a struct path
Quoted 2 lines · On Thu, Sep 27, 2007 at 04:12:10PM +0200, [email protected] wrote:
In nearly all cases the set_fs_{root,pwd}() calls work on a struct path. Change the function to reflect this and use
path_get()here.
Looks good.
PATCH 1/1 Combine path_put and path_put_conditional
In reply to [email protected]Here is another cleanup on top of Jan's set. Comments?
The name path_put_conditional (formerly, dput_path) is a little unclear. Replace (path_put_conditional + path_put) with path_walk_put_both, "put a pair of paths after a path_walk" (see the kerneldoc).
fs/namei.c +25 -11
@@ -582,11 +582,22 @@ fail:return PTR_ERR (link); } -static void path_put_conditional (struct path *path,struct nameidata *nd) -{ -dput (path->dentry); -if (path->mnt != nd->path.mnt) -mntput (path->mnt); +/** +* path_walk_put_both - put a pair of paths after a path_walk +* @path1: first path to put +* @path2: second path to put +* +* When walking a path we keep the same vfsmnt reference while on the same +* filesystem, and grab a reference to the new vfsmnt when crossing mount +* points. Put both @path1 and @path2 under this assumption. +*/ +static void path_walk_put_both (struct path *path1,struct path *path2) +{ +dput (path1->dentry); +dput (path2->dentry); +mntput (path1->mnt); +if (path1->mnt != path2->mnt) +mntput (path2->mnt); }static inline void path_to_nameidata (struct path *path,struct nameidata *nd)
@@ -654,8 +665,7 @@ static inline int do_follow_link(struct nd->depth--;return err; loop: -path_put_conditional (path, nd); -path_put (&nd->path); +path_walk_put_both (path, &nd->path);return err; }
@@ -996,8 +1006,8 @@ return_reval: return_base:return 0 ; out_dput: -path_put_conditional (&next, nd); -break ; +path_walk_put_both (&next, &nd->path); + goto return_err; }path_put (&nd->path); return_err:
@@ -1777,11 +1787,15 @@ ok:return 0 ; exit_dput: -path_put_conditional (&path, nd); +path_walk_put_both (&path, &nd->path); + goto exit_intent; + exit: +path_put (&nd->path); + +exit_intent:if (!IS_ERR (nd->intent.open.file))release_open_intent (nd); -path_put (&nd->path);return error; do_link:
Re: [patch] Combine path_put and path_put_conditional
Quoted 6 lines · Andreas Gruenbacher
Here is another cleanup on top of Jan's set. Comments?
The name
path_put_conditional(formerly,dput_path) is a little unclear. Replace (path_put_conditional+path_put) withpath_walk_put_both, "put a pair of paths after apath_walk" (see the kerneldoc).
I think this function is a good idea. The name seems odd to me, but I don't really have a better idea either.
fs/namei.c fail: · line 601
Quoted 8 lines
fs/namei.c +7
-0+static void path_walk_put_both (struct path *path1,struct path *path2) +{ +dput (path1->dentry); +dput (path2->dentry); +mntput (path1->mnt); +if (path1->mnt != path2->mnt) +mntput (path2->mnt); }
Why do you opencode the path_put for path1?
Re: [patch] Combine path_put and path_put_conditional
In reply to Andreas GruenbacherQuoted 3 lines · Andreas Gruenbacher
The name
path_put_conditional(formerly,dput_path) is a little unclear. Replace (path_put_conditional+path_put) withpath_walk_put_both, "put a pair of paths after apath_walk" (see the kerneldoc).
Hmm, I don't know. To put both the nd and path is at the moment only used in some error paths. I have another series of patches pending which is using path_put_conditional outside of error paths. So please don't remove it. Besides that the naming completely hides that the conditional release of the vfsmount reference. Besides that I would name it path_put_both() just to make it more "beautiful" wrt the other path_put*() functions.
Quoted 19 lines
fs/namei.c +5
-3@@ -996,8 +1006,8 @@ return_reval: return_base:return 0 ; out_dput: -path_put_conditional (&next, nd); -break ; +path_walk_put_both (&next, &nd->path); + goto return_err; }path_put (&nd->path); return_err:@@ -1777,11 +1787,15 @@ ok:return 0 ; exit_dput: -path_put_conditional (&path, nd); +path_walk_put_both (&path, &nd->path); + goto exit_intent; +
fs/namei.c ok: · line 1801
Quoted 10 lines
fs/namei.c +3
-1exit: +path_put (&nd->path); + +exit_intent:if (!IS_ERR (nd->intent.open.file))release_open_intent (nd); -path_put (&nd->path);return error; do_link:
IMHO introducing another label just to use it here isn't worth the change.
Re: [patch] Combine path_put and path_put_conditional
In reply to Andreas GruenbacherHi Andreas,
Quoted 3 lines · Andreas Gruenbacher
The name
path_put_conditional(formerly,dput_path) is a little unclear. Replace (path_put_conditional+path_put) withpath_walk_put_both, "put a pair of paths after apath_walk" (see the kerneldoc).
^^^^^^^^^^^^^
So why not name it path_walk_put_pair() then?
Rationale: "_both" is just counting, "_pair"
means they are related somehow.
Best regards
Ingo Oeser
Any reasons this didn't go into -mm? It's all straight-forward cleanup and it would be a pity not to see it in 2.6.24
Quoted 10 lines · On Thu, Sep 27, 2007 at 04:12:00PM +0200, [email protected] wrote:
This is a respin of the patch series Andreas posted last month. It leaves out the restructuring of the intent which will be done at a later point in time.
There are three preparing patches that remove unneeded code IMHO. I haven't got feedback from Takashi since he is on holiday. Please, can somebody else acknowledge the changes?
Comments?
Jan
---end quoted text---