Commit 962830df authored by Andi Kleen's avatar Andi Kleen Committed by Al Viro

brlocks/lglocks: API cleanups

lglocks and brlocks are currently generated with some complicated macros
in lglock.h.  But there's no reason to not just use common utility
functions and put all the data into a common data structure.

In preparation, this patch changes the API to look more like normal
function calls with pointers, not magic macros.

The patch is rather large because I move over all users in one go to keep
it bisectable.  This impacts the VFS somewhat in terms of lines changed.
But no actual behaviour change.

[akpm@linux-foundation.org: checkpatch fixes]
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent eea62f83
...@@ -2575,7 +2575,7 @@ static int prepend_path(const struct path *path, ...@@ -2575,7 +2575,7 @@ static int prepend_path(const struct path *path,
bool slash = false; bool slash = false;
int error = 0; int error = 0;
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
while (dentry != root->dentry || vfsmnt != root->mnt) { while (dentry != root->dentry || vfsmnt != root->mnt) {
struct dentry * parent; struct dentry * parent;
...@@ -2606,7 +2606,7 @@ static int prepend_path(const struct path *path, ...@@ -2606,7 +2606,7 @@ static int prepend_path(const struct path *path,
error = prepend(buffer, buflen, "/", 1); error = prepend(buffer, buflen, "/", 1);
out: out:
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
return error; return error;
global_root: global_root:
......
...@@ -420,9 +420,9 @@ static inline void __file_sb_list_add(struct file *file, struct super_block *sb) ...@@ -420,9 +420,9 @@ static inline void __file_sb_list_add(struct file *file, struct super_block *sb)
*/ */
void file_sb_list_add(struct file *file, struct super_block *sb) void file_sb_list_add(struct file *file, struct super_block *sb)
{ {
lg_local_lock(files_lglock); lg_local_lock(&files_lglock);
__file_sb_list_add(file, sb); __file_sb_list_add(file, sb);
lg_local_unlock(files_lglock); lg_local_unlock(&files_lglock);
} }
/** /**
...@@ -435,9 +435,9 @@ void file_sb_list_add(struct file *file, struct super_block *sb) ...@@ -435,9 +435,9 @@ void file_sb_list_add(struct file *file, struct super_block *sb)
void file_sb_list_del(struct file *file) void file_sb_list_del(struct file *file)
{ {
if (!list_empty(&file->f_u.fu_list)) { if (!list_empty(&file->f_u.fu_list)) {
lg_local_lock_cpu(files_lglock, file_list_cpu(file)); lg_local_lock_cpu(&files_lglock, file_list_cpu(file));
list_del_init(&file->f_u.fu_list); list_del_init(&file->f_u.fu_list);
lg_local_unlock_cpu(files_lglock, file_list_cpu(file)); lg_local_unlock_cpu(&files_lglock, file_list_cpu(file));
} }
} }
...@@ -484,7 +484,7 @@ void mark_files_ro(struct super_block *sb) ...@@ -484,7 +484,7 @@ void mark_files_ro(struct super_block *sb)
struct file *f; struct file *f;
retry: retry:
lg_global_lock(files_lglock); lg_global_lock(&files_lglock);
do_file_list_for_each_entry(sb, f) { do_file_list_for_each_entry(sb, f) {
struct vfsmount *mnt; struct vfsmount *mnt;
if (!S_ISREG(f->f_path.dentry->d_inode->i_mode)) if (!S_ISREG(f->f_path.dentry->d_inode->i_mode))
...@@ -501,12 +501,12 @@ void mark_files_ro(struct super_block *sb) ...@@ -501,12 +501,12 @@ void mark_files_ro(struct super_block *sb)
file_release_write(f); file_release_write(f);
mnt = mntget(f->f_path.mnt); mnt = mntget(f->f_path.mnt);
/* This can sleep, so we can't hold the spinlock. */ /* This can sleep, so we can't hold the spinlock. */
lg_global_unlock(files_lglock); lg_global_unlock(&files_lglock);
mnt_drop_write(mnt); mnt_drop_write(mnt);
mntput(mnt); mntput(mnt);
goto retry; goto retry;
} while_file_list_for_each_entry; } while_file_list_for_each_entry;
lg_global_unlock(files_lglock); lg_global_unlock(&files_lglock);
} }
void __init files_init(unsigned long mempages) void __init files_init(unsigned long mempages)
...@@ -524,6 +524,6 @@ void __init files_init(unsigned long mempages) ...@@ -524,6 +524,6 @@ void __init files_init(unsigned long mempages)
n = (mempages * (PAGE_SIZE / 1024)) / 10; n = (mempages * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = max_t(unsigned long, n, NR_FILE); files_stat.max_files = max_t(unsigned long, n, NR_FILE);
files_defer_init(); files_defer_init();
lg_lock_init(files_lglock); lg_lock_init(&files_lglock, "files_lglock");
percpu_counter_init(&nr_files, 0); percpu_counter_init(&nr_files, 0);
} }
...@@ -449,7 +449,7 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry) ...@@ -449,7 +449,7 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry)
mntget(nd->path.mnt); mntget(nd->path.mnt);
rcu_read_unlock(); rcu_read_unlock();
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
nd->flags &= ~LOOKUP_RCU; nd->flags &= ~LOOKUP_RCU;
return 0; return 0;
...@@ -507,14 +507,14 @@ static int complete_walk(struct nameidata *nd) ...@@ -507,14 +507,14 @@ static int complete_walk(struct nameidata *nd)
if (unlikely(!__d_rcu_to_refcount(dentry, nd->seq))) { if (unlikely(!__d_rcu_to_refcount(dentry, nd->seq))) {
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
rcu_read_unlock(); rcu_read_unlock();
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
return -ECHILD; return -ECHILD;
} }
BUG_ON(nd->inode != dentry->d_inode); BUG_ON(nd->inode != dentry->d_inode);
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
mntget(nd->path.mnt); mntget(nd->path.mnt);
rcu_read_unlock(); rcu_read_unlock();
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
} }
if (likely(!(nd->flags & LOOKUP_JUMPED))) if (likely(!(nd->flags & LOOKUP_JUMPED)))
...@@ -681,15 +681,15 @@ int follow_up(struct path *path) ...@@ -681,15 +681,15 @@ int follow_up(struct path *path)
struct mount *parent; struct mount *parent;
struct dentry *mountpoint; struct dentry *mountpoint;
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
parent = mnt->mnt_parent; parent = mnt->mnt_parent;
if (&parent->mnt == path->mnt) { if (&parent->mnt == path->mnt) {
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
return 0; return 0;
} }
mntget(&parent->mnt); mntget(&parent->mnt);
mountpoint = dget(mnt->mnt_mountpoint); mountpoint = dget(mnt->mnt_mountpoint);
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
dput(path->dentry); dput(path->dentry);
path->dentry = mountpoint; path->dentry = mountpoint;
mntput(path->mnt); mntput(path->mnt);
...@@ -947,7 +947,7 @@ static int follow_dotdot_rcu(struct nameidata *nd) ...@@ -947,7 +947,7 @@ static int follow_dotdot_rcu(struct nameidata *nd)
if (!(nd->flags & LOOKUP_ROOT)) if (!(nd->flags & LOOKUP_ROOT))
nd->root.mnt = NULL; nd->root.mnt = NULL;
rcu_read_unlock(); rcu_read_unlock();
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
return -ECHILD; return -ECHILD;
} }
...@@ -1265,7 +1265,7 @@ static void terminate_walk(struct nameidata *nd) ...@@ -1265,7 +1265,7 @@ static void terminate_walk(struct nameidata *nd)
if (!(nd->flags & LOOKUP_ROOT)) if (!(nd->flags & LOOKUP_ROOT))
nd->root.mnt = NULL; nd->root.mnt = NULL;
rcu_read_unlock(); rcu_read_unlock();
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
} }
} }
...@@ -1620,7 +1620,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, ...@@ -1620,7 +1620,7 @@ static int path_init(int dfd, const char *name, unsigned int flags,
nd->path = nd->root; nd->path = nd->root;
nd->inode = inode; nd->inode = inode;
if (flags & LOOKUP_RCU) { if (flags & LOOKUP_RCU) {
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
rcu_read_lock(); rcu_read_lock();
nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq);
} else { } else {
...@@ -1633,7 +1633,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, ...@@ -1633,7 +1633,7 @@ static int path_init(int dfd, const char *name, unsigned int flags,
if (*name=='/') { if (*name=='/') {
if (flags & LOOKUP_RCU) { if (flags & LOOKUP_RCU) {
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
rcu_read_lock(); rcu_read_lock();
set_root_rcu(nd); set_root_rcu(nd);
} else { } else {
...@@ -1646,7 +1646,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, ...@@ -1646,7 +1646,7 @@ static int path_init(int dfd, const char *name, unsigned int flags,
struct fs_struct *fs = current->fs; struct fs_struct *fs = current->fs;
unsigned seq; unsigned seq;
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
rcu_read_lock(); rcu_read_lock();
do { do {
...@@ -1682,7 +1682,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, ...@@ -1682,7 +1682,7 @@ static int path_init(int dfd, const char *name, unsigned int flags,
if (fput_needed) if (fput_needed)
*fp = file; *fp = file;
nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq);
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
rcu_read_lock(); rcu_read_lock();
} else { } else {
path_get(&file->f_path); path_get(&file->f_path);
......
This diff is collapsed.
...@@ -257,12 +257,12 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, ...@@ -257,12 +257,12 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry,
prev_src_mnt = child; prev_src_mnt = child;
} }
out: out:
br_write_lock(vfsmount_lock); br_write_lock(&vfsmount_lock);
while (!list_empty(&tmp_list)) { while (!list_empty(&tmp_list)) {
child = list_first_entry(&tmp_list, struct mount, mnt_hash); child = list_first_entry(&tmp_list, struct mount, mnt_hash);
umount_tree(child, 0, &umount_list); umount_tree(child, 0, &umount_list);
} }
br_write_unlock(vfsmount_lock); br_write_unlock(&vfsmount_lock);
release_mounts(&umount_list); release_mounts(&umount_list);
return ret; return ret;
} }
......
...@@ -23,12 +23,12 @@ static unsigned mounts_poll(struct file *file, poll_table *wait) ...@@ -23,12 +23,12 @@ static unsigned mounts_poll(struct file *file, poll_table *wait)
poll_wait(file, &p->ns->poll, wait); poll_wait(file, &p->ns->poll, wait);
br_read_lock(vfsmount_lock); br_read_lock(&vfsmount_lock);
if (p->m.poll_event != ns->event) { if (p->m.poll_event != ns->event) {
p->m.poll_event = ns->event; p->m.poll_event = ns->event;
res |= POLLERR | POLLPRI; res |= POLLERR | POLLPRI;
} }
br_read_unlock(vfsmount_lock); br_read_unlock(&vfsmount_lock);
return res; return res;
} }
......
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