Skip to content

Commit 66db373

Browse files
tstrukdavem330
authored andcommitted
crypto: af_alg - Allow to link sgl
Allow to link af_alg sgls. Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 0345f93 commit 66db373

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

crypto/af_alg.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,8 @@ int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len)
358358
npages = (off + n + PAGE_SIZE - 1) >> PAGE_SHIFT;
359359
if (WARN_ON(npages == 0))
360360
return -EINVAL;
361-
362-
sg_init_table(sgl->sg, npages);
361+
/* Add one extra for linking */
362+
sg_init_table(sgl->sg, npages + 1);
363363

364364
for (i = 0, len = n; i < npages; i++) {
365365
int plen = min_t(int, len, PAGE_SIZE - off);
@@ -369,18 +369,26 @@ int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len)
369369
off = 0;
370370
len -= plen;
371371
}
372+
sg_mark_end(sgl->sg + npages - 1);
373+
sgl->npages = npages;
374+
372375
return n;
373376
}
374377
EXPORT_SYMBOL_GPL(af_alg_make_sg);
375378

379+
void af_alg_link_sg(struct af_alg_sgl *sgl_prev, struct af_alg_sgl *sgl_new)
380+
{
381+
sg_unmark_end(sgl_prev->sg + sgl_prev->npages - 1);
382+
sg_chain(sgl_prev->sg, sgl_prev->npages + 1, sgl_new->sg);
383+
}
384+
EXPORT_SYMBOL(af_alg_link_sg);
385+
376386
void af_alg_free_sg(struct af_alg_sgl *sgl)
377387
{
378388
int i;
379389

380-
i = 0;
381-
do {
390+
for (i = 0; i < sgl->npages; i++)
382391
put_page(sgl->pages[i]);
383-
} while (!sg_is_last(sgl->sg + (i++)));
384392
}
385393
EXPORT_SYMBOL_GPL(af_alg_free_sg);
386394

include/crypto/if_alg.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ struct af_alg_type {
5858
};
5959

6060
struct af_alg_sgl {
61-
struct scatterlist sg[ALG_MAX_PAGES];
61+
struct scatterlist sg[ALG_MAX_PAGES + 1];
6262
struct page *pages[ALG_MAX_PAGES];
63+
unsigned int npages;
6364
};
6465

6566
int af_alg_register_type(const struct af_alg_type *type);
@@ -70,6 +71,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock);
7071

7172
int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len);
7273
void af_alg_free_sg(struct af_alg_sgl *sgl);
74+
void af_alg_link_sg(struct af_alg_sgl *sgl_prev, struct af_alg_sgl *sgl_new);
7375

7476
int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con);
7577

0 commit comments

Comments
 (0)