diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-06-01 10:34:35 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-06-01 10:34:35 -0700 | 
| commit | 1193755ac6328ad240ba987e6ec41d5e8baf0680 (patch) | |
| tree | 40bf847d7e3ebaa57b107151d14e6cd1d280cc6d /kernel/lglock.c | |
| parent | 4edebed86690eb8db9af3ab85baf4a34e73266cc (diff) | |
| parent | 0ef97dcfce4179a2eba046b855ee2f91d6f1b414 (diff) | |
| download | olio-linux-3.10-1193755ac6328ad240ba987e6ec41d5e8baf0680.tar.xz olio-linux-3.10-1193755ac6328ad240ba987e6ec41d5e8baf0680.zip  | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs changes from Al Viro.
 "A lot of misc stuff.  The obvious groups:
   * Miklos' atomic_open series; kills the damn abuse of
     ->d_revalidate() by NFS, which was the major stumbling block for
     all work in that area.
   * ripping security_file_mmap() and dealing with deadlocks in the
     area; sanitizing the neighborhood of vm_mmap()/vm_munmap() in
     general.
   * ->encode_fh() switched to saner API; insane fake dentry in
     mm/cleancache.c gone.
   * assorted annotations in fs (endianness, __user)
   * parts of Artem's ->s_dirty work (jff2 and reiserfs parts)
   * ->update_time() work from Josef.
   * other bits and pieces all over the place.
  Normally it would've been in two or three pull requests, but
  signal.git stuff had eaten a lot of time during this cycle ;-/"
Fix up trivial conflicts in Documentation/filesystems/vfs.txt (the
'truncate_range' inode method was removed by the VM changes, the VFS
update adds an 'update_time()' method), and in fs/btrfs/ulist.[ch] (due
to sparse fix added twice, with other changes nearby).
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (95 commits)
  nfs: don't open in ->d_revalidate
  vfs: retry last component if opening stale dentry
  vfs: nameidata_to_filp(): don't throw away file on error
  vfs: nameidata_to_filp(): inline __dentry_open()
  vfs: do_dentry_open(): don't put filp
  vfs: split __dentry_open()
  vfs: do_last() common post lookup
  vfs: do_last(): add audit_inode before open
  vfs: do_last(): only return EISDIR for O_CREAT
  vfs: do_last(): check LOOKUP_DIRECTORY
  vfs: do_last(): make ENOENT exit RCU safe
  vfs: make follow_link check RCU safe
  vfs: do_last(): use inode variable
  vfs: do_last(): inline walk_component()
  vfs: do_last(): make exit RCU safe
  vfs: split do_lookup()
  Btrfs: move over to use ->update_time
  fs: introduce inode operation ->update_time
  reiserfs: get rid of resierfs_sync_super
  reiserfs: mark the superblock as dirty a bit later
  ...
Diffstat (limited to 'kernel/lglock.c')
| -rw-r--r-- | kernel/lglock.c | 89 | 
1 files changed, 89 insertions, 0 deletions
diff --git a/kernel/lglock.c b/kernel/lglock.c new file mode 100644 index 00000000000..6535a667a5a --- /dev/null +++ b/kernel/lglock.c @@ -0,0 +1,89 @@ +/* See include/linux/lglock.h for description */ +#include <linux/module.h> +#include <linux/lglock.h> +#include <linux/cpu.h> +#include <linux/string.h> + +/* + * Note there is no uninit, so lglocks cannot be defined in + * modules (but it's fine to use them from there) + * Could be added though, just undo lg_lock_init + */ + +void lg_lock_init(struct lglock *lg, char *name) +{ +	LOCKDEP_INIT_MAP(&lg->lock_dep_map, name, &lg->lock_key, 0); +} +EXPORT_SYMBOL(lg_lock_init); + +void lg_local_lock(struct lglock *lg) +{ +	arch_spinlock_t *lock; + +	preempt_disable(); +	rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_); +	lock = this_cpu_ptr(lg->lock); +	arch_spin_lock(lock); +} +EXPORT_SYMBOL(lg_local_lock); + +void lg_local_unlock(struct lglock *lg) +{ +	arch_spinlock_t *lock; + +	rwlock_release(&lg->lock_dep_map, 1, _RET_IP_); +	lock = this_cpu_ptr(lg->lock); +	arch_spin_unlock(lock); +	preempt_enable(); +} +EXPORT_SYMBOL(lg_local_unlock); + +void lg_local_lock_cpu(struct lglock *lg, int cpu) +{ +	arch_spinlock_t *lock; + +	preempt_disable(); +	rwlock_acquire_read(&lg->lock_dep_map, 0, 0, _RET_IP_); +	lock = per_cpu_ptr(lg->lock, cpu); +	arch_spin_lock(lock); +} +EXPORT_SYMBOL(lg_local_lock_cpu); + +void lg_local_unlock_cpu(struct lglock *lg, int cpu) +{ +	arch_spinlock_t *lock; + +	rwlock_release(&lg->lock_dep_map, 1, _RET_IP_); +	lock = per_cpu_ptr(lg->lock, cpu); +	arch_spin_unlock(lock); +	preempt_enable(); +} +EXPORT_SYMBOL(lg_local_unlock_cpu); + +void lg_global_lock(struct lglock *lg) +{ +	int i; + +	preempt_disable(); +	rwlock_acquire(&lg->lock_dep_map, 0, 0, _RET_IP_); +	for_each_possible_cpu(i) { +		arch_spinlock_t *lock; +		lock = per_cpu_ptr(lg->lock, i); +		arch_spin_lock(lock); +	} +} +EXPORT_SYMBOL(lg_global_lock); + +void lg_global_unlock(struct lglock *lg) +{ +	int i; + +	rwlock_release(&lg->lock_dep_map, 1, _RET_IP_); +	for_each_possible_cpu(i) { +		arch_spinlock_t *lock; +		lock = per_cpu_ptr(lg->lock, i); +		arch_spin_unlock(lock); +	} +	preempt_enable(); +} +EXPORT_SYMBOL(lg_global_unlock);  |