Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
reiserfs
lock.c
Go to the documentation of this file.
1
#include "
reiserfs.h
"
2
#include <
linux/mutex.h
>
3
4
/*
5
* The previous reiserfs locking scheme was heavily based on
6
* the tricky properties of the Bkl:
7
*
8
* - it was acquired recursively by a same task
9
* - the performances relied on the release-while-schedule() property
10
*
11
* Now that we replace it by a mutex, we still want to keep the same
12
* recursive property to avoid big changes in the code structure.
13
* We use our own lock_owner here because the owner field on a mutex
14
* is only available in SMP or mutex debugging, also we only need this field
15
* for this mutex, no need for a system wide mutex facility.
16
*
17
* Also this lock is often released before a call that could block because
18
* reiserfs performances were partially based on the release while schedule()
19
* property of the Bkl.
20
*/
21
void
reiserfs_write_lock
(
struct
super_block
*
s
)
22
{
23
struct
reiserfs_sb_info
*sb_i = REISERFS_SB(s);
24
25
if
(sb_i->
lock_owner
!=
current
) {
26
mutex_lock
(&sb_i->
lock
);
27
sb_i->
lock_owner
=
current
;
28
}
29
30
/* No need to protect it, only the current task touches it */
31
sb_i->
lock_depth
++;
32
}
33
34
void
reiserfs_write_unlock
(
struct
super_block
*
s
)
35
{
36
struct
reiserfs_sb_info
*sb_i = REISERFS_SB(s);
37
38
/*
39
* Are we unlocking without even holding the lock?
40
* Such a situation must raise a BUG() if we don't want
41
* to corrupt the data.
42
*/
43
BUG_ON
(sb_i->
lock_owner
!=
current
);
44
45
if
(--sb_i->
lock_depth
== -1) {
46
sb_i->
lock_owner
=
NULL
;
47
mutex_unlock
(&sb_i->
lock
);
48
}
49
}
50
51
/*
52
* If we already own the lock, just exit and don't increase the depth.
53
* Useful when we don't want to lock more than once.
54
*
55
* We always return the lock_depth we had before calling
56
* this function.
57
*/
58
int
reiserfs_write_lock_once
(
struct
super_block
*
s
)
59
{
60
struct
reiserfs_sb_info
*sb_i = REISERFS_SB(s);
61
62
if
(sb_i->
lock_owner
!=
current
) {
63
mutex_lock
(&sb_i->
lock
);
64
sb_i->
lock_owner
=
current
;
65
return
sb_i->
lock_depth
++;
66
}
67
68
return
sb_i->
lock_depth
;
69
}
70
71
void
reiserfs_write_unlock_once
(
struct
super_block
*
s
,
int
lock_depth
)
72
{
73
if
(lock_depth == -1)
74
reiserfs_write_unlock
(s);
75
}
76
77
/*
78
* Utility function to force a BUG if it is called without the superblock
79
* write lock held. caller is the string printed just before calling BUG()
80
*/
81
void
reiserfs_check_lock_depth
(
struct
super_block
*
sb
,
char
*
caller
)
82
{
83
struct
reiserfs_sb_info
*sb_i = REISERFS_SB(sb);
84
85
if
(sb_i->
lock_depth
< 0)
86
reiserfs_panic
(sb,
"%s called without kernel lock held %d"
,
87
caller);
88
}
89
90
#ifdef CONFIG_REISERFS_CHECK
91
void
reiserfs_lock_check_recursive(
struct
super_block
*
sb
)
92
{
93
struct
reiserfs_sb_info
*sb_i = REISERFS_SB(sb);
94
95
WARN_ONCE
((sb_i->
lock_depth
> 0),
"Unwanted recursive reiserfs lock!\n"
);
96
}
97
#endif
Generated on Thu Jan 10 2013 14:46:28 for Linux Kernel by
1.8.2