mirror of
https://github.com/opnsense/src.git
synced 2026-02-12 23:36:07 -05:00
linuxkpi: Fix sg_alloc_table_from_pages() to have the same API as Linux
It now returns a `struct scatterlist *` pointer instead of an error code only. The implementation is incomplete because it doesn't use the `prv` argument. Reviewed by: manu Approved by: manu Differential Revision: https://reviews.freebsd.org/D38077
This commit is contained in:
parent
8c46bd9f86
commit
3e0856b63f
1 changed files with 43 additions and 1 deletions
|
|
@ -327,18 +327,40 @@ sg_alloc_table(struct sg_table *table, unsigned int nents, gfp_t gfp_mask)
|
|||
return (ret);
|
||||
}
|
||||
|
||||
#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 51300
|
||||
static inline struct scatterlist *
|
||||
__sg_alloc_table_from_pages(struct sg_table *sgt,
|
||||
struct page **pages, unsigned int count,
|
||||
unsigned long off, unsigned long size,
|
||||
unsigned int max_segment,
|
||||
struct scatterlist *prv, unsigned int left_pages,
|
||||
gfp_t gfp_mask)
|
||||
#else
|
||||
static inline int
|
||||
__sg_alloc_table_from_pages(struct sg_table *sgt,
|
||||
struct page **pages, unsigned int count,
|
||||
unsigned long off, unsigned long size,
|
||||
unsigned int max_segment, gfp_t gfp_mask)
|
||||
#endif
|
||||
{
|
||||
unsigned int i, segs, cur, len;
|
||||
int rc;
|
||||
struct scatterlist *s;
|
||||
|
||||
#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 51300
|
||||
if (prv != NULL) {
|
||||
panic(
|
||||
"Support for prv != NULL not implemented in "
|
||||
"__sg_alloc_table_from_pages()");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (__predict_false(!max_segment || offset_in_page(max_segment)))
|
||||
#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 51300
|
||||
return (ERR_PTR(-EINVAL));
|
||||
#else
|
||||
return (-EINVAL);
|
||||
#endif
|
||||
|
||||
len = 0;
|
||||
for (segs = i = 1; i < count; ++i) {
|
||||
|
|
@ -350,13 +372,19 @@ __sg_alloc_table_from_pages(struct sg_table *sgt,
|
|||
}
|
||||
}
|
||||
if (__predict_false((rc = sg_alloc_table(sgt, segs, gfp_mask))))
|
||||
#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 51300
|
||||
return (ERR_PTR(rc));
|
||||
#else
|
||||
return (rc);
|
||||
#endif
|
||||
|
||||
cur = 0;
|
||||
for_each_sg(sgt->sgl, s, sgt->orig_nents, i) {
|
||||
for (i = 0, s = sgt->sgl; i < sgt->orig_nents; i++) {
|
||||
unsigned long seg_size;
|
||||
unsigned int j;
|
||||
|
||||
s = sg_next(s);
|
||||
|
||||
len = 0;
|
||||
for (j = cur + 1; j < count; ++j) {
|
||||
len += PAGE_SIZE;
|
||||
|
|
@ -371,7 +399,16 @@ __sg_alloc_table_from_pages(struct sg_table *sgt,
|
|||
off = 0;
|
||||
cur = j;
|
||||
}
|
||||
KASSERT(s != NULL, ("s is NULL after loop in __sg_alloc_table_from_pages()"));
|
||||
|
||||
#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 51300
|
||||
if (left_pages == 0)
|
||||
sg_mark_end(s);
|
||||
|
||||
return (s);
|
||||
#else
|
||||
return (0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
|
@ -381,8 +418,13 @@ sg_alloc_table_from_pages(struct sg_table *sgt,
|
|||
gfp_t gfp_mask)
|
||||
{
|
||||
|
||||
#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 51300
|
||||
return (PTR_ERR_OR_ZERO(__sg_alloc_table_from_pages(sgt, pages, count, off, size,
|
||||
SCATTERLIST_MAX_SEGMENT, NULL, 0, gfp_mask)));
|
||||
#else
|
||||
return (__sg_alloc_table_from_pages(sgt, pages, count, off, size,
|
||||
SCATTERLIST_MAX_SEGMENT, gfp_mask));
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int
|
||||
|
|
|
|||
Loading…
Reference in a new issue