Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a43db30c authored by Joel Becker's avatar Joel Becker Committed by Mark Fasheh
Browse files

ocfs2: silence -EEXIST from ocfs2_extent_map_insert/lookup

parent 8169cae5
Loading
Loading
Loading
Loading
+22 −7
Original line number Diff line number Diff line
@@ -298,7 +298,7 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,

		ret = ocfs2_extent_map_insert(inode, rec,
					      le16_to_cpu(el->l_tree_depth));
		if (ret) {
		if (ret && (ret != -EEXIST)) {
			mlog_errno(ret);
			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
 * 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,
				       struct ocfs2_extent_rec *rec,
@@ -448,22 +453,32 @@ static int ocfs2_extent_map_try_insert(struct inode *inode,
		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),
					  le32_to_cpu(rec->e_clusters), NULL,
					  NULL);
					  le32_to_cpu(rec->e_clusters),
					  NULL, NULL);

	BUG_ON(!old_ent);

	if (old_ent->e_tree_depth < tree_depth) {
		/* Another thread beat us to the lower tree_depth */
		ret = -EEXIST;
	if (old_ent->e_tree_depth < tree_depth)
		goto out_unlock;
	}

	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,
			    sizeof(struct ocfs2_extent_rec)))
			ret = 0;

		else
			/* FIXME: Should this be ESRCH/EBADR??? */
			ret = -EEXIST;

		goto out_unlock;
	}

@@ -599,7 +614,7 @@ static int ocfs2_extent_map_insert(struct inode *inode,
						  tree_depth, &ctxt);
	} while (ret == -EAGAIN);

	if (ret < 0)
	if ((ret < 0) && (ret != -EEXIST))
		mlog_errno(ret);

	if (ctxt.left_ent)