4/10

----------------------------

commit cea86bf50d8d84c823e6f5feb6c6b31d813969e8

Author: Jaren Johnston <jaren's email>

Date:   Fri Jun 8 15:48:56 2012 -0700

 

    properly init sg in empty case

    

    Change-Id: I7f2513a9a188cd3c2dd617200320f56b39704411

 

diff --git a/zc.c b/zc.c

index 77d31e5..ce929f0 100644

--- a/zc.c

+++ b/zc.c

@@ -53,25 +53,30 @@ int __get_userbuf(uint8_t __user *addr, uint32_t len,
int write,

               int ret, pglen, i = 0;

               struct scatterlist *sgp;

-              down_write(&mm->mmap_sem);

-              ret = get_user_pages(task, mm,

-                                              (unsigned long)addr, pgcount,
write, 0, pg, NULL);

-              up_write(&mm->mmap_sem);

-              if (ret != pgcount)

-                              return -EINVAL;

+              if (unlikely(!pgcount || !len || !addr)) {

+                              sg_mark_end(sg);

+              }

+              else {

+                              down_write(&mm->mmap_sem);

+                              ret = get_user_pages(task, mm,

+                                                              (unsigned
long)addr, pgcount, write, 0, pg, NULL);

+                              up_write(&mm->mmap_sem);

+                              if (ret != pgcount)

+                                              return -EINVAL;

-              sg_init_table(sg, pgcount);

+                              sg_init_table(sg, pgcount);

-              pglen = min((ptrdiff_t)(PAGE_SIZE - PAGEOFFSET(addr)),
(ptrdiff_t)len);

-              sg_set_page(sg, pg[i++], pglen, PAGEOFFSET(addr));

+                              pglen = min((ptrdiff_t)(PAGE_SIZE -
PAGEOFFSET(addr)), (ptrdiff_t)len);

+                              sg_set_page(sg, pg[i++], pglen,
PAGEOFFSET(addr));

-              len -= pglen;

-              for (sgp = sg_next(sg); len; sgp = sg_next(sgp)) {

-                              pglen = min((uint32_t)PAGE_SIZE, len);

-                              sg_set_page(sgp, pg[i++], pglen, 0);

                               len -= pglen;

+                              for (sgp = sg_next(sg); len; sgp =
sg_next(sgp)) {

+                                              pglen =
min((uint32_t)PAGE_SIZE, len);

+                                              sg_set_page(sgp, pg[i++],
pglen, 0);

+                                              len -= pglen;

+                              }

+                              sg_mark_end(sg_last(sg, pgcount));

               }

-              sg_mark_end(sg_last(sg, pgcount));

               return 0;

}

 

_______________________________________________
Cryptodev-linux-devel mailing list
Cryptodev-linux-devel@gna.org
https://mail.gna.org/listinfo/cryptodev-linux-devel

Reply via email to