From: Dave Hansen <hansendc@us.ibm.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: haveblue@linux.vnet.ibm.com, akpm@osdl.org,
linux-fsdevel@vger.kernel.org, viro@ftp.linux.org.uk
Subject: Re: [PATCH 22/26] sys_mknodat(): elevate write count for vfs_mknod/create()
Date: Thu, 05 Jul 2007 15:43:32 -0700 [thread overview]
Message-ID: <1183675412.10287.91.camel@localhost> (raw)
In-Reply-To: <20070630093901.GI22354@infradead.org>
On Sat, 2007-06-30 at 10:39 +0100, Christoph Hellwig wrote:
> On Mon, Jun 25, 2007 at 08:19:52AM -0700, Dave Hansen wrote:
> > > Should we just take the calls outside the switch statement?
> >
> > Yeah, that's much better. I assume we don't care whether we're getting
> > -EROFS or -EPERM/-EINVAL for the S_IFDIR and default cases?
>
> We need to keep the exact error returns, so you'll have to add some
> special case checks before the r/o check. It's probably still cleaner,
> though.
How does this (untested) patch look?
--
This takes care of all of the direct callers of vfs_mknod().
Since a few of these cases also handle normal file creation
as well, this also covers some calls to vfs_create().
So that we don't have to make three mnt_want/drop_write()
calls inside of the switch statement, we move some of its
logic outside of the switch.
One thing I noticed: do we actually _need_ the first
S_ISDIR() check at the top of the function?
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---
lxc-dave/fs/namei.c | 29 ++++++++++++++++++++---------
lxc-dave/fs/nfsd/vfs.c | 8 ++++++--
lxc-dave/net/unix/af_unix.c | 4 ++++
3 files changed, 30 insertions(+), 11 deletions(-)
diff -puN fs/namei.c~18-24-sys-mknodat-elevate-write-count-for-vfs-mknod-create fs/namei.c
--- lxc/fs/namei.c~18-24-sys-mknodat-elevate-write-count-for-vfs-mknod-create 2007-07-05 15:40:18.000000000 -0700
+++ lxc-dave/fs/namei.c 2007-07-05 15:40:26.000000000 -0700
@@ -1911,13 +1911,27 @@ asmlinkage long sys_mknodat(int dfd, con
error = do_path_lookup(dfd, tmp, LOOKUP_PARENT, &nd);
if (error)
goto out;
+
dentry = lookup_create(&nd, 0);
error = PTR_ERR(dentry);
+ if (error)
+ goto out_unlock;
if (!IS_POSIXACL(nd.dentry->d_inode))
mode &= ~current->fs->umask;
- if (!IS_ERR(dentry)) {
- switch (mode & S_IFMT) {
+ if (S_ISDIR(mode)) {
+ error = -EPERM;
+ goto out_dput;
+ }
+ if (!S_ISREG(mode) && !S_ISCHR(mode) && !S_ISBLK(mode) &&
+ !S_ISFIFO(mode) && !S_ISSOCK(mode) && (mode != 0)) {
+ error = -EINVAL;
+ goto out_dput;
+ }
+ error = mnt_want_write(nd.mnt);
+ if (error)
+ goto out_dput;
+ switch (mode & S_IFMT) {
case 0: case S_IFREG:
error = vfs_create(nd.dentry->d_inode,dentry,mode,&nd);
break;
@@ -1928,14 +1942,11 @@ asmlinkage long sys_mknodat(int dfd, con
case S_IFIFO: case S_IFSOCK:
error = vfs_mknod(nd.dentry->d_inode,dentry,mode,0);
break;
- case S_IFDIR:
- error = -EPERM;
- break;
- default:
- error = -EINVAL;
- }
- dput(dentry);
}
+ mnt_drop_write(nd.mnt);
+out_dput:
+ dput(dentry);
+out_unlock:
mutex_unlock(&nd.dentry->d_inode->i_mutex);
path_release(&nd);
out:
diff -puN fs/nfsd/vfs.c~18-24-sys-mknodat-elevate-write-count-for-vfs-mknod-create fs/nfsd/vfs.c
--- lxc/fs/nfsd/vfs.c~18-24-sys-mknodat-elevate-write-count-for-vfs-mknod-create 2007-07-05 15:40:18.000000000 -0700
+++ lxc-dave/fs/nfsd/vfs.c 2007-07-05 15:40:18.000000000 -0700
@@ -1199,7 +1199,11 @@ nfsd_create(struct svc_rqst *rqstp, stru
case S_IFBLK:
case S_IFIFO:
case S_IFSOCK:
+ host_err = mnt_want_write(fhp->fh_export->ex_mnt);
+ if (host_err)
+ break;
host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
+ mnt_drop_write(fhp->fh_export->ex_mnt);
break;
default:
printk("nfsd: bad file type %o in nfsd_create\n", type);
@@ -1810,7 +1814,7 @@ nfsd_permission(struct svc_export *exp,
inode->i_mode,
IS_IMMUTABLE(inode)? " immut" : "",
IS_APPEND(inode)? " append" : "",
- __mnt_is_readonly(exp->mnt)? " ro" : "");
+ __mnt_is_readonly(exp->ex_mnt)? " ro" : "");
dprintk(" owner %d/%d user %d/%d\n",
inode->i_uid, inode->i_gid, current->fsuid, current->fsgid);
#endif
@@ -1821,7 +1825,7 @@ nfsd_permission(struct svc_export *exp,
*/
if (!(acc & MAY_LOCAL_ACCESS))
if (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC)) {
- if (EX_RDONLY(exp) || __mnt_is_readonly(exp->mnt))
+ if (EX_RDONLY(exp) || __mnt_is_readonly(exp->ex_mnt))
return nfserr_rofs;
if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode))
return nfserr_perm;
diff -puN net/unix/af_unix.c~18-24-sys-mknodat-elevate-write-count-for-vfs-mknod-create net/unix/af_unix.c
--- lxc/net/unix/af_unix.c~18-24-sys-mknodat-elevate-write-count-for-vfs-mknod-create 2007-07-05 15:40:18.000000000 -0700
+++ lxc-dave/net/unix/af_unix.c 2007-07-05 15:40:18.000000000 -0700
@@ -815,7 +815,11 @@ static int unix_bind(struct socket *sock
*/
mode = S_IFSOCK |
(SOCK_INODE(sock)->i_mode & ~current->fs->umask);
+ err = mnt_want_write(nd.mnt);
+ if (err)
+ goto out_mknod_dput;
err = vfs_mknod(nd.dentry->d_inode, dentry, mode, 0);
+ mnt_drop_write(nd.mnt);
if (err)
goto out_mknod_dput;
mutex_unlock(&nd.dentry->d_inode->i_mutex);
_
next prev parent reply other threads:[~2007-07-05 22:43 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-22 20:03 [PATCH 00/26] Mount writer count and read-only bind mounts Dave Hansen
2007-06-22 20:03 ` [PATCH 01/26] document nlink function Dave Hansen
2007-06-23 7:36 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 02/26] ext3: remove extra IS_RDONLY() check Dave Hansen
2007-06-23 7:36 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 03/26] ext4: " Dave Hansen
2007-06-23 7:37 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 04/26] filesystem helpers for custom 'struct file's Dave Hansen
2007-06-23 7:38 ` Christoph Hellwig
2007-06-25 14:53 ` Dave Hansen
2007-06-23 16:52 ` Andrew Morton
2007-06-25 15:37 ` Dave Hansen
2007-06-25 17:25 ` Andrew Morton
2007-06-25 17:32 ` Dave Hansen
2007-06-30 9:35 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 05/26] r/o bind mounts: stub functions Dave Hansen
2007-06-23 7:39 ` Christoph Hellwig
2007-06-23 16:52 ` Andrew Morton
2007-06-25 15:49 ` Dave Hansen
2007-06-22 20:03 ` [PATCH 06/26] elevate write count open()'d files Dave Hansen
2007-06-23 7:40 ` Christoph Hellwig
2007-06-25 15:03 ` Dave Hansen
2007-06-22 20:03 ` [PATCH 07/26] r/o bind mounts: elevate write count for some ioctls Dave Hansen
2007-06-23 7:42 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 08/26] elevate writer count for chown and friends Dave Hansen
2007-06-23 7:43 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 09/26] make access() use mnt check Dave Hansen
2007-06-23 7:45 ` Christoph Hellwig
2007-06-25 18:27 ` Dave Hansen
2007-06-26 19:04 ` Dave Kleikamp
2007-06-30 9:37 ` Christoph Hellwig
2007-07-02 16:09 ` Dave Hansen
2007-06-22 20:03 ` [PATCH 10/26] elevate mnt writers for callers of vfs_mkdir() Dave Hansen
2007-06-23 7:45 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 11/26] elevate write count during entire ncp_ioctl() Dave Hansen
2007-06-22 20:03 ` [PATCH 12/26] elevate write count for link and symlink calls Dave Hansen
2007-06-22 20:03 ` [PATCH 13/26] elevate mount count for extended attributes Dave Hansen
2007-06-22 20:03 ` [PATCH 14/26] elevate write count for file_update_time() Dave Hansen
2007-06-23 7:46 ` Christoph Hellwig
2007-06-25 18:32 ` Dave Hansen
2007-06-30 9:38 ` Christoph Hellwig
2007-07-06 19:17 ` Dave Hansen
2007-06-22 20:03 ` [PATCH 15/26] mount_is_safe(): add comment Dave Hansen
2007-06-23 7:47 ` Christoph Hellwig
2007-06-25 15:10 ` Dave Hansen
2007-06-22 20:03 ` [PATCH 16/26] unix_find_other() elevate write count for touch_atime() Dave Hansen
2007-06-23 7:47 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 17/26] elevate write count over calls to vfs_rename() Dave Hansen
2007-06-23 7:49 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 18/26] nfs: check mnt instead of superblock directly Dave Hansen
2007-06-23 7:49 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 19/26] elevate writer count for do_sys_truncate() Dave Hansen
2007-06-23 7:49 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 20/26] elevate write count for do_utimes() Dave Hansen
2007-06-23 7:49 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 21/26] elevate write count for do_sys_utime() and touch_atime() Dave Hansen
2007-06-23 7:50 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 22/26] sys_mknodat(): elevate write count for vfs_mknod/create() Dave Hansen
2007-06-23 7:51 ` Christoph Hellwig
2007-06-25 15:19 ` Dave Hansen
2007-06-30 9:39 ` Christoph Hellwig
2007-07-02 23:31 ` Dave Hansen
2007-07-05 22:43 ` Dave Hansen [this message]
2007-07-07 18:25 ` Jan Engelhardt
2007-07-09 19:04 ` Dave Hansen
2007-07-11 10:22 ` Christoph Hellwig
2007-07-11 10:22 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 23/26] elevate mnt writers for vfs_unlink() callers Dave Hansen
2007-06-23 7:51 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 24/26] do_rmdir(): elevate write count Dave Hansen
2007-06-23 7:51 ` Christoph Hellwig
2007-06-22 20:03 ` [PATCH 25/26] r/o bind mounts: scalable writer count Dave Hansen
2007-06-23 11:28 ` Miklos Szeredi
2007-06-23 11:31 ` Miklos Szeredi
2007-06-25 15:36 ` Dave Hansen
2007-06-25 19:09 ` Miklos Szeredi
2007-06-23 16:52 ` Andrew Morton
2007-06-25 15:47 ` Dave Hansen
2007-06-22 20:03 ` [PATCH 26/26] honor r/w changes at do_remount() time Dave Hansen
2007-06-23 7:51 ` Christoph Hellwig
2007-06-23 16:52 ` [PATCH 00/26] Mount writer count and read-only bind mounts Andrew Morton
2007-06-25 15:45 ` Dave Hansen
2007-06-30 9:57 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1183675412.10287.91.camel@localhost \
--to=hansendc@us.ibm.com \
--cc=akpm@osdl.org \
--cc=haveblue@linux.vnet.ibm.com \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=viro@ftp.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.