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:

committed by
Jeff Mahoney

parent
4c05141df5
commit
278f6679f4
@@ -167,7 +167,6 @@ int reiserfs_commit_write(struct file *f, struct page *page,
|
||||
int reiserfs_unpack(struct inode *inode, struct file *filp)
|
||||
{
|
||||
int retval = 0;
|
||||
int depth;
|
||||
int index;
|
||||
struct page *page;
|
||||
struct address_space *mapping;
|
||||
@@ -183,11 +182,11 @@ int reiserfs_unpack(struct inode *inode, struct file *filp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
depth = reiserfs_write_lock_once(inode->i_sb);
|
||||
|
||||
/* we need to make sure nobody is changing the file size beneath us */
|
||||
reiserfs_mutex_lock_safe(&inode->i_mutex, inode->i_sb);
|
||||
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
|
||||
write_from = inode->i_size & (blocksize - 1);
|
||||
/* if we are on a block boundary, we are already unpacked. */
|
||||
if (write_from == 0) {
|
||||
@@ -221,6 +220,6 @@ int reiserfs_unpack(struct inode *inode, struct file *filp)
|
||||
|
||||
out:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
reiserfs_write_unlock_once(inode->i_sb, depth);
|
||||
reiserfs_write_unlock(inode->i_sb);
|
||||
return retval;
|
||||
}
|
||||
|
Reference in New Issue
Block a user