if (copy > 0) {
                if (copy > len)
                        copy = len;
-               sg[elt].page = virt_to_page(skb->data + offset);
+               sg_set_page(&sg[elt], virt_to_page(skb->data + offset));
                sg[elt].offset = (unsigned long)(skb->data + offset) % PAGE_SIZE;
                sg[elt].length = copy;
                elt++;
 
                        if (copy > len)
                                copy = len;
-                       sg[elt].page = frag->page;
+                       sg_set_page(&sg[elt], frag->page);
                        sg[elt].offset = frag->page_offset+offset-start;
                        sg[elt].length = copy;
                        elt++;
 
        icv[3] = crc >> 24;
 
        crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
-       sg.page = virt_to_page(pos);
-       sg.offset = offset_in_page(pos);
-       sg.length = len + 4;
+       sg_init_one(&sg, pos, len + 4);
        return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
 }
 
        plen = skb->len - hdr_len - 12;
 
        crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
-       sg.page = virt_to_page(pos);
-       sg.offset = offset_in_page(pos);
-       sg.length = plen + 4;
+       sg_init_one(&sg, pos, plen + 4);
        if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) {
                if (net_ratelimit()) {
                        printk(KERN_DEBUG ": TKIP: failed to decrypt "
                printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
                return -1;
        }
-       sg[0].page = virt_to_page(hdr);
+       sg_init_table(sg, 2);
+       sg_set_page(&sg[0], virt_to_page(hdr));
        sg[0].offset = offset_in_page(hdr);
        sg[0].length = 16;
 
-       sg[1].page = virt_to_page(data);
+       sg_set_page(&sg[1], virt_to_page(data));
        sg[1].offset = offset_in_page(data);
        sg[1].length = data_len;
 
 
        icv[3] = crc >> 24;
 
        crypto_blkcipher_setkey(wep->tx_tfm, key, klen);
-       sg.page = virt_to_page(pos);
-       sg.offset = offset_in_page(pos);
-       sg.length = len + 4;
+       sg_init_one(&sg, pos, len + 4);
        return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
 }
 
        plen = skb->len - hdr_len - 8;
 
        crypto_blkcipher_setkey(wep->rx_tfm, key, klen);
-       sg.page = virt_to_page(pos);
-       sg.offset = offset_in_page(pos);
-       sg.length = plen + 4;
+       sg_init_one(&sg, pos, plen + 4);
        if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4))
                return -7;
 
 
        *icv = cpu_to_le32(~crc32_le(~0, data, data_len));
 
        crypto_blkcipher_setkey(tfm, rc4key, klen);
-       sg.page = virt_to_page(data);
-       sg.offset = offset_in_page(data);
-       sg.length = data_len + WEP_ICV_LEN;
+       sg_init_one(&sg, data, data_len + WEP_ICV_LEN);
        crypto_blkcipher_encrypt(&desc, &sg, &sg, sg.length);
 }
 
        __le32 crc;
 
        crypto_blkcipher_setkey(tfm, rc4key, klen);
-       sg.page = virt_to_page(data);
-       sg.offset = offset_in_page(data);
-       sg.length = data_len + WEP_ICV_LEN;
+       sg_init_one(&sg, data, data_len + WEP_ICV_LEN);
        crypto_blkcipher_decrypt(&desc, &sg, &sg, sg.length);
 
        crc = cpu_to_le32(~crc32_le(~0, data, data_len));
 
 
        /* set up scatter list */
        end = skb_tail_pointer(skb);
-       sg.page = virt_to_page(auth);
+       sg_init_table(&sg, 1);
+       sg_set_page(&sg, virt_to_page(auth));
        sg.offset = (unsigned long)(auth) % PAGE_SIZE;
        sg.length = end - (unsigned char *)auth;
 
 
                struct hash_desc desc;
 
                /* Sign the message.  */
-               sg.page = virt_to_page(&cookie->c);
+               sg_init_table(&sg, 1);
+               sg_set_page(&sg, virt_to_page(&cookie->c));
                sg.offset = (unsigned long)(&cookie->c) % PAGE_SIZE;
                sg.length = bodysize;
                keylen = SCTP_SECRET_SIZE;
 
        /* Check the signature.  */
        keylen = SCTP_SECRET_SIZE;
-       sg.page = virt_to_page(bear_cookie);
+       sg_init_table(&sg, 1);
+       sg_set_page(&sg, virt_to_page(bear_cookie));
        sg.offset = (unsigned long)(bear_cookie) % PAGE_SIZE;
        sg.length = bodysize;
        key = (char *)ep->secret_key[ep->current_key];
 
                int i = (page_pos + outbuf->page_base) >> PAGE_CACHE_SHIFT;
                in_page = desc->pages[i];
        } else {
-               in_page = sg->page;
+               in_page = sg_page(sg);
        }
-       desc->infrags[desc->fragno].page = in_page;
+       sg_set_page(&desc->infrags[desc->fragno], in_page);
        desc->fragno++;
        desc->fraglen += sg->length;
        desc->pos += sg->length;
        if (ret)
                return ret;
        if (fraglen) {
-               desc->outfrags[0].page = sg->page;
+               sg_set_page(&desc->outfrags[0], sg_page(sg));
                desc->outfrags[0].offset = sg->offset + sg->length - fraglen;
                desc->outfrags[0].length = fraglen;
                desc->infrags[0] = desc->outfrags[0];
-               desc->infrags[0].page = in_page;
+               sg_set_page(&desc->infrags[0], in_page);
                desc->fragno = 1;
                desc->fraglen = fraglen;
        } else {
        if (ret)
                return ret;
        if (fraglen) {
-               desc->frags[0].page = sg->page;
+               sg_set_page(&desc->frags[0], sg_page(sg));
                desc->frags[0].offset = sg->offset + sg->length - fraglen;
                desc->frags[0].length = fraglen;
                desc->fragno = 1;
 
                do {
                        if (thislen > page_len)
                                thislen = page_len;
-                       sg->page = buf->pages[i];
+                       sg_set_page(sg, buf->pages[i]);
                        sg->offset = page_offset;
                        sg->length = thislen;
                        ret = actor(sg, data);
 
                if (copy > len)
                        copy = len;
 
-               sg.page = virt_to_page(skb->data + offset);
+               sg_set_page(&sg, virt_to_page(skb->data + offset));
                sg.offset = (unsigned long)(skb->data + offset) % PAGE_SIZE;
                sg.length = copy;
 
                        if (copy > len)
                                copy = len;
 
-                       sg.page = frag->page;
+                       sg_set_page(&sg, frag->page);
                        sg.offset = frag->page_offset + offset-start;
                        sg.length = copy;