Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "All kinds of misc stuff, without any unifying topic, from various people. Neil's d_anon patch, several bugfixes, introduction of kvmalloc analogue of kmemdup_user(), extending bitfield.h to deal with fixed-endians, assorted cleanups all over the place..." * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (28 commits) alpha: osf_sys.c: use timespec64 where appropriate alpha: osf_sys.c: fix put_tv32 regression jffs2: Fix use-after-free bug in jffs2_iget()'s error handling path dcache: delete unused d_hash_mask dcache: subtract d_hash_shift from 32 in advance fs/buffer.c: fold init_buffer() into init_page_buffers() fs: fold __inode_permission() into inode_permission() fs: add RWF_APPEND sctp: use vmemdup_user() rather than badly open-coding memdup_user() snd_ctl_elem_init_enum_names(): switch to vmemdup_user() replace_user_tlv(): switch to vmemdup_user() new primitive: vmemdup_user() memdup_user(): switch to GFP_USER eventfd: fold eventfd_ctx_get() into eventfd_ctx_fileget() eventfd: fold eventfd_ctx_read() into eventfd_read() eventfd: convert to use anon_inode_getfd() nfs4file: get rid of pointless include of btrfs.h uvc_v4l2: clean copyin/copyout up vme_user: don't use __copy_..._user() usx2y: don't bother with memdup_user() for 16-byte structure ...
This commit is contained in:
32
fs/dcache.c
32
fs/dcache.c
@@ -32,7 +32,6 @@
|
||||
#include <linux/swap.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/fs_struct.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/bit_spinlock.h>
|
||||
#include <linux/rculist_bl.h>
|
||||
#include <linux/prefetch.h>
|
||||
@@ -49,8 +48,8 @@
|
||||
* - 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:
|
||||
* - the s_anon list (see __d_drop)
|
||||
* s_roots bl list spinlock protects:
|
||||
* - the s_roots list (see __d_drop)
|
||||
* dentry->d_sb->s_dentry_lru_lock protects:
|
||||
* - the dcache lru lists and counters
|
||||
* d_lock protects:
|
||||
@@ -68,7 +67,7 @@
|
||||
* dentry->d_lock
|
||||
* dentry->d_sb->s_dentry_lru_lock
|
||||
* dcache_hash_bucket lock
|
||||
* s_anon lock
|
||||
* s_roots lock
|
||||
*
|
||||
* If there is an ancestor relationship:
|
||||
* dentry->d_parent->...->d_parent->d_lock
|
||||
@@ -104,14 +103,13 @@ EXPORT_SYMBOL(slash_name);
|
||||
* information, yet avoid using a prime hash-size or similar.
|
||||
*/
|
||||
|
||||
static unsigned int d_hash_mask __read_mostly;
|
||||
static unsigned int d_hash_shift __read_mostly;
|
||||
|
||||
static struct hlist_bl_head *dentry_hashtable __read_mostly;
|
||||
|
||||
static inline struct hlist_bl_head *d_hash(unsigned int hash)
|
||||
{
|
||||
return dentry_hashtable + (hash >> (32 - d_hash_shift));
|
||||
return dentry_hashtable + (hash >> d_hash_shift);
|
||||
}
|
||||
|
||||
#define IN_LOOKUP_SHIFT 10
|
||||
@@ -477,10 +475,10 @@ void __d_drop(struct dentry *dentry)
|
||||
/*
|
||||
* Hashed dentries are normally on the dentry hashtable,
|
||||
* with the exception of those newly allocated by
|
||||
* d_obtain_alias, which are always IS_ROOT:
|
||||
* d_obtain_root, which are always IS_ROOT:
|
||||
*/
|
||||
if (unlikely(IS_ROOT(dentry)))
|
||||
b = &dentry->d_sb->s_anon;
|
||||
b = &dentry->d_sb->s_roots;
|
||||
else
|
||||
b = d_hash(dentry->d_name.hash);
|
||||
|
||||
@@ -1500,8 +1498,8 @@ void shrink_dcache_for_umount(struct super_block *sb)
|
||||
sb->s_root = NULL;
|
||||
do_one_tree(dentry);
|
||||
|
||||
while (!hlist_bl_empty(&sb->s_anon)) {
|
||||
dentry = dget(hlist_bl_entry(hlist_bl_first(&sb->s_anon), struct dentry, d_hash));
|
||||
while (!hlist_bl_empty(&sb->s_roots)) {
|
||||
dentry = dget(hlist_bl_entry(hlist_bl_first(&sb->s_roots), struct dentry, d_hash));
|
||||
do_one_tree(dentry);
|
||||
}
|
||||
}
|
||||
@@ -1964,9 +1962,11 @@ static struct dentry *__d_obtain_alias(struct inode *inode, int disconnected)
|
||||
spin_lock(&tmp->d_lock);
|
||||
__d_set_inode_and_type(tmp, inode, add_flags);
|
||||
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);
|
||||
if (!disconnected) {
|
||||
hlist_bl_lock(&tmp->d_sb->s_roots);
|
||||
hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_roots);
|
||||
hlist_bl_unlock(&tmp->d_sb->s_roots);
|
||||
}
|
||||
spin_unlock(&tmp->d_lock);
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
@@ -3585,9 +3585,10 @@ static void __init dcache_init_early(void)
|
||||
13,
|
||||
HASH_EARLY | HASH_ZERO,
|
||||
&d_hash_shift,
|
||||
&d_hash_mask,
|
||||
NULL,
|
||||
0,
|
||||
0);
|
||||
d_hash_shift = 32 - d_hash_shift;
|
||||
}
|
||||
|
||||
static void __init dcache_init(void)
|
||||
@@ -3611,9 +3612,10 @@ static void __init dcache_init(void)
|
||||
13,
|
||||
HASH_ZERO,
|
||||
&d_hash_shift,
|
||||
&d_hash_mask,
|
||||
NULL,
|
||||
0,
|
||||
0);
|
||||
d_hash_shift = 32 - d_hash_shift;
|
||||
}
|
||||
|
||||
/* SLAB cache for __getname() consumers */
|
||||
|
||||
Reference in New Issue
Block a user