Messages in this thread Patch in this message | | | Date | Wed, 31 Aug 2005 09:58:24 +1000 | From | Nathan Scott <> | Subject | Re: [PATCH] blk queue io tracing support |
| |
Hi there,
On Wed, Aug 31, 2005 at 09:48:23AM +1000, Nathan Scott wrote: > ... > # find /relay > /relay > /relay/block > /relay/block/sdd > /relay/block/sdd/trace3 > /relay/block/sdd/trace2 > /relay/block/sdd/trace1 > /relay/block/sdd/trace0 > /relay/block/sdb > /relay/block/sdb/trace3 > /relay/block/sdb/trace2 > /relay/block/sdb/trace1 > /relay/block/sdb/trace0 > > and does the correct dynamic setup and teardown of the hierarchy > as the userspace tool starts and stops tracing. I had to modify > the relayfs rmdir code a bit to make this work properly, I'll > send a separate patch for that shortly.
Here it is. The problem was that relayfs is allowing a directory with children to be removed rather than returning -ENOTEMPTY. It looks like this can be resolved by splitting the shared relayfs unlink code (which is using simple_unlink) into separate file/dir variants, one using simple_unlink, the other using simple_rmdir.
cheers.
-- Nathan
Index: 2.6.x-xfs/fs/relayfs/inode.c =================================================================== --- 2.6.x-xfs.orig/fs/relayfs/inode.c +++ 2.6.x-xfs/fs/relayfs/inode.c @@ -187,8 +187,8 @@ struct dentry *relayfs_create_dir(const } /** - * relayfs_remove - remove a file or directory in the relay filesystem - * @dentry: file or directory dentry + * relayfs_remove - remove a file in the relay filesystem + * @dentry: file dentry */ int relayfs_remove(struct dentry *dentry) { @@ -219,10 +219,31 @@ int relayfs_remove(struct dentry *dentry */ int relayfs_remove_dir(struct dentry *dentry) { + struct dentry *parent; + int error = 0; + if (!dentry) return -EINVAL; + parent = dentry->d_parent; + if (!parent) + return -EINVAL; + + parent = dget(parent); + down(&parent->d_inode->i_sem); + if (dentry->d_inode) { + error = simple_rmdir(parent->d_inode, dentry); + if (!error) + d_delete(dentry); + } + if (!error) + dput(dentry); + up(&parent->d_inode->i_sem); + dput(parent); + + if (!error) + simple_release_fs(&relayfs_mount, &relayfs_mount_count); - return relayfs_remove(dentry); + return error; } /** - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |