mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 15:11:16 +00:00
ocfs2: silence -EEXIST from ocfs2_extent_map_insert/lookup
Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
8169cae5a1
commit
a43db30c7c
1 changed files with 22 additions and 7 deletions
|
@ -298,7 +298,7 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,
|
||||||
|
|
||||||
ret = ocfs2_extent_map_insert(inode, rec,
|
ret = ocfs2_extent_map_insert(inode, rec,
|
||||||
le16_to_cpu(el->l_tree_depth));
|
le16_to_cpu(el->l_tree_depth));
|
||||||
if (ret) {
|
if (ret && (ret != -EEXIST)) {
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
@ -427,6 +427,11 @@ static int ocfs2_extent_map_insert_entry(struct ocfs2_extent_map *em,
|
||||||
/*
|
/*
|
||||||
* Simple rule: on any return code other than -EAGAIN, anything left
|
* Simple rule: on any return code other than -EAGAIN, anything left
|
||||||
* in the insert_context will be freed.
|
* in the insert_context will be freed.
|
||||||
|
*
|
||||||
|
* Simple rule #2: A return code of -EEXIST from this function or
|
||||||
|
* its calls to ocfs2_extent_map_insert_entry() signifies that another
|
||||||
|
* thread beat us to the insert. It is not an actual error, but it
|
||||||
|
* tells the caller we have no more work to do.
|
||||||
*/
|
*/
|
||||||
static int ocfs2_extent_map_try_insert(struct inode *inode,
|
static int ocfs2_extent_map_try_insert(struct inode *inode,
|
||||||
struct ocfs2_extent_rec *rec,
|
struct ocfs2_extent_rec *rec,
|
||||||
|
@ -448,22 +453,32 @@ static int ocfs2_extent_map_try_insert(struct inode *inode,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Since insert_entry failed, the map MUST have old_ent */
|
||||||
old_ent = ocfs2_extent_map_lookup(em, le32_to_cpu(rec->e_cpos),
|
old_ent = ocfs2_extent_map_lookup(em, le32_to_cpu(rec->e_cpos),
|
||||||
le32_to_cpu(rec->e_clusters), NULL,
|
le32_to_cpu(rec->e_clusters),
|
||||||
NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
BUG_ON(!old_ent);
|
BUG_ON(!old_ent);
|
||||||
|
|
||||||
ret = -EEXIST;
|
if (old_ent->e_tree_depth < tree_depth) {
|
||||||
if (old_ent->e_tree_depth < tree_depth)
|
/* Another thread beat us to the lower tree_depth */
|
||||||
|
ret = -EEXIST;
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
if (old_ent->e_tree_depth == tree_depth) {
|
if (old_ent->e_tree_depth == tree_depth) {
|
||||||
|
/*
|
||||||
|
* Another thread beat us to this tree_depth.
|
||||||
|
* Let's make sure we agree with that thread (the
|
||||||
|
* extent_rec should be identical).
|
||||||
|
*/
|
||||||
if (!memcmp(rec, &old_ent->e_rec,
|
if (!memcmp(rec, &old_ent->e_rec,
|
||||||
sizeof(struct ocfs2_extent_rec)))
|
sizeof(struct ocfs2_extent_rec)))
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
else
|
||||||
|
/* FIXME: Should this be ESRCH/EBADR??? */
|
||||||
|
ret = -EEXIST;
|
||||||
|
|
||||||
/* FIXME: Should this be ESRCH/EBADR??? */
|
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,7 +614,7 @@ static int ocfs2_extent_map_insert(struct inode *inode,
|
||||||
tree_depth, &ctxt);
|
tree_depth, &ctxt);
|
||||||
} while (ret == -EAGAIN);
|
} while (ret == -EAGAIN);
|
||||||
|
|
||||||
if (ret < 0)
|
if ((ret < 0) && (ret != -EEXIST))
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
|
|
||||||
if (ctxt.left_ent)
|
if (ctxt.left_ent)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue