Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
946e51f2
Commit
946e51f2
authored
Oct 26, 2014
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
move d_rcu from overlapping d_child to overlapping d_alias
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
a7400222
Changes
24
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
73 additions
and
74 deletions
+73
-74
arch/powerpc/platforms/cell/spufs/inode.c
arch/powerpc/platforms/cell/spufs/inode.c
+1
-1
drivers/staging/lustre/lustre/llite/dcache.c
drivers/staging/lustre/lustre/llite/dcache.c
+1
-1
drivers/staging/lustre/lustre/llite/llite_lib.c
drivers/staging/lustre/lustre/llite/llite_lib.c
+1
-1
drivers/staging/lustre/lustre/llite/namei.c
drivers/staging/lustre/lustre/llite/namei.c
+4
-4
fs/affs/amigaffs.c
fs/affs/amigaffs.c
+1
-1
fs/autofs4/expire.c
fs/autofs4/expire.c
+6
-6
fs/autofs4/root.c
fs/autofs4/root.c
+1
-1
fs/ceph/dir.c
fs/ceph/dir.c
+4
-4
fs/ceph/inode.c
fs/ceph/inode.c
+1
-1
fs/cifs/inode.c
fs/cifs/inode.c
+1
-1
fs/coda/cache.c
fs/coda/cache.c
+1
-1
fs/dcache.c
fs/dcache.c
+26
-27
fs/debugfs/inode.c
fs/debugfs/inode.c
+1
-1
fs/exportfs/expfs.c
fs/exportfs/expfs.c
+1
-1
fs/libfs.c
fs/libfs.c
+6
-6
fs/ncpfs/dir.c
fs/ncpfs/dir.c
+1
-1
fs/ncpfs/ncplib_kernel.h
fs/ncpfs/ncplib_kernel.h
+2
-2
fs/nfs/getroot.c
fs/nfs/getroot.c
+1
-1
fs/notify/fsnotify.c
fs/notify/fsnotify.c
+2
-2
fs/ocfs2/dcache.c
fs/ocfs2/dcache.c
+1
-1
include/linux/dcache.h
include/linux/dcache.h
+4
-4
kernel/trace/trace.c
kernel/trace/trace.c
+2
-2
kernel/trace/trace_events.c
kernel/trace/trace_events.c
+1
-1
security/selinux/selinuxfs.c
security/selinux/selinuxfs.c
+3
-3
No files found.
arch/powerpc/platforms/cell/spufs/inode.c
View file @
946e51f2
...
...
@@ -164,7 +164,7 @@ static void spufs_prune_dir(struct dentry *dir)
struct
dentry
*
dentry
,
*
tmp
;
mutex_lock
(
&
dir
->
d_inode
->
i_mutex
);
list_for_each_entry_safe
(
dentry
,
tmp
,
&
dir
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry_safe
(
dentry
,
tmp
,
&
dir
->
d_subdirs
,
d_child
)
{
spin_lock
(
&
dentry
->
d_lock
);
if
(
!
(
d_unhashed
(
dentry
))
&&
dentry
->
d_inode
)
{
dget_dlock
(
dentry
);
...
...
drivers/staging/lustre/lustre/llite/dcache.c
View file @
946e51f2
...
...
@@ -258,7 +258,7 @@ void ll_invalidate_aliases(struct inode *inode)
inode
->
i_ino
,
inode
->
i_generation
,
inode
);
ll_lock_dcache
(
inode
);
ll_d_hlist_for_each_entry
(
dentry
,
p
,
&
inode
->
i_dentry
,
d_alias
)
{
ll_d_hlist_for_each_entry
(
dentry
,
p
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
CDEBUG
(
D_DENTRY
,
"dentry in drop %.*s (%p) parent %p "
"inode %p flags %d
\n
"
,
dentry
->
d_name
.
len
,
dentry
->
d_name
.
name
,
dentry
,
dentry
->
d_parent
,
...
...
drivers/staging/lustre/lustre/llite/llite_lib.c
View file @
946e51f2
...
...
@@ -711,7 +711,7 @@ void lustre_dump_dentry(struct dentry *dentry, int recur)
return
;
list_for_each
(
tmp
,
&
dentry
->
d_subdirs
)
{
struct
dentry
*
d
=
list_entry
(
tmp
,
struct
dentry
,
d_
u
.
d_
child
);
struct
dentry
*
d
=
list_entry
(
tmp
,
struct
dentry
,
d_child
);
lustre_dump_dentry
(
d
,
recur
-
1
);
}
}
...
...
drivers/staging/lustre/lustre/llite/namei.c
View file @
946e51f2
...
...
@@ -167,14 +167,14 @@ static void ll_invalidate_negative_children(struct inode *dir)
struct
ll_d_hlist_node
*
p
;
ll_lock_dcache
(
dir
);
ll_d_hlist_for_each_entry
(
dentry
,
p
,
&
dir
->
i_dentry
,
d_alias
)
{
ll_d_hlist_for_each_entry
(
dentry
,
p
,
&
dir
->
i_dentry
,
d_
u
.
d_
alias
)
{
spin_lock
(
&
dentry
->
d_lock
);
if
(
!
list_empty
(
&
dentry
->
d_subdirs
))
{
struct
dentry
*
child
;
list_for_each_entry_safe
(
child
,
tmp_subdir
,
&
dentry
->
d_subdirs
,
d_
u
.
d_
child
)
{
d_child
)
{
if
(
child
->
d_inode
==
NULL
)
d_lustre_invalidate
(
child
,
1
);
}
...
...
@@ -362,7 +362,7 @@ static struct dentry *ll_find_alias(struct inode *inode, struct dentry *dentry)
discon_alias
=
invalid_alias
=
NULL
;
ll_lock_dcache
(
inode
);
ll_d_hlist_for_each_entry
(
alias
,
p
,
&
inode
->
i_dentry
,
d_alias
)
{
ll_d_hlist_for_each_entry
(
alias
,
p
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
LASSERT
(
alias
!=
dentry
);
spin_lock
(
&
alias
->
d_lock
);
...
...
@@ -953,7 +953,7 @@ static void ll_get_child_fid(struct inode * dir, struct qstr *name,
{
struct
dentry
*
parent
,
*
child
;
parent
=
ll_d_hlist_entry
(
dir
->
i_dentry
,
struct
dentry
,
d_alias
);
parent
=
ll_d_hlist_entry
(
dir
->
i_dentry
,
struct
dentry
,
d_
u
.
d_
alias
);
child
=
d_lookup
(
parent
,
name
);
if
(
child
)
{
if
(
child
->
d_inode
)
...
...
fs/affs/amigaffs.c
View file @
946e51f2
...
...
@@ -125,7 +125,7 @@ affs_fix_dcache(struct inode *inode, u32 entry_ino)
{
struct
dentry
*
dentry
;
spin_lock
(
&
inode
->
i_lock
);
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
if
(
entry_ino
==
(
u32
)(
long
)
dentry
->
d_fsdata
)
{
dentry
->
d_fsdata
=
(
void
*
)
inode
->
i_ino
;
break
;
...
...
fs/autofs4/expire.c
View file @
946e51f2
...
...
@@ -85,7 +85,7 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,
spin_lock
(
&
root
->
d_lock
);
if
(
prev
)
next
=
prev
->
d_
u
.
d_
child
.
next
;
next
=
prev
->
d_child
.
next
;
else
{
prev
=
dget_dlock
(
root
);
next
=
prev
->
d_subdirs
.
next
;
...
...
@@ -99,13 +99,13 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,
return
NULL
;
}
q
=
list_entry
(
next
,
struct
dentry
,
d_
u
.
d_
child
);
q
=
list_entry
(
next
,
struct
dentry
,
d_child
);
spin_lock_nested
(
&
q
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
/* Already gone or negative dentry (under construction) - try next */
if
(
!
d_count
(
q
)
||
!
simple_positive
(
q
))
{
spin_unlock
(
&
q
->
d_lock
);
next
=
q
->
d_
u
.
d_
child
.
next
;
next
=
q
->
d_child
.
next
;
goto
cont
;
}
dget_dlock
(
q
);
...
...
@@ -155,13 +155,13 @@ static struct dentry *get_next_positive_dentry(struct dentry *prev,
goto
relock
;
}
spin_unlock
(
&
p
->
d_lock
);
next
=
p
->
d_
u
.
d_
child
.
next
;
next
=
p
->
d_child
.
next
;
p
=
parent
;
if
(
next
!=
&
parent
->
d_subdirs
)
break
;
}
}
ret
=
list_entry
(
next
,
struct
dentry
,
d_
u
.
d_
child
);
ret
=
list_entry
(
next
,
struct
dentry
,
d_child
);
spin_lock_nested
(
&
ret
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
/* Negative dentry - try next */
...
...
@@ -489,7 +489,7 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
spin_lock
(
&
sbi
->
lookup_lock
);
spin_lock
(
&
expired
->
d_parent
->
d_lock
);
spin_lock_nested
(
&
expired
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
list_move
(
&
expired
->
d_parent
->
d_subdirs
,
&
expired
->
d_
u
.
d_
child
);
list_move
(
&
expired
->
d_parent
->
d_subdirs
,
&
expired
->
d_child
);
spin_unlock
(
&
expired
->
d_lock
);
spin_unlock
(
&
expired
->
d_parent
->
d_lock
);
spin_unlock
(
&
sbi
->
lookup_lock
);
...
...
fs/autofs4/root.c
View file @
946e51f2
...
...
@@ -687,7 +687,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
/* only consider parents below dentrys in the root */
if
(
IS_ROOT
(
parent
->
d_parent
))
return
;
d_child
=
&
dentry
->
d_
u
.
d_
child
;
d_child
=
&
dentry
->
d_child
;
/* Set parent managed if it's becoming empty */
if
(
d_child
->
next
==
&
parent
->
d_subdirs
&&
d_child
->
prev
==
&
parent
->
d_subdirs
)
...
...
fs/ceph/dir.c
View file @
946e51f2
...
...
@@ -111,7 +111,7 @@ static int fpos_cmp(loff_t l, loff_t r)
/*
* When possible, we try to satisfy a readdir by peeking at the
* dcache. We make this work by carefully ordering dentries on
* d_
u.d_
child when we initially get results back from the MDS, and
* d_child when we initially get results back from the MDS, and
* falling back to a "normal" sync readdir if any dentries in the dir
* are dropped.
*
...
...
@@ -147,11 +147,11 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx,
p
=
parent
->
d_subdirs
.
prev
;
dout
(
" initial p %p/%p
\n
"
,
p
->
prev
,
p
->
next
);
}
else
{
p
=
last
->
d_
u
.
d_
child
.
prev
;
p
=
last
->
d_child
.
prev
;
}
more:
dentry
=
list_entry
(
p
,
struct
dentry
,
d_
u
.
d_
child
);
dentry
=
list_entry
(
p
,
struct
dentry
,
d_child
);
di
=
ceph_dentry
(
dentry
);
while
(
1
)
{
dout
(
" p %p/%p %s d_subdirs %p/%p
\n
"
,
p
->
prev
,
p
->
next
,
...
...
@@ -174,7 +174,7 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx,
!
dentry
->
d_inode
?
" null"
:
""
);
spin_unlock
(
&
dentry
->
d_lock
);
p
=
p
->
prev
;
dentry
=
list_entry
(
p
,
struct
dentry
,
d_
u
.
d_
child
);
dentry
=
list_entry
(
p
,
struct
dentry
,
d_child
);
di
=
ceph_dentry
(
dentry
);
}
...
...
fs/ceph/inode.c
View file @
946e51f2
...
...
@@ -1399,7 +1399,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
/* reorder parent's d_subdirs */
spin_lock
(
&
parent
->
d_lock
);
spin_lock_nested
(
&
dn
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
list_move
(
&
dn
->
d_
u
.
d_
child
,
&
parent
->
d_subdirs
);
list_move
(
&
dn
->
d_child
,
&
parent
->
d_subdirs
);
spin_unlock
(
&
dn
->
d_lock
);
spin_unlock
(
&
parent
->
d_lock
);
}
...
...
fs/cifs/inode.c
View file @
946e51f2
...
...
@@ -895,7 +895,7 @@ inode_has_hashed_dentries(struct inode *inode)
struct
dentry
*
dentry
;
spin_lock
(
&
inode
->
i_lock
);
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
if
(
!
d_unhashed
(
dentry
)
||
IS_ROOT
(
dentry
))
{
spin_unlock
(
&
inode
->
i_lock
);
return
true
;
...
...
fs/coda/cache.c
View file @
946e51f2
...
...
@@ -92,7 +92,7 @@ static void coda_flag_children(struct dentry *parent, int flag)
struct
dentry
*
de
;
spin_lock
(
&
parent
->
d_lock
);
list_for_each_entry
(
de
,
&
parent
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
de
,
&
parent
->
d_subdirs
,
d_child
)
{
/* don't know what to do with negative dentries */
if
(
de
->
d_inode
)
coda_flag_inode
(
de
->
d_inode
,
flag
);
...
...
fs/dcache.c
View file @
946e51f2
...
...
@@ -44,7 +44,7 @@
/*
* Usage:
* dcache->d_inode->i_lock protects:
* - i_dentry, d_alias, d_inode of aliases
* - i_dentry, d_
u.d_
alias, d_inode of aliases
* dcache_hash_bucket lock protects:
* - the dcache hash table
* s_anon bl list spinlock protects:
...
...
@@ -59,7 +59,7 @@
* - d_unhashed()
* - d_parent and d_subdirs
* - childrens' d_child and d_parent
* - d_alias, d_inode
* - d_
u.d_
alias, d_inode
*
* Ordering:
* dentry->d_inode->i_lock
...
...
@@ -252,14 +252,12 @@ static void __d_free(struct rcu_head *head)
{
struct
dentry
*
dentry
=
container_of
(
head
,
struct
dentry
,
d_u
.
d_rcu
);
WARN_ON
(
!
hlist_unhashed
(
&
dentry
->
d_alias
));
kmem_cache_free
(
dentry_cache
,
dentry
);
}
static
void
__d_free_external
(
struct
rcu_head
*
head
)
{
struct
dentry
*
dentry
=
container_of
(
head
,
struct
dentry
,
d_u
.
d_rcu
);
WARN_ON
(
!
hlist_unhashed
(
&
dentry
->
d_alias
));
kfree
(
external_name
(
dentry
));
kmem_cache_free
(
dentry_cache
,
dentry
);
}
...
...
@@ -271,6 +269,7 @@ static inline int dname_external(const struct dentry *dentry)
static
void
dentry_free
(
struct
dentry
*
dentry
)
{
WARN_ON
(
!
hlist_unhashed
(
&
dentry
->
d_u
.
d_alias
));
if
(
unlikely
(
dname_external
(
dentry
)))
{
struct
external_name
*
p
=
external_name
(
dentry
);
if
(
likely
(
atomic_dec_and_test
(
&
p
->
u
.
count
)))
{
...
...
@@ -311,7 +310,7 @@ static void dentry_iput(struct dentry * dentry)
struct
inode
*
inode
=
dentry
->
d_inode
;
if
(
inode
)
{
dentry
->
d_inode
=
NULL
;
hlist_del_init
(
&
dentry
->
d_alias
);
hlist_del_init
(
&
dentry
->
d_
u
.
d_
alias
);
spin_unlock
(
&
dentry
->
d_lock
);
spin_unlock
(
&
inode
->
i_lock
);
if
(
!
inode
->
i_nlink
)
...
...
@@ -336,7 +335,7 @@ static void dentry_unlink_inode(struct dentry * dentry)
struct
inode
*
inode
=
dentry
->
d_inode
;
__d_clear_type
(
dentry
);
dentry
->
d_inode
=
NULL
;
hlist_del_init
(
&
dentry
->
d_alias
);
hlist_del_init
(
&
dentry
->
d_
u
.
d_
alias
);
dentry_rcuwalk_barrier
(
dentry
);
spin_unlock
(
&
dentry
->
d_lock
);
spin_unlock
(
&
inode
->
i_lock
);
...
...
@@ -496,7 +495,7 @@ static void __dentry_kill(struct dentry *dentry)
}
/* if it was on the hash then remove it */
__d_drop
(
dentry
);
list_del
(
&
dentry
->
d_
u
.
d_
child
);
list_del
(
&
dentry
->
d_child
);
/*
* Inform d_walk() that we are no longer attached to the
* dentry tree
...
...
@@ -722,7 +721,7 @@ static struct dentry *__d_find_alias(struct inode *inode)
again:
discon_alias
=
NULL
;
hlist_for_each_entry
(
alias
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
alias
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
spin_lock
(
&
alias
->
d_lock
);
if
(
S_ISDIR
(
inode
->
i_mode
)
||
!
d_unhashed
(
alias
))
{
if
(
IS_ROOT
(
alias
)
&&
...
...
@@ -772,7 +771,7 @@ void d_prune_aliases(struct inode *inode)
struct
dentry
*
dentry
;
restart:
spin_lock
(
&
inode
->
i_lock
);
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
spin_lock
(
&
dentry
->
d_lock
);
if
(
!
dentry
->
d_lockref
.
count
)
{
struct
dentry
*
parent
=
lock_parent
(
dentry
);
...
...
@@ -1050,7 +1049,7 @@ static void d_walk(struct dentry *parent, void *data,
resume:
while
(
next
!=
&
this_parent
->
d_subdirs
)
{
struct
list_head
*
tmp
=
next
;
struct
dentry
*
dentry
=
list_entry
(
tmp
,
struct
dentry
,
d_
u
.
d_
child
);
struct
dentry
*
dentry
=
list_entry
(
tmp
,
struct
dentry
,
d_child
);
next
=
tmp
->
next
;
spin_lock_nested
(
&
dentry
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
...
...
@@ -1102,7 +1101,7 @@ static void d_walk(struct dentry *parent, void *data,
goto
rename_retry
;
}
rcu_read_unlock
();
next
=
child
->
d_
u
.
d_
child
.
next
;
next
=
child
->
d_child
.
next
;
goto
resume
;
}
if
(
need_seqretry
(
&
rename_lock
,
seq
))
{
...
...
@@ -1454,8 +1453,8 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
INIT_HLIST_BL_NODE
(
&
dentry
->
d_hash
);
INIT_LIST_HEAD
(
&
dentry
->
d_lru
);
INIT_LIST_HEAD
(
&
dentry
->
d_subdirs
);
INIT_HLIST_NODE
(
&
dentry
->
d_alias
);
INIT_LIST_HEAD
(
&
dentry
->
d_
u
.
d_
child
);
INIT_HLIST_NODE
(
&
dentry
->
d_
u
.
d_
alias
);
INIT_LIST_HEAD
(
&
dentry
->
d_child
);
d_set_d_op
(
dentry
,
dentry
->
d_sb
->
s_d_op
);
this_cpu_inc
(
nr_dentry
);
...
...
@@ -1485,7 +1484,7 @@ struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
*/
__dget_dlock
(
parent
);
dentry
->
d_parent
=
parent
;
list_add
(
&
dentry
->
d_
u
.
d_
child
,
&
parent
->
d_subdirs
);
list_add
(
&
dentry
->
d_child
,
&
parent
->
d_subdirs
);
spin_unlock
(
&
parent
->
d_lock
);
return
dentry
;
...
...
@@ -1578,7 +1577,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
spin_lock
(
&
dentry
->
d_lock
);
__d_set_type
(
dentry
,
add_flags
);
if
(
inode
)
hlist_add_head
(
&
dentry
->
d_alias
,
&
inode
->
i_dentry
);
hlist_add_head
(
&
dentry
->
d_
u
.
d_
alias
,
&
inode
->
i_dentry
);
dentry
->
d_inode
=
inode
;
dentry_rcuwalk_barrier
(
dentry
);
spin_unlock
(
&
dentry
->
d_lock
);
...
...
@@ -1602,7 +1601,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
void
d_instantiate
(
struct
dentry
*
entry
,
struct
inode
*
inode
)
{
BUG_ON
(
!
hlist_unhashed
(
&
entry
->
d_alias
));
BUG_ON
(
!
hlist_unhashed
(
&
entry
->
d_
u
.
d_
alias
));
if
(
inode
)
spin_lock
(
&
inode
->
i_lock
);
__d_instantiate
(
entry
,
inode
);
...
...
@@ -1641,7 +1640,7 @@ static struct dentry *__d_instantiate_unique(struct dentry *entry,
return
NULL
;
}
hlist_for_each_entry
(
alias
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
alias
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
/*
* Don't need alias->d_lock here, because aliases with
* d_parent == entry->d_parent are not subject to name or
...
...
@@ -1667,7 +1666,7 @@ struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
{
struct
dentry
*
result
;
BUG_ON
(
!
hlist_unhashed
(
&
entry
->
d_alias
));
BUG_ON
(
!
hlist_unhashed
(
&
entry
->
d_
u
.
d_
alias
));
if
(
inode
)
spin_lock
(
&
inode
->
i_lock
);
...
...
@@ -1698,7 +1697,7 @@ EXPORT_SYMBOL(d_instantiate_unique);
*/
int
d_instantiate_no_diralias
(
struct
dentry
*
entry
,
struct
inode
*
inode
)
{
BUG_ON
(
!
hlist_unhashed
(
&
entry
->
d_alias
));
BUG_ON
(
!
hlist_unhashed
(
&
entry
->
d_
u
.
d_
alias
));
spin_lock
(
&
inode
->
i_lock
);
if
(
S_ISDIR
(
inode
->
i_mode
)
&&
!
hlist_empty
(
&
inode
->
i_dentry
))
{
...
...
@@ -1737,7 +1736,7 @@ static struct dentry * __d_find_any_alias(struct inode *inode)
if
(
hlist_empty
(
&
inode
->
i_dentry
))
return
NULL
;
alias
=
hlist_entry
(
inode
->
i_dentry
.
first
,
struct
dentry
,
d_alias
);
alias
=
hlist_entry
(
inode
->
i_dentry
.
first
,
struct
dentry
,
d_
u
.
d_
alias
);
__dget
(
alias
);
return
alias
;
}
...
...
@@ -1799,7 +1798,7 @@ static struct dentry *__d_obtain_alias(struct inode *inode, int disconnected)
spin_lock
(
&
tmp
->
d_lock
);
tmp
->
d_inode
=
inode
;
tmp
->
d_flags
|=
add_flags
;
hlist_add_head
(
&
tmp
->
d_alias
,
&
inode
->
i_dentry
);
hlist_add_head
(
&
tmp
->
d_
u
.
d_
alias
,
&
inode
->
i_dentry
);
hlist_bl_lock
(
&
tmp
->
d_sb
->
s_anon
);
hlist_bl_add_head
(
&
tmp
->
d_hash
,
&
tmp
->
d_sb
->
s_anon
);
hlist_bl_unlock
(
&
tmp
->
d_sb
->
s_anon
);
...
...
@@ -2234,7 +2233,7 @@ int d_validate(struct dentry *dentry, struct dentry *dparent)
struct
dentry
*
child
;
spin_lock
(
&
dparent
->
d_lock
);
list_for_each_entry
(
child
,
&
dparent
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
child
,
&
dparent
->
d_subdirs
,
d_child
)
{
if
(
dentry
==
child
)
{
spin_lock_nested
(
&
dentry
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
__dget_dlock
(
dentry
);
...
...
@@ -2525,13 +2524,13 @@ static void __d_move(struct dentry *dentry, struct dentry *target,
/* splicing a tree */
dentry
->
d_parent
=
target
->
d_parent
;
target
->
d_parent
=
target
;
list_del_init
(
&
target
->
d_
u
.
d_
child
);
list_move
(
&
dentry
->
d_
u
.
d_
child
,
&
dentry
->
d_parent
->
d_subdirs
);
list_del_init
(
&
target
->
d_child
);
list_move
(
&
dentry
->
d_child
,
&
dentry
->
d_parent
->
d_subdirs
);
}
else
{
/* swapping two dentries */
swap
(
dentry
->
d_parent
,
target
->
d_parent
);
list_move
(
&
target
->
d_
u
.
d_
child
,
&
target
->
d_parent
->
d_subdirs
);
list_move
(
&
dentry
->
d_
u
.
d_
child
,
&
dentry
->
d_parent
->
d_subdirs
);
list_move
(
&
target
->
d_child
,
&
target
->
d_parent
->
d_subdirs
);
list_move
(
&
dentry
->
d_child
,
&
dentry
->
d_parent
->
d_subdirs
);
if
(
exchange
)
fsnotify_d_move
(
target
);
fsnotify_d_move
(
dentry
);
...
...
@@ -3320,7 +3319,7 @@ void d_tmpfile(struct dentry *dentry, struct inode *inode)
{
inode_dec_link_count
(
inode
);
BUG_ON
(
dentry
->
d_name
.
name
!=
dentry
->
d_iname
||
!
hlist_unhashed
(
&
dentry
->
d_alias
)
||
!
hlist_unhashed
(
&
dentry
->
d_
u
.
d_
alias
)
||
!
d_unlinked
(
dentry
));
spin_lock
(
&
dentry
->
d_parent
->
d_lock
);
spin_lock_nested
(
&
dentry
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
...
...
fs/debugfs/inode.c
View file @
946e51f2
...
...
@@ -553,7 +553,7 @@ void debugfs_remove_recursive(struct dentry *dentry)
* use the d_u.d_child as the rcu head and corrupt this list.
*/
spin_lock
(
&
parent
->
d_lock
);
list_for_each_entry
(
child
,
&
parent
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
child
,
&
parent
->
d_subdirs
,
d_child
)
{
if
(
!
debugfs_positive
(
child
))
continue
;
...
...
fs/exportfs/expfs.c
View file @
946e51f2
...
...
@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *result,
inode
=
result
->
d_inode
;
spin_lock
(
&
inode
->
i_lock
);
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
dget
(
dentry
);
spin_unlock
(
&
inode
->
i_lock
);
if
(
toput
)
...
...
fs/libfs.c
View file @
946e51f2
...
...
@@ -114,18 +114,18 @@ loff_t dcache_dir_lseek(struct file *file, loff_t offset, int whence)
spin_lock
(
&
dentry
->
d_lock
);
/* d_lock not required for cursor */
list_del
(
&
cursor
->
d_
u
.
d_
child
);
list_del
(
&
cursor
->
d_child
);
p
=
dentry
->
d_subdirs
.
next
;
while
(
n
&&
p
!=
&
dentry
->
d_subdirs
)
{
struct
dentry
*
next
;
next
=
list_entry
(
p
,
struct
dentry
,
d_
u
.
d_
child
);
next
=
list_entry
(
p
,
struct
dentry
,
d_child
);
spin_lock_nested
(
&
next
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
if
(
simple_positive
(
next
))
n
--
;
spin_unlock
(
&
next
->
d_lock
);
p
=
p
->
next
;
}
list_add_tail
(
&
cursor
->
d_
u
.
d_
child
,
p
);
list_add_tail
(
&
cursor
->
d_child
,
p
);
spin_unlock
(
&
dentry
->
d_lock
);
}
}
...
...
@@ -150,7 +150,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx)
{
struct
dentry
*
dentry
=
file
->
f_path
.
dentry
;
struct
dentry
*
cursor
=
file
->
private_data
;
struct
list_head
*
p
,
*
q
=
&
cursor
->
d_
u
.
d_
child
;
struct
list_head
*
p
,
*
q
=
&
cursor
->
d_child
;
if
(
!
dir_emit_dots
(
file
,
ctx
))
return
0
;
...
...
@@ -159,7 +159,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx)
list_move
(
q
,
&
dentry
->
d_subdirs
);
for
(
p
=
q
->
next
;
p
!=
&
dentry
->
d_subdirs
;
p
=
p
->
next
)
{
struct
dentry
*
next
=
list_entry
(
p
,
struct
dentry
,
d_
u
.
d_
child
);
struct
dentry
*
next
=
list_entry
(
p
,
struct
dentry
,
d_child
);
spin_lock_nested
(
&
next
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
if
(
!
simple_positive
(
next
))
{
spin_unlock
(
&
next
->
d_lock
);
...
...
@@ -287,7 +287,7 @@ int simple_empty(struct dentry *dentry)
int
ret
=
0
;
spin_lock
(
&
dentry
->
d_lock
);
list_for_each_entry
(
child
,
&
dentry
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
child
,
&
dentry
->
d_subdirs
,
d_child
)
{
spin_lock_nested
(
&
child
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
if
(
simple_positive
(
child
))
{
spin_unlock
(
&
child
->
d_lock
);
...
...
fs/ncpfs/dir.c
View file @
946e51f2
...
...
@@ -403,7 +403,7 @@ ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos)
/* If a pointer is invalid, we search the dentry. */
spin_lock
(
&
parent
->
d_lock
);
list_for_each_entry
(
dent
,
&
parent
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
dent
,
&
parent
->
d_subdirs
,
d_child
)
{
if
((
unsigned
long
)
dent
->
d_fsdata
==
fpos
)
{
if
(
dent
->
d_inode
)
dget
(
dent
);
...
...
fs/ncpfs/ncplib_kernel.h
View file @
946e51f2
...
...
@@ -191,7 +191,7 @@ ncp_renew_dentries(struct dentry *parent)
struct
dentry
*
dentry
;
spin_lock
(
&
parent
->
d_lock
);
list_for_each_entry
(
dentry
,
&
parent
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
dentry
,
&
parent
->
d_subdirs
,
d_child
)
{
if
(
dentry
->
d_fsdata
==
NULL
)
ncp_age_dentry
(
server
,
dentry
);
else
...
...
@@ -207,7 +207,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)
struct
dentry
*
dentry
;
spin_lock
(
&
parent
->
d_lock
);
list_for_each_entry
(
dentry
,
&
parent
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
dentry
,
&
parent
->
d_subdirs
,
d_child
)
{
dentry
->
d_fsdata
=
NULL
;
ncp_age_dentry
(
server
,
dentry
);
}
...
...
fs/nfs/getroot.c
View file @
946e51f2
...
...
@@ -58,7 +58,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
*/
spin_lock
(
&
sb
->
s_root
->
d_inode
->
i_lock
);
spin_lock
(
&
sb
->
s_root
->
d_lock
);
hlist_del_init
(
&
sb
->
s_root
->
d_alias
);
hlist_del_init
(
&
sb
->
s_root
->
d_
u
.
d_
alias
);
spin_unlock
(
&
sb
->
s_root
->
d_lock
);
spin_unlock
(
&
sb
->
s_root
->
d_inode
->
i_lock
);
}
...
...
fs/notify/fsnotify.c
View file @
946e51f2
...
...
@@ -63,14 +63,14 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode)
spin_lock
(
&
inode
->
i_lock
);
/* run all of the dentries associated with this inode. Since this is a
* directory, there damn well better only be one item on this list */
hlist_for_each_entry
(
alias
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
alias
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
struct
dentry
*
child
;
/* run all of the children of the original inode and fix their
* d_flags to indicate parental interest (their parent is the
* original inode) */
spin_lock
(
&
alias
->
d_lock
);
list_for_each_entry
(
child
,
&
alias
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
child
,
&
alias
->
d_subdirs
,
d_child
)
{
if
(
!
child
->
d_inode
)
continue
;
...
...
fs/ocfs2/dcache.c
View file @
946e51f2
...
...
@@ -172,7 +172,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,
struct
dentry
*
dentry
;
spin_lock
(
&
inode
->
i_lock
);
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_alias
)
{
hlist_for_each_entry
(
dentry
,
&
inode
->
i_dentry
,
d_
u
.
d_
alias
)
{
spin_lock
(
&
dentry
->
d_lock
);
if
(
ocfs2_match_dentry
(
dentry
,
parent_blkno
,
skip_unhashed
))
{
trace_ocfs2_find_local_alias
(
dentry
->
d_name
.
len
,
...
...
include/linux/dcache.h
View file @
946e51f2
...
...
@@ -124,15 +124,15 @@ struct dentry {
void
*
d_fsdata
;
/* fs-specific data */
struct
list_head
d_lru
;
/* LRU list */
struct
list_head
d_child
;
/* child of parent list */
struct
list_head
d_subdirs
;
/* our children */
/*
* d_
child
and d_rcu can share memory
* d_
alias
and d_rcu can share memory
*/
union
{
struct
list_head
d_child
;
/* child of parent
list */
struct
hlist_node
d_alias
;
/* inode alias
list */
struct
rcu_head
d_rcu
;
}
d_u
;
struct
list_head
d_subdirs
;
/* our children */
struct
hlist_node
d_alias
;
/* inode alias list */
};
/*
...
...
kernel/trace/trace.c
View file @
946e51f2
...
...
@@ -6420,7 +6420,7 @@ static int instance_mkdir (struct inode *inode, struct dentry *dentry, umode_t m
int
ret
;
/* Paranoid: Make sure the parent is the "instances" directory */
parent
=
hlist_entry
(
inode
->
i_dentry
.
first
,
struct
dentry
,
d_alias
);
parent
=
hlist_entry
(
inode
->
i_dentry
.
first
,
struct
dentry
,
d_
u
.
d_
alias
);
if
(
WARN_ON_ONCE
(
parent
!=
trace_instance_dir
))
return
-
ENOENT
;
...
...
@@ -6447,7 +6447,7 @@ static int instance_rmdir(struct inode *inode, struct dentry *dentry)
int
ret
;
/* Paranoid: Make sure the parent is the "instances" directory */
parent
=
hlist_entry
(
inode
->
i_dentry
.
first
,
struct
dentry
,
d_alias
);
parent
=
hlist_entry
(
inode
->
i_dentry
.
first
,
struct
dentry
,
d_
u
.
d_
alias
);
if
(
WARN_ON_ONCE
(
parent
!=
trace_instance_dir
))
return
-
ENOENT
;
...
...
kernel/trace/trace_events.c
View file @
946e51f2
...
...
@@ -461,7 +461,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file)
if
(
dir
)
{
spin_lock
(
&
dir
->
d_lock
);
/* probably unneeded */
list_for_each_entry
(
child
,
&
dir
->
d_subdirs
,
d_
u
.
d_
child
)
{
list_for_each_entry
(
child
,
&
dir
->
d_subdirs
,
d_child
)
{
if
(
child
->
d_inode
)
/* probably unneeded */
child
->
d_inode
->
i_private
=
NULL
;
}
...
...
security/selinux/selinuxfs.c
View file @
946e51f2
...
...
@@ -1200,7 +1200,7 @@ static void sel_remove_entries(struct dentry *de)
spin_lock
(
&
de
->
d_lock
);
node
=
de
->
d_subdirs
.
next
;
while
(
node
!=
&
de
->
d_subdirs
)
{
struct
dentry
*
d
=
list_entry
(
node
,
struct
dentry
,
d_
u
.
d_
child
);
struct
dentry
*
d
=
list_entry
(
node
,
struct
dentry
,
d_child
);
spin_lock_nested
(
&
d
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
list_del_init
(
node
);
...
...
@@ -1674,12 +1674,12 @@ static void sel_remove_classes(void)
list_for_each
(
class_node
,
&
class_dir
->
d_subdirs
)
{
struct
dentry
*
class_subdir
=
list_entry
(
class_node
,
struct
dentry
,
d_
u
.
d_
child
);
struct
dentry
,
d_child
);
struct
list_head
*
class_subdir_node
;
list_for_each
(
class_subdir_node
,
&
class_subdir
->
d_subdirs
)
{
struct
dentry
*
d
=
list_entry
(
class_subdir_node
,
struct
dentry
,
d_
u
.
d_
child
);
struct
dentry
,
d_child
);
if
(
d
->
d_inode
)
if
(
d
->
d_inode
->
i_mode
&
S_IFDIR
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment