Skip to content

Commit

Permalink
ocfs2: Correct ordering of ip_alloc_sem and localloc locks for direct…
Browse files Browse the repository at this point in the history
…ories

We use ordering ip_alloc_sem -> local alloc locks in ocfs2_write_begin().
So change lock ordering in ocfs2_extend_dir() and ocfs2_expand_inline_dir()
to also use this lock ordering.

Signed-off-by: Jan Kara <jack@suse.cz>
Acked-by: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
  • Loading branch information
Jan Kara authored and Joel Becker committed Jun 4, 2009
1 parent 80d73f1 commit edd45c0
Showing 1 changed file with 10 additions and 11 deletions.
21 changes: 10 additions & 11 deletions fs/ocfs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -2900,6 +2900,8 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
alloc = ocfs2_clusters_for_bytes(sb, bytes);
dx_alloc = 0;

down_write(&oi->ip_alloc_sem);

if (ocfs2_supports_indexed_dirs(osb)) {
credits += ocfs2_add_dir_index_credits(sb);

Expand Down Expand Up @@ -2940,8 +2942,6 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
goto out;
}

down_write(&oi->ip_alloc_sem);

/*
* Prepare for worst case allocation scenario of two separate
* extents in the unindexed tree.
Expand All @@ -2953,7 +2953,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
if (IS_ERR(handle)) {
ret = PTR_ERR(handle);
mlog_errno(ret);
goto out_sem;
goto out;
}

if (vfs_dq_alloc_space_nodirty(dir,
Expand Down Expand Up @@ -3172,10 +3172,8 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,

ocfs2_commit_trans(osb, handle);

out_sem:
up_write(&oi->ip_alloc_sem);

out:
up_write(&oi->ip_alloc_sem);
if (data_ac)
ocfs2_free_alloc_context(data_ac);
if (meta_ac)
Expand Down Expand Up @@ -3322,11 +3320,15 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
brelse(new_bh);
new_bh = NULL;

down_write(&OCFS2_I(dir)->ip_alloc_sem);
drop_alloc_sem = 1;
dir_i_size = i_size_read(dir);
credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS;
goto do_extend;
}

down_write(&OCFS2_I(dir)->ip_alloc_sem);
drop_alloc_sem = 1;
dir_i_size = i_size_read(dir);
mlog(0, "extending dir %llu (i_size = %lld)\n",
(unsigned long long)OCFS2_I(dir)->ip_blkno, dir_i_size);
Expand Down Expand Up @@ -3370,9 +3372,6 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
credits++; /* For attaching the new dirent block to the
* dx_root */

down_write(&OCFS2_I(dir)->ip_alloc_sem);
drop_alloc_sem = 1;

handle = ocfs2_start_trans(osb, credits);
if (IS_ERR(handle)) {
status = PTR_ERR(handle);
Expand Down Expand Up @@ -3435,10 +3434,10 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
*new_de_bh = new_bh;
get_bh(*new_de_bh);
bail:
if (drop_alloc_sem)
up_write(&OCFS2_I(dir)->ip_alloc_sem);
if (handle)
ocfs2_commit_trans(osb, handle);
if (drop_alloc_sem)
up_write(&OCFS2_I(dir)->ip_alloc_sem);

if (data_ac)
ocfs2_free_alloc_context(data_ac);
Expand Down

0 comments on commit edd45c0

Please sign in to comment.