* [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT()
@ 2008-10-15 13:58 OGAWA Hirofumi
2008-10-15 13:58 ` [PATCH 2/6] vfs: add d_ancestor() OGAWA Hirofumi
2008-10-15 19:45 ` [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() Christoph Hellwig
0 siblings, 2 replies; 21+ messages in thread
From: OGAWA Hirofumi @ 2008-10-15 13:58 UTC (permalink / raw)
To: viro; +Cc: akpm, linux-kernel, hirofumi
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
---
fs/dcache.c | 21 ++++++++++++---------
fs/namei.c | 4 ++--
2 files changed, 14 insertions(+), 11 deletions(-)
diff -puN fs/dcache.c~dcache-cleanup-1 fs/dcache.c
--- linux-2.6/fs/dcache.c~dcache-cleanup-1 2008-09-30 05:24:32.000000000 +0900
+++ linux-2.6-hirofumi/fs/dcache.c 2008-09-30 05:24:32.000000000 +0900
@@ -174,9 +174,12 @@ static struct dentry *d_kill(struct dent
dentry_stat.nr_dentry--; /* For d_free, below */
/*drops the locks, at that point nobody can reach this dentry */
dentry_iput(dentry);
- parent = dentry->d_parent;
+ if (IS_ROOT(dentry))
+ parent = NULL;
+ else
+ parent = dentry->d_parent;
d_free(dentry);
- return dentry == parent ? NULL : parent;
+ return parent;
}
/*
@@ -666,11 +669,12 @@ static void shrink_dcache_for_umount_sub
BUG();
}
- parent = dentry->d_parent;
- if (parent == dentry)
+ if (IS_ROOT(dentry))
parent = NULL;
- else
+ else {
+ parent = dentry->d_parent;
atomic_dec(&parent->d_count);
+ }
list_del(&dentry->d_u.d_child);
detached++;
@@ -1721,7 +1725,7 @@ static int d_isparent(struct dentry *p1,
{
struct dentry *p;
- for (p = p2; p->d_parent != p; p = p->d_parent) {
+ for (p = p2; !IS_ROOT(p); p = p->d_parent) {
if (p->d_parent == p1)
return 1;
}
@@ -2166,10 +2170,9 @@ int is_subdir(struct dentry * new_dentry
seq = read_seqbegin(&rename_lock);
for (;;) {
if (new_dentry != old_dentry) {
- struct dentry * parent = new_dentry->d_parent;
- if (parent == new_dentry)
+ if (IS_ROOT(new_dentry))
break;
- new_dentry = parent;
+ new_dentry = new_dentry->d_parent;
continue;
}
result = 1;
diff -puN fs/namei.c~dcache-cleanup-1 fs/namei.c
--- linux-2.6/fs/namei.c~dcache-cleanup-1 2008-09-30 05:24:32.000000000 +0900
+++ linux-2.6-hirofumi/fs/namei.c 2008-09-30 05:24:32.000000000 +0900
@@ -1470,7 +1470,7 @@ struct dentry *lock_rename(struct dentry
mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex);
- for (p = p1; p->d_parent != p; p = p->d_parent) {
+ for (p = p1; !IS_ROOT(p); p = p->d_parent) {
if (p->d_parent == p2) {
mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT);
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD);
@@ -1478,7 +1478,7 @@ struct dentry *lock_rename(struct dentry
}
}
- for (p = p2; p->d_parent != p; p = p->d_parent) {
+ for (p = p2; !IS_ROOT(p); p = p->d_parent) {
if (p->d_parent == p1) {
mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT);
mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD);
_
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH 2/6] vfs: add d_ancestor() 2008-10-15 13:58 [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() OGAWA Hirofumi @ 2008-10-15 13:58 ` OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 3/6] vfs: add __d_instantiate() helper OGAWA Hirofumi 2008-10-15 19:53 ` [PATCH 2/6] vfs: add d_ancestor() Christoph Hellwig 2008-10-15 19:45 ` [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() Christoph Hellwig 1 sibling, 2 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 13:58 UTC (permalink / raw) To: viro; +Cc: akpm, linux-kernel, hirofumi This adds d_ancestor() instead of d_isparent(), then use it. If new_dentry == old_dentry, is_subdir() returns 1, looks strange. But I'm not checking callers for now, so this keeps current behavior. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> --- fs/dcache.c | 28 ++++++++++------------------ fs/namei.c | 22 ++++++++++------------ include/linux/dcache.h | 1 + 3 files changed, 21 insertions(+), 30 deletions(-) diff -puN fs/dcache.c~dcache-cleanup-2 fs/dcache.c --- linux-2.6/fs/dcache.c~dcache-cleanup-2 2008-10-13 02:26:23.000000000 +0900 +++ linux-2.6-hirofumi/fs/dcache.c 2008-10-13 02:26:55.000000000 +0900 @@ -1719,17 +1719,18 @@ void d_move(struct dentry * dentry, stru } /* - * Helper that returns 1 if p1 is a parent of p2, else 0 + * Helper that returns the ancestor dentry of p2 which is a child of + * p1, if p1 is an ancestor of p2, else NULL. */ -static int d_isparent(struct dentry *p1, struct dentry *p2) +struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2) { struct dentry *p; for (p = p2; !IS_ROOT(p); p = p->d_parent) { if (p->d_parent == p1) - return 1; + return p; } - return 0; + return NULL; } /* @@ -1753,7 +1754,7 @@ static struct dentry *__d_unalias(struct /* Check for loops */ ret = ERR_PTR(-ELOOP); - if (d_isparent(alias, dentry)) + if (d_ancestor(alias, dentry)) goto out_err; /* See lock_rename() */ @@ -2156,28 +2157,19 @@ out: int is_subdir(struct dentry * new_dentry, struct dentry * old_dentry) { int result; - struct dentry * saved = new_dentry; unsigned long seq; + if (new_dentry == old_dentry) + return 1; + /* need rcu_readlock to protect against the d_parent trashing due to * d_move */ rcu_read_lock(); do { /* for restarting inner loop in case of seq retry */ - new_dentry = saved; - result = 0; seq = read_seqbegin(&rename_lock); - for (;;) { - if (new_dentry != old_dentry) { - if (IS_ROOT(new_dentry)) - break; - new_dentry = new_dentry->d_parent; - continue; - } - result = 1; - break; - } + result = (d_ancestor(old_dentry, new_dentry) != NULL); } while (read_seqretry(&rename_lock, seq)); rcu_read_unlock(); diff -puN include/linux/dcache.h~dcache-cleanup-2 include/linux/dcache.h --- linux-2.6/include/linux/dcache.h~dcache-cleanup-2 2008-10-13 02:26:23.000000000 +0900 +++ linux-2.6-hirofumi/include/linux/dcache.h 2008-10-13 02:26:23.000000000 +0900 @@ -287,6 +287,7 @@ static inline struct dentry *d_add_uniqu /* used for rename() and baskets */ extern void d_move(struct dentry *, struct dentry *); +extern struct dentry *d_ancestor(struct dentry *, struct dentry *); /* appendix may either be NULL or be used for transname suffixes */ extern struct dentry * d_lookup(struct dentry *, struct qstr *); diff -puN fs/namei.c~dcache-cleanup-2 fs/namei.c --- linux-2.6/fs/namei.c~dcache-cleanup-2 2008-10-13 02:26:23.000000000 +0900 +++ linux-2.6-hirofumi/fs/namei.c 2008-10-13 02:26:23.000000000 +0900 @@ -1470,20 +1470,18 @@ struct dentry *lock_rename(struct dentry mutex_lock(&p1->d_inode->i_sb->s_vfs_rename_mutex); - for (p = p1; !IS_ROOT(p); p = p->d_parent) { - if (p->d_parent == p2) { - mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT); - mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD); - return p; - } + p = d_ancestor(p2, p1); + if (p) { + mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_CHILD); + return p; } - for (p = p2; !IS_ROOT(p); p = p->d_parent) { - if (p->d_parent == p1) { - mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); - mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD); - return p; - } + p = d_ancestor(p1, p2); + if (p) { + mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); + mutex_lock_nested(&p2->d_inode->i_mutex, I_MUTEX_CHILD); + return p; } mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); _ ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 3/6] vfs: add __d_instantiate() helper 2008-10-15 13:58 ` [PATCH 2/6] vfs: add d_ancestor() OGAWA Hirofumi @ 2008-10-15 13:58 ` OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() OGAWA Hirofumi 2008-10-15 19:41 ` [PATCH 3/6] vfs: add __d_instantiate() helper Christoph Hellwig 2008-10-15 19:53 ` [PATCH 2/6] vfs: add d_ancestor() Christoph Hellwig 1 sibling, 2 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 13:58 UTC (permalink / raw) To: viro; +Cc: akpm, linux-kernel, hirofumi This adds __d_instantiate() for users which is already taking dcache_lock, and replace with it. The part of d_add_ci() isn't equivalent. But it should be needed fsnotify_d_instantiate() actually, because the path is to add the inode to negative dentry. fsnotify_d_instantiate() should be called after change from negative to positive. __d_instantiate_unique() and d_materialise_unique() does opencoded optimized version. From history, it seems a intent, so just add comment. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> --- fs/dcache.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff -puN fs/dcache.c~dcache-cleanup-3 fs/dcache.c --- linux-2.6/fs/dcache.c~dcache-cleanup-3 2008-09-30 05:24:37.000000000 +0900 +++ linux-2.6-hirofumi/fs/dcache.c 2008-09-30 05:24:37.000000000 +0900 @@ -981,6 +981,15 @@ struct dentry *d_alloc_name(struct dentr return d_alloc(parent, &q); } +/* the caller must hold dcache_lock */ +static void __d_instantiate(struct dentry *dentry, struct inode *inode) +{ + if (inode) + list_add(&dentry->d_alias, &inode->i_dentry); + dentry->d_inode = inode; + fsnotify_d_instantiate(dentry, inode); +} + /** * d_instantiate - fill in inode information for a dentry * @entry: dentry to complete @@ -1000,10 +1009,7 @@ void d_instantiate(struct dentry *entry, { BUG_ON(!list_empty(&entry->d_alias)); spin_lock(&dcache_lock); - if (inode) - list_add(&entry->d_alias, &inode->i_dentry); - entry->d_inode = inode; - fsnotify_d_instantiate(entry, inode); + __d_instantiate(entry, inode); spin_unlock(&dcache_lock); security_d_instantiate(entry, inode); } @@ -1033,6 +1039,7 @@ static struct dentry *__d_instantiate_un unsigned int hash = entry->d_name.hash; if (!inode) { + /* __d_instantiate() by hand */ entry->d_inode = NULL; return NULL; } @@ -1052,9 +1059,7 @@ static struct dentry *__d_instantiate_un return alias; } - list_add(&entry->d_alias, &inode->i_dentry); - entry->d_inode = inode; - fsnotify_d_instantiate(entry, inode); + __d_instantiate(entry, inode); return NULL; } @@ -1211,10 +1216,8 @@ struct dentry *d_splice_alias(struct ino d_move(new, dentry); iput(inode); } else { - /* d_instantiate takes dcache_lock, so we do it by hand */ - list_add(&dentry->d_alias, &inode->i_dentry); - dentry->d_inode = inode; - fsnotify_d_instantiate(dentry, inode); + /* already taking dcache_lock, so d_add() by hand */ + __d_instantiate(dentry, inode); spin_unlock(&dcache_lock); security_d_instantiate(dentry, inode); d_rehash(dentry); @@ -1297,8 +1300,7 @@ struct dentry *d_add_ci(struct dentry *d * d_instantiate() by hand because it takes dcache_lock which * we already hold. */ - list_add(&found->d_alias, &inode->i_dentry); - found->d_inode = inode; + __d_instantiate(found, inode); spin_unlock(&dcache_lock); security_d_instantiate(found, inode); return found; @@ -1827,6 +1829,7 @@ struct dentry *d_materialise_unique(stru if (!inode) { actual = dentry; + /* __d_instantiate() by hand */ dentry->d_inode = NULL; goto found_lock; } _ ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() 2008-10-15 13:58 ` [PATCH 3/6] vfs: add __d_instantiate() helper OGAWA Hirofumi @ 2008-10-15 13:58 ` OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup OGAWA Hirofumi 2008-10-15 19:43 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() Christoph Hellwig 2008-10-15 19:41 ` [PATCH 3/6] vfs: add __d_instantiate() helper Christoph Hellwig 1 sibling, 2 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 13:58 UTC (permalink / raw) To: viro; +Cc: akpm, linux-kernel, hirofumi This calls d_move(), so fsnotify_d_instantiate() is unnecessary like rename path. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> --- fs/dcache.c | 1 - 1 file changed, 1 deletion(-) diff -puN fs/dcache.c~dcache-cleanup-4 fs/dcache.c --- linux-2.6/fs/dcache.c~dcache-cleanup-4 2008-08-26 11:13:29.000000000 +0900 +++ linux-2.6-hirofumi/fs/dcache.c 2008-08-26 11:13:29.000000000 +0900 @@ -1209,7 +1209,6 @@ struct dentry *d_splice_alias(struct ino new = __d_find_alias(inode, 1); if (new) { BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED)); - fsnotify_d_instantiate(new, inode); spin_unlock(&dcache_lock); security_d_instantiate(new, inode); d_rehash(dentry); _ ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup 2008-10-15 13:58 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() OGAWA Hirofumi @ 2008-10-15 13:58 ` OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent OGAWA Hirofumi 2008-10-15 19:44 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup Christoph Hellwig 2008-10-15 19:43 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() Christoph Hellwig 1 sibling, 2 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 13:58 UTC (permalink / raw) To: viro; +Cc: akpm, linux-kernel, hirofumi lookup_hash() with LOOKUP_PARENT is bogus. And this prepares to add new intent on those path. The user of LOOKUP_PARENT intent is nfs only, and it checks whether nd->flags has LOOKUP_CREATE or LOOKUP_OPEN, so the result is same. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> --- fs/namei.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff -puN fs/namei.c~dcache-remove-parent fs/namei.c --- linux-2.6/fs/namei.c~dcache-remove-parent 2008-08-26 11:13:30.000000000 +0900 +++ linux-2.6-hirofumi/fs/namei.c 2008-08-26 11:13:30.000000000 +0900 @@ -2176,16 +2176,19 @@ static long do_rmdir(int dfd, const char return error; switch(nd.last_type) { - case LAST_DOTDOT: - error = -ENOTEMPTY; - goto exit1; - case LAST_DOT: - error = -EINVAL; - goto exit1; - case LAST_ROOT: - error = -EBUSY; - goto exit1; + case LAST_DOTDOT: + error = -ENOTEMPTY; + goto exit1; + case LAST_DOT: + error = -EINVAL; + goto exit1; + case LAST_ROOT: + error = -EBUSY; + goto exit1; } + + nd.flags &= ~LOOKUP_PARENT; + mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT); dentry = lookup_hash(&nd); error = PTR_ERR(dentry); @@ -2263,6 +2266,9 @@ static long do_unlinkat(int dfd, const c error = -EISDIR; if (nd.last_type != LAST_NORM) goto exit1; + + nd.flags &= ~LOOKUP_PARENT; + mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT); dentry = lookup_hash(&nd); error = PTR_ERR(dentry); @@ -2652,6 +2658,9 @@ asmlinkage long sys_renameat(int olddfd, if (newnd.last_type != LAST_NORM) goto exit2; + oldnd.flags &= ~LOOKUP_PARENT; + newnd.flags &= ~LOOKUP_PARENT; + trap = lock_rename(new_dir, old_dir); old_dentry = lookup_hash(&oldnd); _ ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent 2008-10-15 13:58 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup OGAWA Hirofumi @ 2008-10-15 13:58 ` OGAWA Hirofumi 2008-10-15 19:37 ` Christoph Hellwig 2008-10-15 19:44 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup Christoph Hellwig 1 sibling, 1 reply; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 13:58 UTC (permalink / raw) To: viro; +Cc: akpm, linux-kernel, hirofumi This adds LOOKUP_RENAME_NEW intent for lookup of rename destination. LOOKUP_RENAME_NEW is going to be used like LOOKUP_CREATE. But since the destination of rename() can be existing directory entry, so it has a difference. Although that difference doesn't matter in my usage, this tells it to user of this intent. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> --- fs/namei.c | 1 + include/linux/namei.h | 1 + 2 files changed, 2 insertions(+) diff -puN fs/namei.c~dcache-add-rename-intent fs/namei.c --- linux-2.6/fs/namei.c~dcache-add-rename-intent 2008-08-26 11:13:32.000000000 +0900 +++ linux-2.6-hirofumi/fs/namei.c 2008-08-26 11:13:32.000000000 +0900 @@ -2660,6 +2660,7 @@ asmlinkage long sys_renameat(int olddfd, oldnd.flags &= ~LOOKUP_PARENT; newnd.flags &= ~LOOKUP_PARENT; + newnd.flags |= LOOKUP_RENAME_NEW; trap = lock_rename(new_dir, old_dir); diff -puN include/linux/namei.h~dcache-add-rename-intent include/linux/namei.h --- linux-2.6/include/linux/namei.h~dcache-add-rename-intent 2008-08-26 11:13:32.000000000 +0900 +++ linux-2.6-hirofumi/include/linux/namei.h 2008-08-26 11:13:32.000000000 +0900 @@ -53,6 +53,7 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA */ #define LOOKUP_OPEN (0x0100) #define LOOKUP_CREATE (0x0200) +#define LOOKUP_RENAME_NEW (0x0400) extern int user_path_at(int, const char __user *, unsigned, struct path *); _ ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent 2008-10-15 13:58 ` [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent OGAWA Hirofumi @ 2008-10-15 19:37 ` Christoph Hellwig 2008-10-15 20:13 ` OGAWA Hirofumi 0 siblings, 1 reply; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 19:37 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: viro, akpm, linux-kernel, bnaujok On Wed, Oct 15, 2008 at 10:58:11PM +0900, OGAWA Hirofumi wrote: > > This adds LOOKUP_RENAME_NEW intent for lookup of rename destination. > > LOOKUP_RENAME_NEW is going to be used like LOOKUP_CREATE. But since > the destination of rename() can be existing directory entry, so it has a > difference. Although that difference doesn't matter in my usage, this > tells it to user of this intent. Is this for handling CI rename properly? Barry was looking into this, but i told him to hold off for a while - the lookup code is changing quite a bit because Al is trying to sort out the lookup intent mess and we hopefully will stop passing the nameidata to ->lookup soon. Also I think LOOKUP_RENAME_TARGET might be a little more descriptive than LOOKUP_RENAME_NEW. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent 2008-10-15 19:37 ` Christoph Hellwig @ 2008-10-15 20:13 ` OGAWA Hirofumi 0 siblings, 0 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 20:13 UTC (permalink / raw) To: Christoph Hellwig; +Cc: viro, akpm, linux-kernel, bnaujok Christoph Hellwig <hch@infradead.org> writes: > On Wed, Oct 15, 2008 at 10:58:11PM +0900, OGAWA Hirofumi wrote: >> >> This adds LOOKUP_RENAME_NEW intent for lookup of rename destination. >> >> LOOKUP_RENAME_NEW is going to be used like LOOKUP_CREATE. But since >> the destination of rename() can be existing directory entry, so it has a >> difference. Although that difference doesn't matter in my usage, this >> tells it to user of this intent. > > Is this for handling CI rename properly? Barry was looking into this, Exactly, it is for some kind of CI rename workaround. > but i told him to hold off for a while - the lookup code is changing > quite a bit because Al is trying to sort out the lookup intent mess and > we hopefully will stop passing the nameidata to ->lookup soon. Umm.. however the intent for ->lookup() is useful for optimization in some case? > Also I think LOOKUP_RENAME_TARGET might be a little more descriptive > than LOOKUP_RENAME_NEW. It is the name which namei.c is using, anyway I don't care at all. I'll take it. -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> [PATCH] vfs: add LOOKUP_RENAME_TARGET intent This adds LOOKUP_RENAME_TARGET intent for lookup of rename destination. LOOKUP_RENAME_TARGET is going to be used like LOOKUP_CREATE. But since the destination of rename() can be existing directory entry, so it has a difference. Although that difference doesn't matter in my usage, this tells it to user of this intent. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> --- fs/namei.c | 1 + include/linux/namei.h | 1 + 2 files changed, 2 insertions(+) diff -puN fs/namei.c~dcache-add-rename-intent fs/namei.c --- linux-2.6/fs/namei.c~dcache-add-rename-intent 2008-10-15 20:35:24.000000000 +0900 +++ linux-2.6-hirofumi/fs/namei.c 2008-10-16 05:06:53.000000000 +0900 @@ -2660,6 +2660,7 @@ asmlinkage long sys_renameat(int olddfd, oldnd.flags &= ~LOOKUP_PARENT; newnd.flags &= ~LOOKUP_PARENT; + newnd.flags |= LOOKUP_RENAME_TARGET; trap = lock_rename(new_dir, old_dir); diff -puN include/linux/namei.h~dcache-add-rename-intent include/linux/namei.h --- linux-2.6/include/linux/namei.h~dcache-add-rename-intent 2008-10-15 20:35:24.000000000 +0900 +++ linux-2.6-hirofumi/include/linux/namei.h 2008-10-16 05:07:15.000000000 +0900 @@ -53,6 +53,7 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LA */ #define LOOKUP_OPEN (0x0100) #define LOOKUP_CREATE (0x0200) +#define LOOKUP_RENAME_TARGET (0x0400) extern int user_path_at(int, const char __user *, unsigned, struct path *); _ ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup 2008-10-15 13:58 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent OGAWA Hirofumi @ 2008-10-15 19:44 ` Christoph Hellwig 2008-10-15 21:43 ` OGAWA Hirofumi 1 sibling, 1 reply; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 19:44 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: viro, akpm, linux-kernel On Wed, Oct 15, 2008 at 10:58:11PM +0900, OGAWA Hirofumi wrote: > > lookup_hash() with LOOKUP_PARENT is bogus. And this prepares to add > new intent on those path. > > The user of LOOKUP_PARENT intent is nfs only, and it checks whether > nd->flags has LOOKUP_CREATE or LOOKUP_OPEN, so the result is same. Makes sense to me, but in this area you really need to work against Al's vfs.git tree as there's quite some work going on. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup 2008-10-15 19:44 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup Christoph Hellwig @ 2008-10-15 21:43 ` OGAWA Hirofumi 0 siblings, 0 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 21:43 UTC (permalink / raw) To: Christoph Hellwig; +Cc: viro, akpm, linux-kernel Christoph Hellwig <hch@infradead.org> writes: > Makes sense to me, but in this area you really need to work against > Al's vfs.git tree as there's quite some work going on. I'll send updated patchset soon for vfs-2.6. Thanks. -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() 2008-10-15 13:58 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup OGAWA Hirofumi @ 2008-10-15 19:43 ` Christoph Hellwig 2008-10-15 20:16 ` OGAWA Hirofumi 1 sibling, 1 reply; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 19:43 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: viro, akpm, linux-kernel On Wed, Oct 15, 2008 at 10:58:11PM +0900, OGAWA Hirofumi wrote: > > This calls d_move(), so fsnotify_d_instantiate() is unnecessary like > rename path. fsnotify_d_instantiate and fsnotify_d_move call into different inotify functions. Did you verify that this really does the right thing? (Sorry, not in a mood to look into idiotify code..) ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() 2008-10-15 19:43 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() Christoph Hellwig @ 2008-10-15 20:16 ` OGAWA Hirofumi 2008-10-15 20:20 ` Christoph Hellwig 0 siblings, 1 reply; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 20:16 UTC (permalink / raw) To: Christoph Hellwig; +Cc: viro, akpm, linux-kernel Christoph Hellwig <hch@infradead.org> writes: > On Wed, Oct 15, 2008 at 10:58:11PM +0900, OGAWA Hirofumi wrote: >> >> This calls d_move(), so fsnotify_d_instantiate() is unnecessary like >> rename path. > > fsnotify_d_instantiate and fsnotify_d_move call into different inotify > functions. Did you verify that this really does the right thing? > (Sorry, not in a mood to look into idiotify code..) Yes. I checked it. -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() 2008-10-15 20:16 ` OGAWA Hirofumi @ 2008-10-15 20:20 ` Christoph Hellwig 0 siblings, 0 replies; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 20:20 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: Christoph Hellwig, viro, akpm, linux-kernel On Thu, Oct 16, 2008 at 05:16:58AM +0900, OGAWA Hirofumi wrote: > Christoph Hellwig <hch@infradead.org> writes: > > > On Wed, Oct 15, 2008 at 10:58:11PM +0900, OGAWA Hirofumi wrote: > >> > >> This calls d_move(), so fsnotify_d_instantiate() is unnecessary like > >> rename path. > > > > fsnotify_d_instantiate and fsnotify_d_move call into different inotify > > functions. Did you verify that this really does the right thing? > > (Sorry, not in a mood to look into idiotify code..) > > Yes. I checked it. Then the patch looks good to me. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 3/6] vfs: add __d_instantiate() helper 2008-10-15 13:58 ` [PATCH 3/6] vfs: add __d_instantiate() helper OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() OGAWA Hirofumi @ 2008-10-15 19:41 ` Christoph Hellwig 2008-10-15 20:39 ` OGAWA Hirofumi 1 sibling, 1 reply; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 19:41 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: viro, akpm, linux-kernel On Wed, Oct 15, 2008 at 10:58:10PM +0900, OGAWA Hirofumi wrote: > > This adds __d_instantiate() for users which is already taking > dcache_lock, and replace with it. > > The part of d_add_ci() isn't equivalent. But it should be needed > fsnotify_d_instantiate() actually, because the path is to add the > inode to negative dentry. fsnotify_d_instantiate() should be called > after change from negative to positive. > > __d_instantiate_unique() and d_materialise_unique() does opencoded > optimized version. From history, it seems a intent, so just add comment. Looks good, but I think those "optimized' version should also be converted, a single if shouldn't matter with todays branch predictors. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 3/6] vfs: add __d_instantiate() helper 2008-10-15 19:41 ` [PATCH 3/6] vfs: add __d_instantiate() helper Christoph Hellwig @ 2008-10-15 20:39 ` OGAWA Hirofumi 2008-10-15 20:47 ` Trond Myklebust 0 siblings, 1 reply; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 20:39 UTC (permalink / raw) To: Christoph Hellwig; +Cc: viro, akpm, linux-kernel, Trond.Myklebust Christoph Hellwig <hch@infradead.org> writes: > On Wed, Oct 15, 2008 at 10:58:10PM +0900, OGAWA Hirofumi wrote: >> >> This adds __d_instantiate() for users which is already taking >> dcache_lock, and replace with it. >> >> The part of d_add_ci() isn't equivalent. But it should be needed >> fsnotify_d_instantiate() actually, because the path is to add the >> inode to negative dentry. fsnotify_d_instantiate() should be called >> after change from negative to positive. >> >> __d_instantiate_unique() and d_materialise_unique() does opencoded >> optimized version. From history, it seems a intent, so just add comment. > > Looks good, but I think those "optimized' version should also be > converted, a single if shouldn't matter with todays branch predictors. Me too. Trond, do you care the following convert? E.g. in d_materialise_unique(): from dentry->d_inode = NULL; goto found_lock; to __d_instantiate(dentry, NULL); goto found_lock; -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 3/6] vfs: add __d_instantiate() helper 2008-10-15 20:39 ` OGAWA Hirofumi @ 2008-10-15 20:47 ` Trond Myklebust 2008-10-15 21:31 ` OGAWA Hirofumi 0 siblings, 1 reply; 21+ messages in thread From: Trond Myklebust @ 2008-10-15 20:47 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: Christoph Hellwig, viro, akpm, linux-kernel On Thu, 2008-10-16 at 05:39 +0900, OGAWA Hirofumi wrote: > Christoph Hellwig <hch@infradead.org> writes: > > > On Wed, Oct 15, 2008 at 10:58:10PM +0900, OGAWA Hirofumi wrote: > >> > >> This adds __d_instantiate() for users which is already taking > >> dcache_lock, and replace with it. > >> > >> The part of d_add_ci() isn't equivalent. But it should be needed > >> fsnotify_d_instantiate() actually, because the path is to add the > >> inode to negative dentry. fsnotify_d_instantiate() should be called > >> after change from negative to positive. > >> > >> __d_instantiate_unique() and d_materialise_unique() does opencoded > >> optimized version. From history, it seems a intent, so just add comment. > > > > Looks good, but I think those "optimized' version should also be > > converted, a single if shouldn't matter with todays branch predictors. > > Me too. > > Trond, do you care the following convert? E.g. > > in d_materialise_unique(): > > from > dentry->d_inode = NULL; > goto found_lock; > to > __d_instantiate(dentry, NULL); > goto found_lock; That would be fine by me. Cheers Trond -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@netapp.com www.netapp.com ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 3/6] vfs: add __d_instantiate() helper 2008-10-15 20:47 ` Trond Myklebust @ 2008-10-15 21:31 ` OGAWA Hirofumi 0 siblings, 0 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 21:31 UTC (permalink / raw) To: Trond Myklebust; +Cc: Christoph Hellwig, viro, akpm, linux-kernel Trond Myklebust <Trond.Myklebust@netapp.com> writes: >> Trond, do you care the following convert? E.g. >> >> in d_materialise_unique(): >> >> from >> dentry->d_inode = NULL; >> goto found_lock; >> to >> __d_instantiate(dentry, NULL); >> goto found_lock; > > That would be fine by me. Thanks. I'll replace those. -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/6] vfs: add d_ancestor() 2008-10-15 13:58 ` [PATCH 2/6] vfs: add d_ancestor() OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 3/6] vfs: add __d_instantiate() helper OGAWA Hirofumi @ 2008-10-15 19:53 ` Christoph Hellwig 2008-10-15 21:42 ` OGAWA Hirofumi 1 sibling, 1 reply; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 19:53 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: viro, akpm, linux-kernel On Wed, Oct 15, 2008 at 10:58:10PM +0900, OGAWA Hirofumi wrote: > > > This adds d_ancestor() instead of d_isparent(), then use it. > > If new_dentry == old_dentry, is_subdir() returns 1, looks strange. But > I'm not checking callers for now, so this keeps current behavior. This change looks good, but a slightly more detailed changelog would be good. > > /* > - * Helper that returns 1 if p1 is a parent of p2, else 0 > + * Helper that returns the ancestor dentry of p2 which is a child of > + * p1, if p1 is an ancestor of p2, else NULL. > */ > -static int d_isparent(struct dentry *p1, struct dentry *p2) > +struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2) Given that d_ancestor is non-static a kerneldoc comment describing it instead of a plain one would be good. > int is_subdir(struct dentry * new_dentry, struct dentry * old_dentry) > { > int result; > - struct dentry * saved = new_dentry; > unsigned long seq; > > + if (new_dentry == old_dentry) > + return 1; Maybe a comment like in your commit description here would be good? > + > /* need rcu_readlock to protect against the d_parent trashing due to > * d_move > */ > rcu_read_lock(); > do { > /* for restarting inner loop in case of seq retry */ > - new_dentry = saved; > - result = 0; > seq = read_seqbegin(&rename_lock); > - for (;;) { > - if (new_dentry != old_dentry) { > - if (IS_ROOT(new_dentry)) > - break; > - new_dentry = new_dentry->d_parent; > - continue; > - } > - result = 1; > - break; > - } > + result = (d_ancestor(old_dentry, new_dentry) != NULL); > } while (read_seqretry(&rename_lock, seq)); That's a big improvement, but with a better loop and fixing all the formatting mess in the old code it could become even better: /* * Need rcu_readlock to protect against the d_parent trashing due to * d_move. */ rcu_read_lock(); do { /* for restarting inner loop in case of seq retry */ seq = read_seqbegin(&rename_lock); if (d_ancestor(old_dentry, new_dentry)) result = 1; else result = 0; } while (read_seqretry(&rename_lock, seq)); rcu_read_unlock(); Nice set of patches! ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/6] vfs: add d_ancestor() 2008-10-15 19:53 ` [PATCH 2/6] vfs: add d_ancestor() Christoph Hellwig @ 2008-10-15 21:42 ` OGAWA Hirofumi 0 siblings, 0 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 21:42 UTC (permalink / raw) To: Christoph Hellwig; +Cc: viro, akpm, linux-kernel Christoph Hellwig <hch@infradead.org> writes: > This change looks good, but a slightly more detailed changelog would be > good. tweaked... >> /* >> - * Helper that returns 1 if p1 is a parent of p2, else 0 >> + * Helper that returns the ancestor dentry of p2 which is a child of >> + * p1, if p1 is an ancestor of p2, else NULL. >> */ >> -static int d_isparent(struct dentry *p1, struct dentry *p2) >> +struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2) > > Given that d_ancestor is non-static a kerneldoc comment describing it > instead of a plain one would be good. Yes. >> int is_subdir(struct dentry * new_dentry, struct dentry * old_dentry) >> { >> int result; >> - struct dentry * saved = new_dentry; >> unsigned long seq; >> >> + if (new_dentry == old_dentry) >> + return 1; > > Maybe a comment like in your commit description here would be good? Sure, thanks. > /* > * Need rcu_readlock to protect against the d_parent trashing due to > * d_move. > */ > rcu_read_lock(); > do { > /* for restarting inner loop in case of seq retry */ > seq = read_seqbegin(&rename_lock); > if (d_ancestor(old_dentry, new_dentry)) > result = 1; > else > result = 0; > } while (read_seqretry(&rename_lock, seq)); > rcu_read_unlock(); I'll borrow your version. Thanks. -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() 2008-10-15 13:58 [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 2/6] vfs: add d_ancestor() OGAWA Hirofumi @ 2008-10-15 19:45 ` Christoph Hellwig 2008-10-15 20:24 ` OGAWA Hirofumi 1 sibling, 1 reply; 21+ messages in thread From: Christoph Hellwig @ 2008-10-15 19:45 UTC (permalink / raw) To: OGAWA Hirofumi; +Cc: viro, akpm, linux-kernel Looks correct, but I'm not entirely sure it's a worthwhile cleanup, noth version are about the same level of readability to me. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() 2008-10-15 19:45 ` [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() Christoph Hellwig @ 2008-10-15 20:24 ` OGAWA Hirofumi 0 siblings, 0 replies; 21+ messages in thread From: OGAWA Hirofumi @ 2008-10-15 20:24 UTC (permalink / raw) To: Christoph Hellwig; +Cc: viro, akpm, linux-kernel Christoph Hellwig <hch@infradead.org> writes: > Looks correct, but I'm not entirely sure it's a worthwhile cleanup, > noth version are about the same level of readability to me. Yes. However, I think mix is not readable (and not grep friendly). -- OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2008-10-15 21:43 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-10-15 13:58 [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 2/6] vfs: add d_ancestor() OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 3/6] vfs: add __d_instantiate() helper OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup OGAWA Hirofumi 2008-10-15 13:58 ` [PATCH 6/6] vfs: add LOOKUP_RENAME_NEW intent OGAWA Hirofumi 2008-10-15 19:37 ` Christoph Hellwig 2008-10-15 20:13 ` OGAWA Hirofumi 2008-10-15 19:44 ` [PATCH 5/6] vfs: remove LOOKUP_PARENT from non LOOKUP_PARENT lookup Christoph Hellwig 2008-10-15 21:43 ` OGAWA Hirofumi 2008-10-15 19:43 ` [PATCH 4/6] vfs: remove unnecessary fsnotify_d_instantiate() Christoph Hellwig 2008-10-15 20:16 ` OGAWA Hirofumi 2008-10-15 20:20 ` Christoph Hellwig 2008-10-15 19:41 ` [PATCH 3/6] vfs: add __d_instantiate() helper Christoph Hellwig 2008-10-15 20:39 ` OGAWA Hirofumi 2008-10-15 20:47 ` Trond Myklebust 2008-10-15 21:31 ` OGAWA Hirofumi 2008-10-15 19:53 ` [PATCH 2/6] vfs: add d_ancestor() Christoph Hellwig 2008-10-15 21:42 ` OGAWA Hirofumi 2008-10-15 19:45 ` [PATCH 1/6] vfs: replace parent == dentry->d_parent by IS_ROOT() Christoph Hellwig 2008-10-15 20:24 ` OGAWA Hirofumi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox