diff options
author | Dave Hansen <haveblue@us.ibm.com> | 2008-02-15 17:37:34 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2008-04-19 00:25:33 -0400 |
commit | 0622753b800e4cc6cb9319b36b27658c72dd7cdc (patch) | |
tree | 5a32b65a087ff7fd5effa8d3f6f1f9717d4391aa /fs/namei.c | |
parent | 49e0d02cf018d4edf24bfc8531a816a26367e4ce (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.c | 9 |
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); | ||
2198 | exit3: | ||
2194 | dput(dentry); | 2199 | dput(dentry); |
2195 | exit2: | 2200 | exit2: |
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 | } |