📄 ext3-lookup-dotdot-2.6.9.patch
字号:
Index: linux-2.6.9-full/fs/ext3/iopen.c===================================================================--- linux-2.6.9-full.orig/fs/ext3/iopen.c 2006-04-25 08:51:11.000000000 +0400+++ linux-2.6.9-full/fs/ext3/iopen.c 2006-05-06 01:21:11.000000000 +0400@@ -94,9 +94,12 @@ static struct dentry *iopen_lookup(struc assert(!(alternate->d_flags & DCACHE_DISCONNECTED)); } - if (!list_empty(&inode->i_dentry)) {- alternate = list_entry(inode->i_dentry.next,- struct dentry, d_alias);+ list_for_each(lp, &inode->i_dentry) {+ alternate = list_entry(lp, struct dentry, d_alias);+ /* ignore dentries created for ".." to preserve+ * proper dcache hierarchy -- bug 10458 */+ if (alternate->d_flags & DCACHE_NFSFS_RENAMED)+ continue; dget_locked(alternate); spin_lock(&alternate->d_lock); alternate->d_flags |= DCACHE_REFERENCED;Index: linux-2.6.9-full/fs/ext3/namei.c===================================================================--- linux-2.6.9-full.orig/fs/ext3/namei.c 2006-05-06 01:21:10.000000000 +0400+++ linux-2.6.9-full/fs/ext3/namei.c 2006-05-06 01:29:30.000000000 +0400@@ -1003,6 +1003,38 @@ static struct dentry *ext3_lookup(struct return ERR_PTR(-EACCES); } + /* ".." shouldn't go into dcache to preserve dcache hierarchy+ * otherwise we'll get parent being a child of actual child.+ * see bug 10458 for details -bzzz */+ if (inode && (dentry->d_name.name[0] == '.' && (dentry->d_name.len == 1 ||+ (dentry->d_name.len == 2 && dentry->d_name.name[1] == '.')))) {+ struct dentry *tmp, *goal = NULL;+ struct list_head *lp;++ /* first, look for an existing dentry - any one is good */+ spin_lock(&dcache_lock);+ list_for_each(lp, &inode->i_dentry) {+ tmp = list_entry(lp, struct dentry, d_alias);+ goal = tmp;+ dget_locked(goal);+ break;+ }+ if (goal == NULL) {+ /* there is no alias, we need to make current dentry:+ * a) inaccessible for __d_lookup()+ * b) inaccessible for iopen */+ J_ASSERT(list_empty(&dentry->d_alias));+ dentry->d_flags |= DCACHE_NFSFS_RENAMED;+ /* this is d_instantiate() ... */+ list_add(&dentry->d_alias, &inode->i_dentry);+ dentry->d_inode = inode;+ }+ spin_unlock(&dcache_lock);+ if (goal)+ iput(inode);+ return goal;+ }+ return iopen_connect_dentry(dentry, inode, 1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -