Re: [for-next][PATCH 7/7] tracing: Have mkdir and rmdir be part of tracefs
From: Namhyung Kim
Date: Mon Feb 09 2015 - 01:09:13 EST
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;
> }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/