mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
reiserfs: locking, handle nested locks properly
The reiserfs write lock replaced the BKL and uses similar semantics. Frederic's locking code makes a distinction between when the lock is nested and when it's being acquired/released, but I don't think that's the right distinction to make. The right distinction is between the lock being released at end-of-use and the lock being released for a schedule. The unlock should return the depth and the lock should restore it, rather than the other way around as it is now. This patch implements that and adds a number of places where the lock should be dropped. Signed-off-by: Jeff Mahoney <jeffm@suse.com>
This commit is contained in:
parent
4c05141df5
commit
278f6679f4
13 changed files with 204 additions and 197 deletions
|
@ -1022,9 +1022,9 @@ static int get_far_parent(struct tree_balance *tb,
|
|||
if (buffer_locked(*pcom_father)) {
|
||||
|
||||
/* Release the write lock while the buffer is busy */
|
||||
reiserfs_write_unlock(tb->tb_sb);
|
||||
int depth = reiserfs_write_unlock_nested(tb->tb_sb);
|
||||
__wait_on_buffer(*pcom_father);
|
||||
reiserfs_write_lock(tb->tb_sb);
|
||||
reiserfs_write_lock_nested(tb->tb_sb, depth);
|
||||
if (FILESYSTEM_CHANGED_TB(tb)) {
|
||||
brelse(*pcom_father);
|
||||
return REPEAT_SEARCH;
|
||||
|
@ -1929,9 +1929,9 @@ static int get_direct_parent(struct tree_balance *tb, int h)
|
|||
return REPEAT_SEARCH;
|
||||
|
||||
if (buffer_locked(bh)) {
|
||||
reiserfs_write_unlock(tb->tb_sb);
|
||||
int depth = reiserfs_write_unlock_nested(tb->tb_sb);
|
||||
__wait_on_buffer(bh);
|
||||
reiserfs_write_lock(tb->tb_sb);
|
||||
reiserfs_write_lock_nested(tb->tb_sb, depth);
|
||||
if (FILESYSTEM_CHANGED_TB(tb))
|
||||
return REPEAT_SEARCH;
|
||||
}
|
||||
|
@ -1952,6 +1952,7 @@ static int get_neighbors(struct tree_balance *tb, int h)
|
|||
unsigned long son_number;
|
||||
struct super_block *sb = tb->tb_sb;
|
||||
struct buffer_head *bh;
|
||||
int depth;
|
||||
|
||||
PROC_INFO_INC(sb, get_neighbors[h]);
|
||||
|
||||
|
@ -1969,9 +1970,9 @@ static int get_neighbors(struct tree_balance *tb, int h)
|
|||
tb->FL[h]) ? tb->lkey[h] : B_NR_ITEMS(tb->
|
||||
FL[h]);
|
||||
son_number = B_N_CHILD_NUM(tb->FL[h], child_position);
|
||||
reiserfs_write_unlock(sb);
|
||||
depth = reiserfs_write_unlock_nested(tb->tb_sb);
|
||||
bh = sb_bread(sb, son_number);
|
||||
reiserfs_write_lock(sb);
|
||||
reiserfs_write_lock_nested(tb->tb_sb, depth);
|
||||
if (!bh)
|
||||
return IO_ERROR;
|
||||
if (FILESYSTEM_CHANGED_TB(tb)) {
|
||||
|
@ -2009,9 +2010,9 @@ static int get_neighbors(struct tree_balance *tb, int h)
|
|||
child_position =
|
||||
(bh == tb->FR[h]) ? tb->rkey[h] + 1 : 0;
|
||||
son_number = B_N_CHILD_NUM(tb->FR[h], child_position);
|
||||
reiserfs_write_unlock(sb);
|
||||
depth = reiserfs_write_unlock_nested(tb->tb_sb);
|
||||
bh = sb_bread(sb, son_number);
|
||||
reiserfs_write_lock(sb);
|
||||
reiserfs_write_lock_nested(tb->tb_sb, depth);
|
||||
if (!bh)
|
||||
return IO_ERROR;
|
||||
if (FILESYSTEM_CHANGED_TB(tb)) {
|
||||
|
@ -2272,6 +2273,7 @@ static int wait_tb_buffers_until_unlocked(struct tree_balance *tb)
|
|||
}
|
||||
|
||||
if (locked) {
|
||||
int depth;
|
||||
#ifdef CONFIG_REISERFS_CHECK
|
||||
repeat_counter++;
|
||||
if ((repeat_counter % 10000) == 0) {
|
||||
|
@ -2286,9 +2288,9 @@ static int wait_tb_buffers_until_unlocked(struct tree_balance *tb)
|
|||
REPEAT_SEARCH : CARRY_ON;
|
||||
}
|
||||
#endif
|
||||
reiserfs_write_unlock(tb->tb_sb);
|
||||
depth = reiserfs_write_unlock_nested(tb->tb_sb);
|
||||
__wait_on_buffer(locked);
|
||||
reiserfs_write_lock(tb->tb_sb);
|
||||
reiserfs_write_lock_nested(tb->tb_sb, depth);
|
||||
if (FILESYSTEM_CHANGED_TB(tb))
|
||||
return REPEAT_SEARCH;
|
||||
}
|
||||
|
@ -2359,9 +2361,9 @@ int fix_nodes(int op_mode, struct tree_balance *tb,
|
|||
|
||||
/* if it possible in indirect_to_direct conversion */
|
||||
if (buffer_locked(tbS0)) {
|
||||
reiserfs_write_unlock(tb->tb_sb);
|
||||
int depth = reiserfs_write_unlock_nested(tb->tb_sb);
|
||||
__wait_on_buffer(tbS0);
|
||||
reiserfs_write_lock(tb->tb_sb);
|
||||
reiserfs_write_lock_nested(tb->tb_sb, depth);
|
||||
if (FILESYSTEM_CHANGED_TB(tb))
|
||||
return REPEAT_SEARCH;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue