On Tue, May 08, 2012 at 03:57:39PM -0700, Mark Fasheh wrote:
> Hi Jan, comments inline as usual!
> 
> > This function must not call free_extent_buffer(eb) in line 1306 after
> > applying your patch set (immediately before the break). Second, I think
> > we'd better add a blocking read lock on eb after incrementing it's
> > refcount, because we need the current content to stay as it is. Both
> > isn't part of your patches, but it might be easier if you make that
> > bugfix change as a 3/4 patch within your set and turn this one into 4/4.
> > If you don't like that, I'll send a separate patch for it. Don't miss
> > the unlock if you do it ;-)
> 
> Ok, I think I was able to figure out and add the correct locking calls.
> 
> Basically I believe I need to wrap access around:
> 
> btrfs_tree_read_lock(eb);
> btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
> 
> <read eb contents>
> 
> btrfs_tree_read_unlock_blocking(eb);

You only need a blocking lock if you're scheduling.  Otherwise the
spinlock variant is fine.

> > > +
> > > + while (1) {
> > > +         ret = btrfs_find_one_extref(fs_root, inum, offset, path, &iref2,
> > > +                                     &offset);
> > > +         if (ret < 0)
> > > +                 break;
> > > +         if (ret) {
> > > +                 ret = found ? 0 : -ENOENT;
> > > +                 break;
> > > +         }
> > > +         ++found;
> > > +
> > > +         slot = path->slots[0];
> > > +         eb = path->nodes[0];
> > > +         /* make sure we can use eb after releasing the path */
> > > +         atomic_inc(&eb->refs);
> > 
> > You need a blocking read lock here, too. Grab it before releasing the path.

If you're calling btrfs_search_slot, it will give you a blocking lock
on the leaf.  If you set path->leave_spinning before the call, you'll
have a spinning lock on the leaf.

If you unlock a block that you got from a path (like eb =
path->nodes[0]), the path structure has a flag for each level that
indicates if that block was locked or not.  See btrfs_release_path().
So, don't fiddle the locks without fiddling the paths.

You can switch from spinning to/from blocking without touching the path, it
figures that out.

-chris

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to