Commit d78a3eda authored by Stefani Seibold's avatar Stefani Seibold Committed by Linus Torvalds

kernel/kfifo.c: add handling of chained scatterlists

The current kfifo scatterlist implementation will not work with chained
scatterlists.  It assumes that struct scatterlist arrays are allocated
contiguously, which is not the case when chained scatterlists (struct
sg_table) are in use.
Signed-off-by: default avatarStefani Seibold <stefani@seibold.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5af568cb
...@@ -333,17 +333,16 @@ static int setup_sgl_buf(struct scatterlist *sgl, void *buf, ...@@ -333,17 +333,16 @@ static int setup_sgl_buf(struct scatterlist *sgl, void *buf,
buf += PAGE_SIZE; buf += PAGE_SIZE;
npage = virt_to_page(buf); npage = virt_to_page(buf);
if (page_to_phys(page) != page_to_phys(npage) - l) { if (page_to_phys(page) != page_to_phys(npage) - l) {
sgl->page_link = 0; sg_set_page(sgl, page, l - off, off);
sg_set_page(sgl++, page, l - off, off); sgl = sg_next(sgl);
if (++n == nents) if (++n == nents || sgl == NULL)
return n; return n;
page = npage; page = npage;
len -= l - off; len -= l - off;
l = off = 0; l = off = 0;
} }
} }
sgl->page_link = 0; sg_set_page(sgl, page, len, off);
sg_set_page(sgl++, page, len, off);
return n + 1; return n + 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment