From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: Re: [PATCH 22/26] sys_mknodat(): elevate write count for vfs_mknod/create() Date: Sat, 23 Jun 2007 08:51:03 +0100 Message-ID: <20070623075103.GS27954@infradead.org> References: <20070622200303.82D9CC3A@kernel> <20070622200332.DCCD1884@kernel> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: akpm@osdl.org, linux-fsdevel@vger.kernel.org, hch@infradead.org, viro@ftp.linux.org.uk To: Dave Hansen Return-path: Received: from pentafluge.infradead.org ([213.146.154.40]:56170 "EHLO pentafluge.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752452AbXFWHvH (ORCPT ); Sat, 23 Jun 2007 03:51:07 -0400 Content-Disposition: inline In-Reply-To: <20070622200332.DCCD1884@kernel> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On Fri, Jun 22, 2007 at 01:03:32PM -0700, Dave Hansen wrote: > > > 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(). Ok. > 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-06-21 23:23:25.000000000 -0700 > +++ lxc-dave/fs/namei.c 2007-06-21 23:23:25.000000000 -0700 > @@ -1897,14 +1897,26 @@ asmlinkage long sys_mknodat(int dfd, con > if (!IS_ERR(dentry)) { > switch (mode & S_IFMT) { > case 0: case S_IFREG: > + error = mnt_want_write(nd.mnt); > + if (error) > + break; > error = vfs_create(nd.dentry->d_inode,dentry,mode,&nd); > + mnt_drop_write(nd.mnt); > break; > case S_IFCHR: case S_IFBLK: > + error = mnt_want_write(nd.mnt); > + if (error) > + break; > error = vfs_mknod(nd.dentry->d_inode,dentry,mode, > new_decode_dev(dev)); > + mnt_drop_write(nd.mnt); > break; > case S_IFIFO: case S_IFSOCK: > + error = mnt_want_write(nd.mnt); > + if (error) > + break; > error = vfs_mknod(nd.dentry->d_inode,dentry,mode,0); > + mnt_drop_write(nd.mnt); > break; > case S_IFDIR: > error = -EPERM; Should we just take the calls outside the switch statement?