[PATCH 00/24] LAYOUTGET invocation (rebased)

Fred Isaman
2010-06-08T04:19:43Z

This patch series limits LAYOUTGET invocation to the beginning of the
IO paths. It applies atop Alexandros's recent patchset submission,
but is otherwise basically the same as the previous submission. It is
intended for the pnfs_submit branch, without reversion in a
post_submit branch.

Patches 1-4 revert direct IO. Commit is already broken, and this
series breaks them further. The problem is that the direct IO
redefines data->wb_req and data->pages, so that it can only work with
the pnfs code if we don't look at those fields. The reverted code
should be saved somewhere. I tend to agree with Boaz that keeping it
in git is preferable, but I can supply a patch which returns the code
ifdef'ed out if tht is preferred.

Patches 5-9 do some code cleanup in preperation for the real work.

Patches 10-21 implement the change. NOTE that patch 20 changes the
calling convention of the layout drivers commit calls. There is no
longer a universal lseg for the commit, instead each nfs_page has an
lseg attached, with NULL meaning to go through the MDS.

Patches 21-24 rework the filelayout commit function, and then do some
code cleanup this enables.

The basic idea of these patches is as follows:

We attempt to grab a lseg (possibly invoking LAYOUTGET) early in the
IO. If we succeed, we refcount and stash it, using it through the
rest of the io. If we fail, we revert to straight nfs, even if the
area becomes covered by a layout due to other io.

The tricky, though hopefully anomalous, case is when we start without
the layout, but have it at this particular stage of the IO. We ignore
this for the moment at write_pages, which will cause block and object
to issue CB_LAYOUTRECALL. At commit, it is tricky to handle, but
since block doesn't use commit, and file needs to handle complicated
splitting anyway, I just push all complicated decisions of splitting
commit between nfs (for IO started without layout) and pnfs to the
driver.

Fred