From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759350AbbBIGJJ (ORCPT ); Mon, 9 Feb 2015 01:09:09 -0500 Received: from lgeamrelo01.lge.com ([156.147.1.125]:42361 "EHLO lgeamrelo01.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753131AbbBIGJH (ORCPT ); Mon, 9 Feb 2015 01:09:07 -0500 X-Original-SENDERIP: 10.177.220.203 X-Original-MAILFROM: namhyung@kernel.org Date: Mon, 9 Feb 2015 15:07:22 +0900 From: Namhyung Kim To: Steven Rostedt Cc: linux-kernel@vger.kernel.org, Al Viro , Greg Kroah-Hartman , Ingo Molnar , Andrew Morton Subject: Re: [for-next][PATCH 7/7] tracing: Have mkdir and rmdir be part of tracefs Message-ID: <20150209060722.GC30788@sejong> References: <20150204143420.290584004@goodmis.org> <20150204143756.006343748@goodmis.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20150204143756.006343748@goodmis.org> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Feb 04, 2015 at 09:34:27AM -0500, Steven Rostedt wrote: > +static int tracefs_syscall_mkdir(struct inode *inode, struct dentry *dentry, umode_t mode) > +{ > + char *name; > + int ret; > + > + name = get_dname(dentry); > + if (!name) > + return -ENOMEM; > + > + /* > + * The mkdir call can call the generic functions that create The mkdir can call ... ? > + * the files within the tracefs system. It is up to the individual > + * mkdir routine to handle races. > + */ > + mutex_unlock(&inode->i_mutex); > + ret = tracefs_ops.mkdir(name); > + mutex_lock(&inode->i_mutex); > + > + kfree(name); > + > + return ret; > +} > + > +static int tracefs_syscall_rmdir(struct inode *inode, struct dentry *dentry) > +{ > + char *name; > + int ret; > + > + name = get_dname(dentry); > + if (!name) > + return -ENOMEM; > + > + /* > + * The rmdir call can call the generic functions that create Ditto. > + * the files within the tracefs system. It is up to the individual > + * rmdir routine to handle races. > + * This time we need to unlock not only the parent (inode) but > + * also the directory that is being deleted. > + */ > + mutex_unlock(&inode->i_mutex); > + mutex_unlock(&dentry->d_inode->i_mutex); > + > + ret = tracefs_ops.rmdir(name); > + > + mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT); > + mutex_lock(&dentry->d_inode->i_mutex); > + > + kfree(name); > + > + return ret; > +} > + [SNIP] > +/** > + * tracefs_create_instance_dir - create the tracing instances directory > + * @name: The name of the instances directory to create > + * @parent: The parent directory that the instances directory will exist > + * @mkdir: The function to call when a mkdir is performed. > + * @rmdir: The function to call when a rmdir is performed. > + * > + * Only one instances directory is allowed. > + * > + * The instances directory is special as it allows for mkdir and rmdir to > + * to be done by userspace. When a mkdir or rmdir is performed, the inode > + * locks are released and the methhods passed in (@mkdir and @rmdir) are s/methhods/methods/ Thanks, Namhyung > + * called without locks and with the name of the directory being created > + * within the instances directory. > + * > + * Returns the dentry of the instances directory. > + */ > +struct dentry *tracefs_create_instance_dir(const char *name, struct dentry *parent, > + int (*mkdir)(const char *name), > + int (*rmdir)(const char *name)) > +{ > + struct dentry *dentry; > + > + /* Only allow one instance of the instances directory. */ > + if (WARN_ON(tracefs_ops.mkdir || tracefs_ops.rmdir)) > return NULL; > > - inode = tracefs_get_inode(dentry->d_sb); > - if (unlikely(!inode)) > - return failed_creating(dentry); > + dentry = __create_dir(name, parent, &tracefs_dir_inode_operations); > + if (!dentry) > + return NULL; > > - inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO; > - inode->i_op = &simple_dir_inode_operations; > - inode->i_fop = &simple_dir_operations; > + tracefs_ops.mkdir = mkdir; > + tracefs_ops.rmdir = rmdir; > > - /* directory inodes start off with i_nlink == 2 (for "." entry) */ > - inc_nlink(inode); > - d_instantiate(dentry, inode); > - inc_nlink(dentry->d_parent->d_inode); > - fsnotify_mkdir(dentry->d_parent->d_inode, dentry); > - return end_creating(dentry); > + return dentry; > }