diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-19 20:24:05 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-19 20:24:05 -0400 |
| commit | 6a6be470c3071559970c5659354484d4f664050e (patch) | |
| tree | d4b335e863e426acad96fe5e4bce2e3e064abc32 /fs/nfs/namespace.c | |
| parent | 98c89cdd3a292af3451e47a2a33132f5183861b0 (diff) | |
| parent | 126e216a8730532dfb685205309275f87e3d133e (diff) | |
Merge branch 'nfs-for-2.6.35' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'nfs-for-2.6.35' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: (78 commits)
SUNRPC: Don't spam gssd with upcall requests when the kerberos key expired
SUNRPC: Reorder the struct rpc_task fields
SUNRPC: Remove the 'tk_magic' debugging field
SUNRPC: Move the task->tk_bytes_sent and tk_rtt to struct rpc_rqst
NFS: Don't call iput() in nfs_access_cache_shrinker
NFS: Clean up nfs_access_zap_cache()
NFS: Don't run nfs_access_cache_shrinker() when the mask is GFP_NOFS
SUNRPC: Ensure rpcauth_prune_expired() respects the nr_to_scan parameter
SUNRPC: Ensure memory shrinker doesn't waste time in rpcauth_prune_expired()
SUNRPC: Dont run rpcauth_cache_shrinker() when gfp_mask is GFP_NOFS
NFS: Read requests can use GFP_KERNEL.
NFS: Clean up nfs_create_request()
NFS: Don't use GFP_KERNEL in rpcsec_gss downcalls
NFSv4: Don't use GFP_KERNEL allocations in state recovery
SUNRPC: Fix xs_setup_bc_tcp()
SUNRPC: Replace jiffies-based metrics with ktime-based metrics
ktime: introduce ktime_to_ms()
SUNRPC: RPC metrics and RTT estimator should use same RTT value
NFS: Calldata for nfs4_renew_done()
NFS: Squelch compiler warning in nfs_add_server_stats()
...
Diffstat (limited to 'fs/nfs/namespace.c')
| -rw-r--r-- | fs/nfs/namespace.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 7888cf36022d..db6aa3673cf3 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c | |||
| @@ -105,8 +105,8 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
| 105 | struct vfsmount *mnt; | 105 | struct vfsmount *mnt; |
| 106 | struct nfs_server *server = NFS_SERVER(dentry->d_inode); | 106 | struct nfs_server *server = NFS_SERVER(dentry->d_inode); |
| 107 | struct dentry *parent; | 107 | struct dentry *parent; |
| 108 | struct nfs_fh fh; | 108 | struct nfs_fh *fh = NULL; |
| 109 | struct nfs_fattr fattr; | 109 | struct nfs_fattr *fattr = NULL; |
| 110 | int err; | 110 | int err; |
| 111 | 111 | ||
| 112 | dprintk("--> nfs_follow_mountpoint()\n"); | 112 | dprintk("--> nfs_follow_mountpoint()\n"); |
| @@ -115,6 +115,12 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
| 115 | if (IS_ROOT(dentry)) | 115 | if (IS_ROOT(dentry)) |
| 116 | goto out_err; | 116 | goto out_err; |
| 117 | 117 | ||
| 118 | err = -ENOMEM; | ||
| 119 | fh = nfs_alloc_fhandle(); | ||
| 120 | fattr = nfs_alloc_fattr(); | ||
| 121 | if (fh == NULL || fattr == NULL) | ||
| 122 | goto out_err; | ||
| 123 | |||
| 118 | dprintk("%s: enter\n", __func__); | 124 | dprintk("%s: enter\n", __func__); |
| 119 | dput(nd->path.dentry); | 125 | dput(nd->path.dentry); |
| 120 | nd->path.dentry = dget(dentry); | 126 | nd->path.dentry = dget(dentry); |
| @@ -123,16 +129,16 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
| 123 | parent = dget_parent(nd->path.dentry); | 129 | parent = dget_parent(nd->path.dentry); |
| 124 | err = server->nfs_client->rpc_ops->lookup(parent->d_inode, | 130 | err = server->nfs_client->rpc_ops->lookup(parent->d_inode, |
| 125 | &nd->path.dentry->d_name, | 131 | &nd->path.dentry->d_name, |
| 126 | &fh, &fattr); | 132 | fh, fattr); |
| 127 | dput(parent); | 133 | dput(parent); |
| 128 | if (err != 0) | 134 | if (err != 0) |
| 129 | goto out_err; | 135 | goto out_err; |
| 130 | 136 | ||
| 131 | if (fattr.valid & NFS_ATTR_FATTR_V4_REFERRAL) | 137 | if (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) |
| 132 | mnt = nfs_do_refmount(nd->path.mnt, nd->path.dentry); | 138 | mnt = nfs_do_refmount(nd->path.mnt, nd->path.dentry); |
| 133 | else | 139 | else |
| 134 | mnt = nfs_do_submount(nd->path.mnt, nd->path.dentry, &fh, | 140 | mnt = nfs_do_submount(nd->path.mnt, nd->path.dentry, fh, |
| 135 | &fattr); | 141 | fattr); |
| 136 | err = PTR_ERR(mnt); | 142 | err = PTR_ERR(mnt); |
| 137 | if (IS_ERR(mnt)) | 143 | if (IS_ERR(mnt)) |
| 138 | goto out_err; | 144 | goto out_err; |
| @@ -151,6 +157,8 @@ static void * nfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd) | |||
| 151 | nd->path.dentry = dget(mnt->mnt_root); | 157 | nd->path.dentry = dget(mnt->mnt_root); |
| 152 | schedule_delayed_work(&nfs_automount_task, nfs_mountpoint_expiry_timeout); | 158 | schedule_delayed_work(&nfs_automount_task, nfs_mountpoint_expiry_timeout); |
| 153 | out: | 159 | out: |
| 160 | nfs_free_fattr(fattr); | ||
| 161 | nfs_free_fhandle(fh); | ||
| 154 | dprintk("%s: done, returned %d\n", __func__, err); | 162 | dprintk("%s: done, returned %d\n", __func__, err); |
| 155 | 163 | ||
| 156 | dprintk("<-- nfs_follow_mountpoint() = %d\n", err); | 164 | dprintk("<-- nfs_follow_mountpoint() = %d\n", err); |
