mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 23:32:14 +00:00
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc filesystem updates from Al Viro: "Assorted normal VFS / filesystems stuff..." * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: dentry name snapshots Make statfs properly return read-only state after emergency remount fs/dcache: init in_lookup_hashtable minix: Deinline get_block, save 2691 bytes fs: Reorder inode_owner_or_capable() to avoid needless fs: warn in case userspace lied about modprobe return
This commit is contained in:
commit
b8d4c1f9f4
10 changed files with 61 additions and 46 deletions
32
fs/dcache.c
32
fs/dcache.c
|
@ -277,6 +277,33 @@ static inline int dname_external(const struct dentry *dentry)
|
|||
return dentry->d_name.name != dentry->d_iname;
|
||||
}
|
||||
|
||||
void take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry)
|
||||
{
|
||||
spin_lock(&dentry->d_lock);
|
||||
if (unlikely(dname_external(dentry))) {
|
||||
struct external_name *p = external_name(dentry);
|
||||
atomic_inc(&p->u.count);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
name->name = p->name;
|
||||
} else {
|
||||
memcpy(name->inline_name, dentry->d_iname, DNAME_INLINE_LEN);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
name->name = name->inline_name;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(take_dentry_name_snapshot);
|
||||
|
||||
void release_dentry_name_snapshot(struct name_snapshot *name)
|
||||
{
|
||||
if (unlikely(name->name != name->inline_name)) {
|
||||
struct external_name *p;
|
||||
p = container_of(name->name, struct external_name, name[0]);
|
||||
if (unlikely(atomic_dec_and_test(&p->u.count)))
|
||||
kfree_rcu(p, u.head);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(release_dentry_name_snapshot);
|
||||
|
||||
static inline void __d_set_inode_and_type(struct dentry *dentry,
|
||||
struct inode *inode,
|
||||
unsigned type_flags)
|
||||
|
@ -3598,6 +3625,11 @@ EXPORT_SYMBOL(d_genocide);
|
|||
|
||||
void __init vfs_caches_init_early(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(in_lookup_hashtable); i++)
|
||||
INIT_HLIST_BL_HEAD(&in_lookup_hashtable[i]);
|
||||
|
||||
dcache_init_early();
|
||||
inode_init_early();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue