Commit 2e08edc5 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs dcache updates from Al Viro:
 "Part of this is what the trylock loop elimination series has turned
  into, part making d_move() preserve the parent (and thus the path) of
  victim, plus some general cleanups"

* 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (22 commits)
  d_genocide: move export to definition
  fold dentry_lock_for_move() into its sole caller and clean it up
  make non-exchanging __d_move() copy ->d_parent rather than swap them
  oprofilefs: don't oops on allocation failure
  lustre: get rid of pointless casts to struct dentry *
  debugfs_lookup(): switch to lookup_one_len_unlocked()
  fold lookup_real() into __lookup_hash()
  take out orphan externs (empty_string/slash_string)
  split d_path() and friends into a separate file
  dcache.c: trim includes
  fs/dcache: Avoid a try_lock loop in shrink_dentry_list()
  get rid of trylock loop around dentry_kill()
  handle move to LRU in retain_dentry()
  dput(): consolidate the "do we need to retain it?" into an inlined helper
  split the slow part of lock_parent() off
  now lock_parent() can't run into killed dentry
  get rid of trylock loop in locking dentries on shrink list
  d_delete(): get rid of trylock loop
  fs/dcache: Move dentry_kill() below lock_parent()
  fs/dcache: Remove stale comment from dentry_kill()
  ...
parents 17dec0a9 04bbc979
...@@ -138,6 +138,9 @@ static int __oprofilefs_create_file(struct dentry *root, char const *name, ...@@ -138,6 +138,9 @@ static int __oprofilefs_create_file(struct dentry *root, char const *name,
struct dentry *dentry; struct dentry *dentry;
struct inode *inode; struct inode *inode;
if (!root)
return -ENOMEM;
inode_lock(d_inode(root)); inode_lock(d_inode(root));
dentry = d_alloc_name(root, name); dentry = d_alloc_name(root, name);
if (!dentry) { if (!dentry) {
......
...@@ -90,7 +90,7 @@ static int ll_dcompare(const struct dentry *dentry, ...@@ -90,7 +90,7 @@ static int ll_dcompare(const struct dentry *dentry,
d_count(dentry)); d_count(dentry));
/* mountpoint is always valid */ /* mountpoint is always valid */
if (d_mountpoint((struct dentry *)dentry)) if (d_mountpoint(dentry))
return 0; return 0;
if (d_lustre_invalid(dentry)) if (d_lustre_invalid(dentry))
...@@ -111,7 +111,7 @@ static int ll_ddelete(const struct dentry *de) ...@@ -111,7 +111,7 @@ static int ll_ddelete(const struct dentry *de)
LASSERT(de); LASSERT(de);
CDEBUG(D_DENTRY, "%s dentry %pd (%p, parent %p, inode %p) %s%s\n", CDEBUG(D_DENTRY, "%s dentry %pd (%p, parent %p, inode %p) %s%s\n",
d_lustre_invalid((struct dentry *)de) ? "deleting" : "keeping", d_lustre_invalid(de) ? "deleting" : "keeping",
de, de, de->d_parent, d_inode(de), de, de, de->d_parent, d_inode(de),
d_unhashed(de) ? "" : "hashed,", d_unhashed(de) ? "" : "hashed,",
list_empty(&de->d_subdirs) ? "" : "subdirs"); list_empty(&de->d_subdirs) ? "" : "subdirs");
...@@ -119,7 +119,7 @@ static int ll_ddelete(const struct dentry *de) ...@@ -119,7 +119,7 @@ static int ll_ddelete(const struct dentry *de)
/* kernel >= 2.6.38 last refcount is decreased after this function. */ /* kernel >= 2.6.38 last refcount is decreased after this function. */
LASSERT(d_count(de) == 1); LASSERT(d_count(de) == 1);
if (d_lustre_invalid((struct dentry *)de)) if (d_lustre_invalid(de))
return 1; return 1;
return 0; return 0;
} }
......
...@@ -11,7 +11,7 @@ obj-y := open.o read_write.o file_table.o super.o \ ...@@ -11,7 +11,7 @@ obj-y := open.o read_write.o file_table.o super.o \
ioctl.o readdir.o select.o dcache.o inode.o \ ioctl.o readdir.o select.o dcache.o inode.o \
attr.o bad_inode.o file.o filesystems.o namespace.o \ attr.o bad_inode.o file.o filesystems.o namespace.o \
seq_file.o xattr.o libfs.o fs-writeback.o \ seq_file.o xattr.o libfs.o fs-writeback.o \
pnode.o splice.o sync.o utimes.o \ pnode.o splice.o sync.o utimes.o d_path.o \
stack.o fs_struct.o statfs.o fs_pin.o nsfs.o stack.o fs_struct.o statfs.o fs_pin.o nsfs.o
ifeq ($(CONFIG_BLOCK),y) ifeq ($(CONFIG_BLOCK),y)
......
This diff is collapsed.
This diff is collapsed.
...@@ -270,10 +270,7 @@ struct dentry *debugfs_lookup(const char *name, struct dentry *parent) ...@@ -270,10 +270,7 @@ struct dentry *debugfs_lookup(const char *name, struct dentry *parent)
if (!parent) if (!parent)
parent = debugfs_mount->mnt_root; parent = debugfs_mount->mnt_root;
inode_lock(d_inode(parent)); dentry = lookup_one_len_unlocked(name, parent, strlen(name));
dentry = lookup_one_len(name, parent, strlen(name));
inode_unlock(d_inode(parent));
if (IS_ERR(dentry)) if (IS_ERR(dentry))
return NULL; return NULL;
if (!d_really_is_positive(dentry)) { if (!d_really_is_positive(dentry)) {
......
...@@ -1474,43 +1474,36 @@ static struct dentry *lookup_dcache(const struct qstr *name, ...@@ -1474,43 +1474,36 @@ static struct dentry *lookup_dcache(const struct qstr *name,
} }
/* /*
* Call i_op->lookup on the dentry. The dentry must be negative and * Parent directory has inode locked exclusive. This is one
* unhashed. * and only case when ->lookup() gets called on non in-lookup
* * dentries - as the matter of fact, this only gets called
* dir->d_inode->i_mutex must be held * when directory is guaranteed to have no in-lookup children
* at all.
*/ */
static struct dentry *lookup_real(struct inode *dir, struct dentry *dentry,
unsigned int flags)
{
struct dentry *old;
/* Don't create child dentry for a dead directory. */
if (unlikely(IS_DEADDIR(dir))) {
dput(dentry);
return ERR_PTR(-ENOENT);
}
old = dir->i_op->lookup(dir, dentry, flags);
if (unlikely(old)) {
dput(dentry);
dentry = old;
}
return dentry;
}
static struct dentry *__lookup_hash(const struct qstr *name, static struct dentry *__lookup_hash(const struct qstr *name,
struct dentry *base, unsigned int flags) struct dentry *base, unsigned int flags)
{ {
struct dentry *dentry = lookup_dcache(name, base, flags); struct dentry *dentry = lookup_dcache(name, base, flags);
struct dentry *old;
struct inode *dir = base->d_inode;
if (dentry) if (dentry)
return dentry; return dentry;
/* Don't create child dentry for a dead directory. */
if (unlikely(IS_DEADDIR(dir)))
return ERR_PTR(-ENOENT);
dentry = d_alloc(base, name); dentry = d_alloc(base, name);
if (unlikely(!dentry)) if (unlikely(!dentry))
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
return lookup_real(base->d_inode, dentry, flags); old = dir->i_op->lookup(dir, dentry, flags);
if (unlikely(old)) {
dput(dentry);
dentry = old;
}
return dentry;
} }
static int lookup_fast(struct nameidata *nd, static int lookup_fast(struct nameidata *nd,
......
...@@ -56,9 +56,7 @@ struct qstr { ...@@ -56,9 +56,7 @@ struct qstr {
#define QSTR_INIT(n,l) { { { .len = l } }, .name = n } #define QSTR_INIT(n,l) { { { .len = l } }, .name = n }
extern const char empty_string[];
extern const struct qstr empty_name; extern const struct qstr empty_name;
extern const char slash_string[];
extern const struct qstr slash_name; extern const struct qstr slash_name;
struct dentry_stat_t { struct dentry_stat_t {
...@@ -361,7 +359,7 @@ static inline void dont_mount(struct dentry *dentry) ...@@ -361,7 +359,7 @@ static inline void dont_mount(struct dentry *dentry)
extern void __d_lookup_done(struct dentry *); extern void __d_lookup_done(struct dentry *);
static inline int d_in_lookup(struct dentry *dentry) static inline int d_in_lookup(const struct dentry *dentry)
{ {
return dentry->d_flags & DCACHE_PAR_LOOKUP; return dentry->d_flags & DCACHE_PAR_LOOKUP;
} }
...@@ -489,7 +487,7 @@ static inline bool d_really_is_positive(const struct dentry *dentry) ...@@ -489,7 +487,7 @@ static inline bool d_really_is_positive(const struct dentry *dentry)
return dentry->d_inode != NULL; return dentry->d_inode != NULL;
} }
static inline int simple_positive(struct dentry *dentry) static inline int simple_positive(const struct dentry *dentry)
{ {
return d_really_is_positive(dentry) && !d_unhashed(dentry); return d_really_is_positive(dentry) && !d_unhashed(dentry);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment