<feed xmlns='http://www.w3.org/2005/Atom'>
<title>talos-op-linux/include/scsi/osd_ore.h, branch v4.4.4</title>
<subtitle>Talos™ II Linux sources for OpenPOWER</subtitle>
<id>https://git.raptorcs.com/git/talos-op-linux/atom?h=v4.4.4</id>
<link rel='self' href='https://git.raptorcs.com/git/talos-op-linux/atom?h=v4.4.4'/>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/'/>
<updated>2014-10-19T17:22:32+00:00</updated>
<entry>
<title>Boaz Harrosh - Fix broken email address</title>
<updated>2014-10-19T17:22:32+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>ooo@electrozaur.com</email>
</author>
<published>2014-10-19T16:38:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=aa281ac631008b9c18c405c8880007789f659c7d'/>
<id>urn:sha1:aa281ac631008b9c18c405c8880007789f659c7d</id>
<content type='text'>
I no longer have access to the Panasas email.
So change to an email that can always reach me.

Signed-off-by: Boaz Harrosh &lt;ooo@electrozaur.com&gt;
</content>
</entry>
<entry>
<title>ore: Fix wrong math in allocation of per device BIO</title>
<updated>2014-01-23T08:55:03+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2013-11-21T15:58:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=aad560b7f63b495f48a7232fd086c5913a676e6f'/>
<id>urn:sha1:aad560b7f63b495f48a7232fd086c5913a676e6f</id>
<content type='text'>
At IO preparation we calculate the max pages at each device and
allocate a BIO per device of that size. The calculation was wrong
on some unaligned corner cases offset/length combination and would
make prepare return with -ENOMEM. This would be bad for pnfs-objects
that would in that case IO through MDS. And fatal for exofs were it
would fail writes with EIO.

Fix it by doing the proper math, that will work in all cases. (I
ran a test with all possible offset/length combinations this time
round).

Also when reading we do not need to allocate for the parity units
since we jump over them.

Also lower the max_io_length to take into account the parity pages
so not to allocate BIOs bigger than PAGE_SIZE

CC: Stable Kernel &lt;stable@vger.kernel.org&gt;
Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>BUG: headers with BUG/BUG_ON etc. need linux/bug.h</title>
<updated>2012-03-04T22:54:34+00:00</updated>
<author>
<name>Paul Gortmaker</name>
<email>paul.gortmaker@windriver.com</email>
</author>
<published>2011-11-24T01:12:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=187f1882b5b0748b3c4c22274663fdb372ac0452'/>
<id>urn:sha1:187f1882b5b0748b3c4c22274663fdb372ac0452</id>
<content type='text'>
If a header file is making use of BUG, BUG_ON, BUILD_BUG_ON, or any
other BUG variant in a static inline (i.e. not in a #define) then
that header really should be including &lt;linux/bug.h&gt; and not just
expecting it to be implicitly present.

We can make this change risk-free, since if the files using these
headers didn't have exposure to linux/bug.h already, they would have
been causing compile failures/warnings.

Signed-off-by: Paul Gortmaker &lt;paul.gortmaker@windriver.com&gt;
</content>
</entry>
<entry>
<title>ore: RAID5 Write</title>
<updated>2011-10-25T00:15:33+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-10-14T13:33:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=769ba8d92025fa390f3097e658b8ed6e032d68e9'/>
<id>urn:sha1:769ba8d92025fa390f3097e658b8ed6e032d68e9</id>
<content type='text'>
This is finally the RAID5 Write support.

The bigger part of this patch is not the XOR engine itself, But the
read4write logic, which is a complete mini prepare_for_striping
reading engine that can read scattered pages of a stripe into cache
so it can be used for XOR calculation. That is, if the write was not
stripe aligned.

The main algorithm behind the XOR engine is the 2 dimensional array:
	struct __stripe_pages_2d.
A drawing might save 1000 words
---

__stripe_pages_2d
       |
 n = pages_in_stripe_unit;
 w = group_width - parity;
       |                            pages array presented to the XOR lib
       |                                                |
       V                                                |
 __1_page_stripe[0].pages --&gt; [c0][c1]..[cw][c_par] &lt;---|
       |                                                |
 __1_page_stripe[1].pages --&gt; [c0][c1]..[cw][c_par] &lt;---
       |
...    |                         ...
       |
 __1_page_stripe[n].pages --&gt; [c0][c1]..[cw][c_par]
                               ^
                               |
           data added columns first then row

---
The pages are put on this array columns first. .i.e:
	p0-of-c0, p1-of-c0, ... pn-of-c0, p0-of-c1, ...
So we are doing a corner turn of the pages.

Note that pages will zigzag down and left. but are put sequentially
in growing order. So when the time comes to XOR the stripe, only the
beginning and end of the array need be checked. We scan the array
and any NULL spot will be field by pages-to-be-read.

The FS that wants to support RAID5 needs to supply an
operations-vector that searches a given page in cache, and specifies
if the page is uptodate or need reading. All these pages to be read
are put on a slave ore_io_state and synchronously read. All the pages
of a stripe are read in one IO, using the scatter gather mechanism.

In write we constrain our IO to only be incomplete on a single
stripe. Meaning either the complete IO is within a single stripe so
we might have pages to read from both beginning  or end of the
strip. Or we have some reading to do at beginning but end at strip
boundary. The left over pages are pushed to the next IO by the API
already established by previous work, where an IO offset/length
combination presented to the ORE might get the length truncated and
the user must re-submit the leftover pages. (Both exofs and NFS
support this)

But any ORE user should make it's best effort to align it's IO
before hand and avoid complications. A cached ore_layout-&gt;stripe_size
member can be used for that calculation. (NOTE: that ORE demands
that stripe_size may not be bigger then 32bit)

What else? Well read it and tell me.

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>ore: RAID5 read</title>
<updated>2011-10-24T23:55:36+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-10-12T16:42:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=a1fec1dbbc8db974d2582e4040590cebe72171e4'/>
<id>urn:sha1:a1fec1dbbc8db974d2582e4040590cebe72171e4</id>
<content type='text'>
This patch introduces the first stage of RAID5 support
mainly the skip-over-raid-units when reading. For
writes it inserts BLANK units, into where XOR blocks
should be calculated and written to.

It introduces the new "general raid maths", and the main
additional parameters and components needed for raid5.

Since at this stage it could corrupt future version that
actually do support raid5. The enablement of raid5
mounting and setting of parity-count &gt; 0 is disabled. So
the raid5 code will never be used. Mounting of raid5 is
only enabled later once the basic XOR write is also in.
But if the patch "enable RAID5" is applied this code has
been tested to be able to properly read raid5 volumes
and is according to standard.

Also it has been tested that the new maths still properly
supports RAID0 and grouping code just as before.
(BTW: I have found more bugs in the pnfs-obj RAID math
 fixed here)

The ore.c file is getting too big, so new ore_raid.[hc]
files are added that will include the special raid stuff
that are not used in striping and mirrors. In future write
support these will get bigger.
When adding the ore_raid.c to Kbuild file I was forced to
rename ore.ko to libore.ko. Is it possible to keep source
file, say ore.c and module file ore.ko the same even if there
are multiple files inside ore.ko?

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>ore: Make ore_calc_stripe_info EXPORT_SYMBOL</title>
<updated>2011-10-24T23:30:08+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-10-04T12:20:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=611d7a5dc6f2a1a0cfd8cc07b9d15f794cbe5f98'/>
<id>urn:sha1:611d7a5dc6f2a1a0cfd8cc07b9d15f794cbe5f98</id>
<content type='text'>
ore_calc_stripe_info is needed by exofs::export.c
for the layout calculations. Make it exportable

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>ore/exofs: Change ore_check_io API</title>
<updated>2011-10-14T16:54:42+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-09-28T10:25:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=4b46c9f5cf69505f0bc708995b88b0cc60317ffd'/>
<id>urn:sha1:4b46c9f5cf69505f0bc708995b88b0cc60317ffd</id>
<content type='text'>
Current ore_check_io API receives a residual
pointer, to report partial IO. But it is actually
not used, because in a multiple devices IO there
is never a linearity in the IO failure.

On the other hand if every failing device is reported
through a received callback measures can be taken to
handle only failed devices. One at a time.

This will also be needed by the objects-layout-driver
for it's error reporting facility.

Exofs is not currently using the new information and
keeps the old behaviour of failing the complete IO in
case of an error. (No partial completion)

TODO: Use an ore_check_io callback to set_page_error only
the failing pages. And re-dirty write pages.

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>ore/exofs: Define new ore_verify_layout</title>
<updated>2011-10-14T16:54:41+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-09-28T10:18:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=5a51c0c7e9a913649aa65d8233470682bcbb7694'/>
<id>urn:sha1:5a51c0c7e9a913649aa65d8233470682bcbb7694</id>
<content type='text'>
All users of the ore will need to check if current code
supports the given layout. For example RAID5/6 is not
currently supported.

So move all the checks from exofs/super.c to a new
ore_verify_layout() to be used by ore users.

Note that any new layout should be passed through the
ore_verify_layout() because the ore engine will prepare
and verify some internal members of ore_layout, and
assumes it's called.

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>ore: Support for partial component table</title>
<updated>2011-10-14T16:54:41+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-09-28T09:04:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=3bd9856857339d7ee8c4ad50030583f1b9415c39'/>
<id>urn:sha1:3bd9856857339d7ee8c4ad50030583f1b9415c39</id>
<content type='text'>
Users like the objlayout-driver would like to only pass
a partial device table that covers the IO in question.
For example exofs divides the file into raid-group-sized
chunks and only serves group_width number of devices at
a time.

The partiality is communicated by setting
ore_componets-&gt;first_dev and the array covers all logical
devices from oc-&gt;first_dev upto (oc-&gt;first_dev + oc-&gt;numdevs)

The ore_comp_dev() API receives a logical device index
and returns the actual present device in the table.
An out-of-range dev_index will BUG.

Logical device index is the theoretical device index as if
all the devices of a file are present. .i.e:
	total_devs = group_width * mirror_p1 * group_count
	0 &lt;= dev_index &lt; total_devs

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
<entry>
<title>ore: cleanup: Embed an ore_striping_info inside ore_io_state</title>
<updated>2011-10-14T16:53:54+00:00</updated>
<author>
<name>Boaz Harrosh</name>
<email>bharrosh@panasas.com</email>
</author>
<published>2011-10-02T13:32:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.raptorcs.com/git/talos-op-linux/commit/?id=98260754046eee4cc7d75751a4a20182ade39f58'/>
<id>urn:sha1:98260754046eee4cc7d75751a4a20182ade39f58</id>
<content type='text'>
Now that each ore_io_state covers only a single raid group.
A single striping_info math is needed. Embed one inside
ore_io_state to cache the calculation results and eliminate
an extra call.

Also the outer _prepare_for_striping is removed since it does nothing.

Signed-off-by: Boaz Harrosh &lt;bharrosh@panasas.com&gt;
</content>
</entry>
</feed>
