projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
FROMLIST: drm: Add HDMI 2.0 VIC support for AVI info-frames
[firefly-linux-kernel-4.4.55.git]
/
fs
/
dcache.c
diff --git
a/fs/dcache.c
b/fs/dcache.c
index 877bcbbd03ff549a8536bf289dac294f659645b9..7b8feb6d60c8285234d4dd7cbd82b7604addf484 100644
(file)
--- a/
fs/dcache.c
+++ b/
fs/dcache.c
@@
-578,7
+578,6
@@
static struct dentry *dentry_kill(struct dentry *dentry)
failed:
spin_unlock(&dentry->d_lock);
failed:
spin_unlock(&dentry->d_lock);
- cpu_relax();
return dentry; /* try again with same dentry */
}
return dentry; /* try again with same dentry */
}
@@
-752,6
+751,8
@@
void dput(struct dentry *dentry)
return;
repeat:
return;
repeat:
+ might_sleep();
+
rcu_read_lock();
if (likely(fast_dput(dentry))) {
rcu_read_unlock();
rcu_read_lock();
if (likely(fast_dput(dentry))) {
rcu_read_unlock();
@@
-783,8
+784,10
@@
repeat:
kill_it:
dentry = dentry_kill(dentry);
kill_it:
dentry = dentry_kill(dentry);
- if (dentry)
+ if (dentry) {
+ cond_resched();
goto repeat;
goto repeat;
+ }
}
EXPORT_SYMBOL(dput);
}
EXPORT_SYMBOL(dput);
@@
-1319,8
+1322,11
@@
int d_set_mounted(struct dentry *dentry)
}
spin_lock(&dentry->d_lock);
if (!d_unlinked(dentry)) {
}
spin_lock(&dentry->d_lock);
if (!d_unlinked(dentry)) {
- dentry->d_flags |= DCACHE_MOUNTED;
- ret = 0;
+ ret = -EBUSY;
+ if (!d_mountpoint(dentry)) {
+ dentry->d_flags |= DCACHE_MOUNTED;
+ ret = 0;
+ }
}
spin_unlock(&dentry->d_lock);
out:
}
spin_unlock(&dentry->d_lock);
out:
@@
-1618,7
+1624,7
@@
struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
struct dentry *dentry = __d_alloc(parent->d_sb, name);
if (!dentry)
return NULL;
struct dentry *dentry = __d_alloc(parent->d_sb, name);
if (!dentry)
return NULL;
-
+ dentry->d_flags |= DCACHE_RCUACCESS;
spin_lock(&parent->d_lock);
/*
* don't need child lock because it is not subject
spin_lock(&parent->d_lock);
/*
* don't need child lock because it is not subject
@@
-1666,7
+1672,8
@@
void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
DCACHE_OP_REVALIDATE |
DCACHE_OP_WEAK_REVALIDATE |
DCACHE_OP_DELETE |
DCACHE_OP_REVALIDATE |
DCACHE_OP_WEAK_REVALIDATE |
DCACHE_OP_DELETE |
- DCACHE_OP_SELECT_INODE));
+ DCACHE_OP_SELECT_INODE |
+ DCACHE_OP_REAL));
dentry->d_op = op;
if (!op)
return;
dentry->d_op = op;
if (!op)
return;
@@
-1684,6
+1691,8
@@
void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op)
dentry->d_flags |= DCACHE_OP_PRUNE;
if (op->d_select_inode)
dentry->d_flags |= DCACHE_OP_SELECT_INODE;
dentry->d_flags |= DCACHE_OP_PRUNE;
if (op->d_select_inode)
dentry->d_flags |= DCACHE_OP_SELECT_INODE;
+ if (op->d_real)
+ dentry->d_flags |= DCACHE_OP_REAL;
}
EXPORT_SYMBOL(d_set_d_op);
}
EXPORT_SYMBOL(d_set_d_op);
@@
-2410,7
+2419,6
@@
static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b)
{
BUG_ON(!d_unhashed(entry));
hlist_bl_lock(b);
{
BUG_ON(!d_unhashed(entry));
hlist_bl_lock(b);
- entry->d_flags |= DCACHE_RCUACCESS;
hlist_bl_add_head_rcu(&entry->d_hash, b);
hlist_bl_unlock(b);
}
hlist_bl_add_head_rcu(&entry->d_hash, b);
hlist_bl_unlock(b);
}
@@
-2629,6
+2637,7
@@
static void __d_move(struct dentry *dentry, struct dentry *target,
/* ... and switch them in the tree */
if (IS_ROOT(dentry)) {
/* splicing a tree */
/* ... and switch them in the tree */
if (IS_ROOT(dentry)) {
/* splicing a tree */
+ dentry->d_flags |= DCACHE_RCUACCESS;
dentry->d_parent = target->d_parent;
target->d_parent = target;
list_del_init(&target->d_child);
dentry->d_parent = target->d_parent;
target->d_parent = target;
list_del_init(&target->d_child);
@@
-3017,6
+3026,7
@@
char *d_absolute_path(const struct path *path,
return ERR_PTR(error);
return res;
}
return ERR_PTR(error);
return res;
}
+EXPORT_SYMBOL(d_absolute_path);
/*
* same as __d_path but appends "(deleted)" for unlinked files.
/*
* same as __d_path but appends "(deleted)" for unlinked files.