aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namei.c
diff options
context:
space:
mode:
authorDave Hansen <haveblue@us.ibm.com>2008-02-15 17:37:34 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2008-04-19 00:25:33 -0400
commit0622753b800e4cc6cb9319b36b27658c72dd7cdc (patch)
tree5a32b65a087ff7fd5effa8d3f6f1f9717d4391aa /fs/namei.c
parent49e0d02cf018d4edf24bfc8531a816a26367e4ce (diff)
[PATCH] r/o bind mounts: elevate write count for rmdir and unlink.
Elevate the write count during the vfs_rmdir() and vfs_unlink(). [AV: merged rmdir and unlink parts, added missing pieces in nfsd] Acked-by: Serge Hallyn <serue@us.ibm.com> Acked-by: Al Viro <viro@ZenIV.linux.org.uk> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Hansen <haveblue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/namei.c b/fs/namei.c
index a1f8bbbd58e5..89ef3178eaaa 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2190,7 +2190,12 @@ static long do_rmdir(int dfd, const char __user *pathname)
2190 error = PTR_ERR(dentry); 2190 error = PTR_ERR(dentry);
2191 if (IS_ERR(dentry)) 2191 if (IS_ERR(dentry))
2192 goto exit2; 2192 goto exit2;
2193 error = mnt_want_write(nd.path.mnt);
2194 if (error)
2195 goto exit3;
2193 error = vfs_rmdir(nd.path.dentry->d_inode, dentry); 2196 error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
2197 mnt_drop_write(nd.path.mnt);
2198exit3:
2194 dput(dentry); 2199 dput(dentry);
2195exit2: 2200exit2:
2196 mutex_unlock(&nd.path.dentry->d_inode->i_mutex); 2201 mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
@@ -2271,7 +2276,11 @@ static long do_unlinkat(int dfd, const char __user *pathname)
2271 inode = dentry->d_inode; 2276 inode = dentry->d_inode;
2272 if (inode) 2277 if (inode)
2273 atomic_inc(&inode->i_count); 2278 atomic_inc(&inode->i_count);
2279 error = mnt_want_write(nd.path.mnt);
2280 if (error)
2281 goto exit2;
2274 error = vfs_unlink(nd.path.dentry->d_inode, dentry); 2282 error = vfs_unlink(nd.path.dentry->d_inode, dentry);
2283 mnt_drop_write(nd.path.mnt);
2275 exit2: 2284 exit2:
2276 dput(dentry); 2285 dput(dentry);
2277 } 2286 }