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