projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[XFS] Fix missing inode atime update from the utime syscall.
[powerpc.git]
/
fs
/
dcache.c
diff --git
a/fs/dcache.c
b/fs/dcache.c
index
fb10386
..
a173bba
100644
(file)
--- a/
fs/dcache.c
+++ b/
fs/dcache.c
@@
-71,7
+71,7
@@
struct dentry_stat_t dentry_stat = {
static void d_callback(struct rcu_head *head)
{
static void d_callback(struct rcu_head *head)
{
- struct dentry * dentry = container_of(head, struct dentry, d_rcu);
+ struct dentry * dentry = container_of(head, struct dentry, d_
u.d_
rcu);
if (dname_external(dentry))
kfree(dentry->d_name.name);
if (dname_external(dentry))
kfree(dentry->d_name.name);
@@
-86,7
+86,7
@@
static void d_free(struct dentry *dentry)
{
if (dentry->d_op && dentry->d_op->d_release)
dentry->d_op->d_release(dentry);
{
if (dentry->d_op && dentry->d_op->d_release)
dentry->d_op->d_release(dentry);
- call_rcu(&dentry->d_rcu, d_callback);
+ call_rcu(&dentry->d_
u.d_
rcu, d_callback);
}
/*
}
/*
@@
-94,7
+94,7
@@
static void d_free(struct dentry *dentry)
* d_iput() operation if defined.
* Called with dcache_lock and per dentry lock held, drops both.
*/
* d_iput() operation if defined.
* Called with dcache_lock and per dentry lock held, drops both.
*/
-static
inline
void dentry_iput(struct dentry * dentry)
+static void dentry_iput(struct dentry * dentry)
{
struct inode *inode = dentry->d_inode;
if (inode) {
{
struct inode *inode = dentry->d_inode;
if (inode) {
@@
-193,7
+193,7
@@
kill_it: {
list_del(&dentry->d_lru);
dentry_stat.nr_unused--;
}
list_del(&dentry->d_lru);
dentry_stat.nr_unused--;
}
- list_del(&dentry->d_child);
+ list_del(&dentry->d_
u.d_
child);
dentry_stat.nr_dentry--; /* For d_free, below */
/*drops the locks, at that point nobody can reach this dentry */
dentry_iput(dentry);
dentry_stat.nr_dentry--; /* For d_free, below */
/*drops the locks, at that point nobody can reach this dentry */
dentry_iput(dentry);
@@
-367,7
+367,7
@@
static inline void prune_one_dentry(struct dentry * dentry)
struct dentry * parent;
__d_drop(dentry);
struct dentry * parent;
__d_drop(dentry);
- list_del(&dentry->d_child);
+ list_del(&dentry->d_
u.d_
child);
dentry_stat.nr_dentry--; /* For d_free, below */
dentry_iput(dentry);
parent = dentry->d_parent;
dentry_stat.nr_dentry--; /* For d_free, below */
dentry_iput(dentry);
parent = dentry->d_parent;
@@
-518,7
+518,7
@@
repeat:
resume:
while (next != &this_parent->d_subdirs) {
struct list_head *tmp = next;
resume:
while (next != &this_parent->d_subdirs) {
struct list_head *tmp = next;
- struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+ struct dentry *dentry = list_entry(tmp, struct dentry, d_
u.d_
child);
next = tmp->next;
/* Have we found a mount point ? */
if (d_mountpoint(dentry))
next = tmp->next;
/* Have we found a mount point ? */
if (d_mountpoint(dentry))
@@
-532,7
+532,7
@@
resume:
* All done at this level ... ascend and resume the search.
*/
if (this_parent != parent) {
* All done at this level ... ascend and resume the search.
*/
if (this_parent != parent) {
- next = this_parent->d_
child.next;
+ next = this_parent->d_
u.d_child.next;
this_parent = this_parent->d_parent;
goto resume;
}
this_parent = this_parent->d_parent;
goto resume;
}
@@
-569,7
+569,7
@@
repeat:
resume:
while (next != &this_parent->d_subdirs) {
struct list_head *tmp = next;
resume:
while (next != &this_parent->d_subdirs) {
struct list_head *tmp = next;
- struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+ struct dentry *dentry = list_entry(tmp, struct dentry, d_
u.d_
child);
next = tmp->next;
if (!list_empty(&dentry->d_lru)) {
next = tmp->next;
if (!list_empty(&dentry->d_lru)) {
@@
-610,7
+610,7
@@
dentry->d_parent->d_name.name, dentry->d_name.name, found);
* All done at this level ... ascend and resume the search.
*/
if (this_parent != parent) {
* All done at this level ... ascend and resume the search.
*/
if (this_parent != parent) {
- next = this_parent->d_
child.next;
+ next = this_parent->d_
u.d_child.next;
this_parent = this_parent->d_parent;
#ifdef DCACHE_DEBUG
printk(KERN_DEBUG "select_parent: ascending to %s/%s, found=%d\n",
this_parent = this_parent->d_parent;
#ifdef DCACHE_DEBUG
printk(KERN_DEBUG "select_parent: ascending to %s/%s, found=%d\n",
@@
-644,7
+644,7
@@
void shrink_dcache_parent(struct dentry * parent)
*
* Prune the dentries that are anonymous
*
*
* Prune the dentries that are anonymous
*
- * parsing d_hash list does not hlist_for_each_rcu() as it
+ * parsing d_hash list does not hlist_for_each_
entry_
rcu() as it
* done under dcache_lock.
*
*/
* done under dcache_lock.
*
*/
@@
-689,7
+689,7
@@
void shrink_dcache_anon(struct hlist_head *head)
*
* In this case we return -1 to tell the caller that we baled.
*/
*
* In this case we return -1 to tell the caller that we baled.
*/
-static int shrink_dcache_memory(int nr,
unsigned in
t gfp_mask)
+static int shrink_dcache_memory(int nr,
gfp_
t gfp_mask)
{
if (nr) {
if (!(gfp_mask & __GFP_FS))
{
if (nr) {
if (!(gfp_mask & __GFP_FS))
@@
-743,7
+743,9
@@
struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
dentry->d_op = NULL;
dentry->d_fsdata = NULL;
dentry->d_mounted = 0;
dentry->d_op = NULL;
dentry->d_fsdata = NULL;
dentry->d_mounted = 0;
+#ifdef CONFIG_PROFILING
dentry->d_cookie = NULL;
dentry->d_cookie = NULL;
+#endif
INIT_HLIST_NODE(&dentry->d_hash);
INIT_LIST_HEAD(&dentry->d_lru);
INIT_LIST_HEAD(&dentry->d_subdirs);
INIT_HLIST_NODE(&dentry->d_hash);
INIT_LIST_HEAD(&dentry->d_lru);
INIT_LIST_HEAD(&dentry->d_subdirs);
@@
-753,12
+755,12
@@
struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
dentry->d_parent = dget(parent);
dentry->d_sb = parent->d_sb;
} else {
dentry->d_parent = dget(parent);
dentry->d_sb = parent->d_sb;
} else {
- INIT_LIST_HEAD(&dentry->d_child);
+ INIT_LIST_HEAD(&dentry->d_
u.d_
child);
}
spin_lock(&dcache_lock);
if (parent)
}
spin_lock(&dcache_lock);
if (parent)
- list_add(&dentry->d_child, &parent->d_subdirs);
+ list_add(&dentry->d_
u.d_
child, &parent->d_subdirs);
dentry_stat.nr_dentry++;
spin_unlock(&dcache_lock);
dentry_stat.nr_dentry++;
spin_unlock(&dcache_lock);
@@
-808,10
+810,14
@@
void d_instantiate(struct dentry *entry, struct inode * inode)
*
* Fill in inode information in the entry. On success, it returns NULL.
* If an unhashed alias of "entry" already exists, then we return the
*
* Fill in inode information in the entry. On success, it returns NULL.
* If an unhashed alias of "entry" already exists, then we return the
- * aliased dentry instead.
+ * aliased dentry instead
and drop one reference to inode
.
*
* Note that in order to avoid conflicts with rename() etc, the caller
* had better be holding the parent directory semaphore.
*
* Note that in order to avoid conflicts with rename() etc, the caller
* had better be holding the parent directory semaphore.
+ *
+ * This also assumes that the inode count has been incremented
+ * (or otherwise set) by the caller to indicate that it is now
+ * in use by the dcache.
*/
struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
{
*/
struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
{
@@
-838,6
+844,7
@@
struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
dget_locked(alias);
spin_unlock(&dcache_lock);
BUG_ON(!d_unhashed(alias));
dget_locked(alias);
spin_unlock(&dcache_lock);
BUG_ON(!d_unhashed(alias));
+ iput(inode);
return alias;
}
list_add(&entry->d_alias, &inode->i_dentry);
return alias;
}
list_add(&entry->d_alias, &inode->i_dentry);
@@
-1043,15
+1050,13
@@
struct dentry * __d_lookup(struct dentry * parent, struct qstr * name)
struct hlist_head *head = d_hash(parent,hash);
struct dentry *found = NULL;
struct hlist_node *node;
struct hlist_head *head = d_hash(parent,hash);
struct dentry *found = NULL;
struct hlist_node *node;
+ struct dentry *dentry;
rcu_read_lock();
rcu_read_lock();
- hlist_for_each_rcu(node, head) {
- struct dentry *dentry;
+ hlist_for_each_entry_rcu(dentry, node, head, d_hash) {
struct qstr *qstr;
struct qstr *qstr;
- dentry = hlist_entry(node, struct dentry, d_hash);
-
if (dentry->d_name.hash != hash)
continue;
if (dentry->d_parent != parent)
if (dentry->d_name.hash != hash)
continue;
if (dentry->d_parent != parent)
@@
-1123,7
+1128,7
@@
int d_validate(struct dentry *dentry, struct dentry *dparent)
spin_lock(&dcache_lock);
base = d_hash(dparent, dentry->d_name.hash);
hlist_for_each(lhp,base) {
spin_lock(&dcache_lock);
base = d_hash(dparent, dentry->d_name.hash);
hlist_for_each(lhp,base) {
- /* hlist_for_each_rcu() not required for d_hash list
+ /* hlist_for_each_
entry_
rcu() not required for d_hash list
* as it is parsed under dcache_lock
*/
if (dentry == hlist_entry(lhp, struct dentry, d_hash)) {
* as it is parsed under dcache_lock
*/
if (dentry == hlist_entry(lhp, struct dentry, d_hash)) {
@@
-1312,8
+1317,8
@@
already_unhashed:
/* Unhash the target: dput() will then get rid of it */
__d_drop(target);
/* Unhash the target: dput() will then get rid of it */
__d_drop(target);
- list_del(&dentry->d_child);
- list_del(&target->d_child);
+ list_del(&dentry->d_
u.d_
child);
+ list_del(&target->d_
u.d_
child);
/* Switch the names.. */
switch_names(dentry, target);
/* Switch the names.. */
switch_names(dentry, target);
@@
-1324,15
+1329,15
@@
already_unhashed:
if (IS_ROOT(dentry)) {
dentry->d_parent = target->d_parent;
target->d_parent = target;
if (IS_ROOT(dentry)) {
dentry->d_parent = target->d_parent;
target->d_parent = target;
- INIT_LIST_HEAD(&target->d_child);
+ INIT_LIST_HEAD(&target->d_
u.d_
child);
} else {
do_switch(dentry->d_parent, target->d_parent);
/* And add them back to the (new) parent lists */
} else {
do_switch(dentry->d_parent, target->d_parent);
/* And add them back to the (new) parent lists */
- list_add(&target->d_child, &target->d_parent->d_subdirs);
+ list_add(&target->d_
u.d_
child, &target->d_parent->d_subdirs);
}
}
- list_add(&dentry->d_child, &dentry->d_parent->d_subdirs);
+ list_add(&dentry->d_
u.d_
child, &dentry->d_parent->d_subdirs);
spin_unlock(&target->d_lock);
spin_unlock(&dentry->d_lock);
write_sequnlock(&rename_lock);
spin_unlock(&target->d_lock);
spin_unlock(&dentry->d_lock);
write_sequnlock(&rename_lock);
@@
-1570,7
+1575,7
@@
repeat:
resume:
while (next != &this_parent->d_subdirs) {
struct list_head *tmp = next;
resume:
while (next != &this_parent->d_subdirs) {
struct list_head *tmp = next;
- struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
+ struct dentry *dentry = list_entry(tmp, struct dentry, d_
u.d_
child);
next = tmp->next;
if (d_unhashed(dentry)||!dentry->d_inode)
continue;
next = tmp->next;
if (d_unhashed(dentry)||!dentry->d_inode)
continue;
@@
-1581,7
+1586,7
@@
resume:
atomic_dec(&dentry->d_count);
}
if (this_parent != root) {
atomic_dec(&dentry->d_count);
}
if (this_parent != root) {
- next = this_parent->d_
child.next;
+ next = this_parent->d_
u.d_child.next;
atomic_dec(&this_parent->d_count);
this_parent = this_parent->d_parent;
goto resume;
atomic_dec(&this_parent->d_count);
this_parent = this_parent->d_parent;
goto resume;