Blame view

include/linux/blockgroup_lock.h 1.14 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  #ifndef _LINUX_BLOCKGROUP_LOCK_H
  #define _LINUX_BLOCKGROUP_LOCK_H
  /*
   * Per-blockgroup locking for ext2 and ext3.
   *
   * Simple hashed spinlocking.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  #include <linux/spinlock.h>
  #include <linux/cache.h>
  
  #ifdef CONFIG_SMP
  
  /*
   * We want a power-of-two.  Is there a better way than this?
   */
  
  #if NR_CPUS >= 32
  #define NR_BG_LOCKS	128
  #elif NR_CPUS >= 16
  #define NR_BG_LOCKS	64
  #elif NR_CPUS >= 8
  #define NR_BG_LOCKS	32
  #elif NR_CPUS >= 4
  #define NR_BG_LOCKS	16
  #elif NR_CPUS >= 2
  #define NR_BG_LOCKS	8
  #else
  #define NR_BG_LOCKS	4
  #endif
  
  #else	/* CONFIG_SMP */
  #define NR_BG_LOCKS	1
  #endif	/* CONFIG_SMP */
  
  struct bgl_lock {
  	spinlock_t lock;
  } ____cacheline_aligned_in_smp;
  
  struct blockgroup_lock {
  	struct bgl_lock locks[NR_BG_LOCKS];
  };
  
  static inline void bgl_lock_init(struct blockgroup_lock *bgl)
  {
  	int i;
  
  	for (i = 0; i < NR_BG_LOCKS; i++)
  		spin_lock_init(&bgl->locks[i].lock);
  }
  
  /*
   * The accessor is a macro so we can embed a blockgroup_lock into different
   * superblock types
   */
c644f0e4b   Pekka Enberg   fs: introduce bgl...
55
56
57
58
59
  static inline spinlock_t *
  bgl_lock_ptr(struct blockgroup_lock *bgl, unsigned int block_group)
  {
  	return &bgl->locks[(block_group) & (NR_BG_LOCKS-1)].lock;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
  
  #endif