On Tue, May 03, 2016 at 04:30:07PM +0000, Taylor R Campbell wrote:
> - http://nxr.netbsd.org/xref/src/sys/kern/vfs_wapbl.c?r=1.64#1489
> (This one is a little hairier: might need to push the call into
> wapbl_truncate, or require the caller of wapbl_truncate to hold the
> lock on entry and to accept that it will be released/reacquired.)

I've got some problems with understanding the code:

There are two calls for wapbl_truncate, both in wapbl_flush.

- line 1508, a 'normal' call - flush transaction length

- line 1641, in goto out; case,
  if (waitfor) then truncate (wl_circ_size - wl_reserved_bytes).
    (this size seems to be 'everything that can be truncated'.)

  however, this goto out: can only be reached from one case;
        /*
         * Now that we are fully locked and flushed,
         * do another check for nothing to do.
         */
        if (wl->wl_bufcount == 0) {
                goto out;
        }

  I'm confused: how we are doing nothing if we are trying to truncate
  everything (at least sometimes, if waitfor)?

Thanks for responding.

Reply via email to