diff options
| -rw-r--r-- | crypto/api.c | 5 | ||||
| -rw-r--r-- | crypto/hmac.c | 19 | ||||
| -rw-r--r-- | crypto/tcrypt.c | 56 | ||||
| -rw-r--r-- | drivers/md/dm-crypt.c | 12 | ||||
| -rw-r--r-- | drivers/net/wireless/airo.c | 7 | ||||
| -rw-r--r-- | drivers/scsi/arm/scsi.h | 6 | ||||
| -rw-r--r-- | drivers/scsi/libata-core.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/sg.c | 5 | ||||
| -rw-r--r-- | drivers/usb/misc/usbtest.c | 7 | ||||
| -rw-r--r-- | include/linux/scatterlist.h | 17 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 10 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_crypto.c | 23 | 
12 files changed, 64 insertions, 113 deletions
| diff --git a/crypto/api.c b/crypto/api.c index 959c4e5f264f..40ae42e9b6a6 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
| @@ -215,7 +215,10 @@ int crypto_register_alg(struct crypto_alg *alg) | |||
| 215 | if (alg->cra_alignmask & (alg->cra_alignmask + 1)) | 215 | if (alg->cra_alignmask & (alg->cra_alignmask + 1)) | 
| 216 | return -EINVAL; | 216 | return -EINVAL; | 
| 217 | 217 | ||
| 218 | if (alg->cra_alignmask > PAGE_SIZE) | 218 | if (alg->cra_alignmask & alg->cra_blocksize) | 
| 219 | return -EINVAL; | ||
| 220 | |||
| 221 | if (alg->cra_blocksize > PAGE_SIZE) | ||
| 219 | return -EINVAL; | 222 | return -EINVAL; | 
| 220 | 223 | ||
| 221 | down_write(&crypto_alg_sem); | 224 | down_write(&crypto_alg_sem); | 
| diff --git a/crypto/hmac.c b/crypto/hmac.c index da0456b37109..46120dee5ada 100644 --- a/crypto/hmac.c +++ b/crypto/hmac.c | |||
| @@ -18,18 +18,15 @@ | |||
| 18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> | 
| 19 | #include <linux/highmem.h> | 19 | #include <linux/highmem.h> | 
| 20 | #include <linux/slab.h> | 20 | #include <linux/slab.h> | 
| 21 | #include <asm/scatterlist.h> | 21 | #include <linux/scatterlist.h> | 
| 22 | #include "internal.h" | 22 | #include "internal.h" | 
| 23 | 23 | ||
| 24 | static void hash_key(struct crypto_tfm *tfm, u8 *key, unsigned int keylen) | 24 | static void hash_key(struct crypto_tfm *tfm, u8 *key, unsigned int keylen) | 
| 25 | { | 25 | { | 
| 26 | struct scatterlist tmp; | 26 | struct scatterlist tmp; | 
| 27 | 27 | ||
| 28 | tmp.page = virt_to_page(key); | 28 | sg_set_buf(&tmp, key, keylen); | 
| 29 | tmp.offset = offset_in_page(key); | ||
| 30 | tmp.length = keylen; | ||
| 31 | crypto_digest_digest(tfm, &tmp, 1, key); | 29 | crypto_digest_digest(tfm, &tmp, 1, key); | 
| 32 | |||
| 33 | } | 30 | } | 
| 34 | 31 | ||
| 35 | int crypto_alloc_hmac_block(struct crypto_tfm *tfm) | 32 | int crypto_alloc_hmac_block(struct crypto_tfm *tfm) | 
| @@ -69,9 +66,7 @@ void crypto_hmac_init(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen) | |||
| 69 | for (i = 0; i < crypto_tfm_alg_blocksize(tfm); i++) | 66 | for (i = 0; i < crypto_tfm_alg_blocksize(tfm); i++) | 
| 70 | ipad[i] ^= 0x36; | 67 | ipad[i] ^= 0x36; | 
| 71 | 68 | ||
| 72 | tmp.page = virt_to_page(ipad); | 69 | sg_set_buf(&tmp, ipad, crypto_tfm_alg_blocksize(tfm)); | 
| 73 | tmp.offset = offset_in_page(ipad); | ||
| 74 | tmp.length = crypto_tfm_alg_blocksize(tfm); | ||
| 75 | 70 | ||
| 76 | crypto_digest_init(tfm); | 71 | crypto_digest_init(tfm); | 
| 77 | crypto_digest_update(tfm, &tmp, 1); | 72 | crypto_digest_update(tfm, &tmp, 1); | 
| @@ -103,16 +98,12 @@ void crypto_hmac_final(struct crypto_tfm *tfm, u8 *key, | |||
| 103 | for (i = 0; i < crypto_tfm_alg_blocksize(tfm); i++) | 98 | for (i = 0; i < crypto_tfm_alg_blocksize(tfm); i++) | 
| 104 | opad[i] ^= 0x5c; | 99 | opad[i] ^= 0x5c; | 
| 105 | 100 | ||
| 106 | tmp.page = virt_to_page(opad); | 101 | sg_set_buf(&tmp, opad, crypto_tfm_alg_blocksize(tfm)); | 
| 107 | tmp.offset = offset_in_page(opad); | ||
| 108 | tmp.length = crypto_tfm_alg_blocksize(tfm); | ||
| 109 | 102 | ||
| 110 | crypto_digest_init(tfm); | 103 | crypto_digest_init(tfm); | 
| 111 | crypto_digest_update(tfm, &tmp, 1); | 104 | crypto_digest_update(tfm, &tmp, 1); | 
| 112 | 105 | ||
| 113 | tmp.page = virt_to_page(out); | 106 | sg_set_buf(&tmp, out, crypto_tfm_alg_digestsize(tfm)); | 
| 114 | tmp.offset = offset_in_page(out); | ||
| 115 | tmp.length = crypto_tfm_alg_digestsize(tfm); | ||
| 116 | 107 | ||
| 117 | crypto_digest_update(tfm, &tmp, 1); | 108 | crypto_digest_update(tfm, &tmp, 1); | 
| 118 | crypto_digest_final(tfm, out); | 109 | crypto_digest_final(tfm, out); | 
| diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 68639419c5bd..53f4ee804bdb 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | #include <linux/module.h> | 21 | #include <linux/module.h> | 
| 22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> | 
| 23 | #include <linux/slab.h> | 23 | #include <linux/slab.h> | 
| 24 | #include <asm/scatterlist.h> | 24 | #include <linux/scatterlist.h> | 
| 25 | #include <linux/string.h> | 25 | #include <linux/string.h> | 
| 26 | #include <linux/crypto.h> | 26 | #include <linux/crypto.h> | 
| 27 | #include <linux/highmem.h> | 27 | #include <linux/highmem.h> | 
| @@ -86,7 +86,6 @@ static void hexdump(unsigned char *buf, unsigned int len) | |||
| 86 | static void test_hash(char *algo, struct hash_testvec *template, | 86 | static void test_hash(char *algo, struct hash_testvec *template, | 
| 87 | unsigned int tcount) | 87 | unsigned int tcount) | 
| 88 | { | 88 | { | 
| 89 | char *p; | ||
| 90 | unsigned int i, j, k, temp; | 89 | unsigned int i, j, k, temp; | 
| 91 | struct scatterlist sg[8]; | 90 | struct scatterlist sg[8]; | 
| 92 | char result[64]; | 91 | char result[64]; | 
| @@ -116,10 +115,7 @@ static void test_hash(char *algo, struct hash_testvec *template, | |||
| 116 | printk("test %u:\n", i + 1); | 115 | printk("test %u:\n", i + 1); | 
| 117 | memset(result, 0, 64); | 116 | memset(result, 0, 64); | 
| 118 | 117 | ||
| 119 | p = hash_tv[i].plaintext; | 118 | sg_set_buf(&sg[0], hash_tv[i].plaintext, hash_tv[i].psize); | 
| 120 | sg[0].page = virt_to_page(p); | ||
| 121 | sg[0].offset = offset_in_page(p); | ||
| 122 | sg[0].length = hash_tv[i].psize; | ||
| 123 | 119 | ||
| 124 | crypto_digest_init(tfm); | 120 | crypto_digest_init(tfm); | 
| 125 | if (tfm->crt_u.digest.dit_setkey) { | 121 | if (tfm->crt_u.digest.dit_setkey) { | 
| @@ -154,10 +150,8 @@ static void test_hash(char *algo, struct hash_testvec *template, | |||
| 154 | hash_tv[i].plaintext + temp, | 150 | hash_tv[i].plaintext + temp, | 
| 155 | hash_tv[i].tap[k]); | 151 | hash_tv[i].tap[k]); | 
| 156 | temp += hash_tv[i].tap[k]; | 152 | temp += hash_tv[i].tap[k]; | 
| 157 | p = &xbuf[IDX[k]]; | 153 | sg_set_buf(&sg[k], &xbuf[IDX[k]], | 
| 158 | sg[k].page = virt_to_page(p); | 154 | hash_tv[i].tap[k]); | 
| 159 | sg[k].offset = offset_in_page(p); | ||
| 160 | sg[k].length = hash_tv[i].tap[k]; | ||
| 161 | } | 155 | } | 
| 162 | 156 | ||
| 163 | crypto_digest_digest(tfm, sg, hash_tv[i].np, result); | 157 | crypto_digest_digest(tfm, sg, hash_tv[i].np, result); | 
| @@ -179,7 +173,6 @@ static void test_hash(char *algo, struct hash_testvec *template, | |||
| 179 | static void test_hmac(char *algo, struct hmac_testvec *template, | 173 | static void test_hmac(char *algo, struct hmac_testvec *template, | 
| 180 | unsigned int tcount) | 174 | unsigned int tcount) | 
| 181 | { | 175 | { | 
| 182 | char *p; | ||
| 183 | unsigned int i, j, k, temp; | 176 | unsigned int i, j, k, temp; | 
| 184 | struct scatterlist sg[8]; | 177 | struct scatterlist sg[8]; | 
| 185 | char result[64]; | 178 | char result[64]; | 
| @@ -210,11 +203,8 @@ static void test_hmac(char *algo, struct hmac_testvec *template, | |||
| 210 | printk("test %u:\n", i + 1); | 203 | printk("test %u:\n", i + 1); | 
| 211 | memset(result, 0, sizeof (result)); | 204 | memset(result, 0, sizeof (result)); | 
| 212 | 205 | ||
| 213 | p = hmac_tv[i].plaintext; | ||
| 214 | klen = hmac_tv[i].ksize; | 206 | klen = hmac_tv[i].ksize; | 
| 215 | sg[0].page = virt_to_page(p); | 207 | sg_set_buf(&sg[0], hmac_tv[i].plaintext, hmac_tv[i].psize); | 
| 216 | sg[0].offset = offset_in_page(p); | ||
| 217 | sg[0].length = hmac_tv[i].psize; | ||
| 218 | 208 | ||
| 219 | crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result); | 209 | crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, 1, result); | 
| 220 | 210 | ||
| @@ -243,10 +233,8 @@ static void test_hmac(char *algo, struct hmac_testvec *template, | |||
| 243 | hmac_tv[i].plaintext + temp, | 233 | hmac_tv[i].plaintext + temp, | 
| 244 | hmac_tv[i].tap[k]); | 234 | hmac_tv[i].tap[k]); | 
| 245 | temp += hmac_tv[i].tap[k]; | 235 | temp += hmac_tv[i].tap[k]; | 
| 246 | p = &xbuf[IDX[k]]; | 236 | sg_set_buf(&sg[k], &xbuf[IDX[k]], | 
| 247 | sg[k].page = virt_to_page(p); | 237 | hmac_tv[i].tap[k]); | 
| 248 | sg[k].offset = offset_in_page(p); | ||
| 249 | sg[k].length = hmac_tv[i].tap[k]; | ||
| 250 | } | 238 | } | 
| 251 | 239 | ||
| 252 | crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, | 240 | crypto_hmac(tfm, hmac_tv[i].key, &klen, sg, | 
| @@ -270,7 +258,7 @@ static void test_cipher(char *algo, int mode, int enc, | |||
| 270 | { | 258 | { | 
| 271 | unsigned int ret, i, j, k, temp; | 259 | unsigned int ret, i, j, k, temp; | 
| 272 | unsigned int tsize; | 260 | unsigned int tsize; | 
| 273 | char *p, *q; | 261 | char *q; | 
| 274 | struct crypto_tfm *tfm; | 262 | struct crypto_tfm *tfm; | 
| 275 | char *key; | 263 | char *key; | 
| 276 | struct cipher_testvec *cipher_tv; | 264 | struct cipher_testvec *cipher_tv; | 
| @@ -330,10 +318,8 @@ static void test_cipher(char *algo, int mode, int enc, | |||
| 330 | goto out; | 318 | goto out; | 
| 331 | } | 319 | } | 
| 332 | 320 | ||
| 333 | p = cipher_tv[i].input; | 321 | sg_set_buf(&sg[0], cipher_tv[i].input, | 
| 334 | sg[0].page = virt_to_page(p); | 322 | cipher_tv[i].ilen); | 
| 335 | sg[0].offset = offset_in_page(p); | ||
| 336 | sg[0].length = cipher_tv[i].ilen; | ||
| 337 | 323 | ||
| 338 | if (!mode) { | 324 | if (!mode) { | 
| 339 | crypto_cipher_set_iv(tfm, cipher_tv[i].iv, | 325 | crypto_cipher_set_iv(tfm, cipher_tv[i].iv, | 
| @@ -389,10 +375,8 @@ static void test_cipher(char *algo, int mode, int enc, | |||
| 389 | cipher_tv[i].input + temp, | 375 | cipher_tv[i].input + temp, | 
| 390 | cipher_tv[i].tap[k]); | 376 | cipher_tv[i].tap[k]); | 
| 391 | temp += cipher_tv[i].tap[k]; | 377 | temp += cipher_tv[i].tap[k]; | 
| 392 | p = &xbuf[IDX[k]]; | 378 | sg_set_buf(&sg[k], &xbuf[IDX[k]], | 
| 393 | sg[k].page = virt_to_page(p); | 379 | cipher_tv[i].tap[k]); | 
| 394 | sg[k].offset = offset_in_page(p); | ||
| 395 | sg[k].length = cipher_tv[i].tap[k]; | ||
| 396 | } | 380 | } | 
| 397 | 381 | ||
| 398 | if (!mode) { | 382 | if (!mode) { | 
| @@ -431,14 +415,12 @@ out: | |||
| 431 | static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p, | 415 | static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p, | 
| 432 | int blen, int sec) | 416 | int blen, int sec) | 
| 433 | { | 417 | { | 
| 434 | struct scatterlist sg[8]; | 418 | struct scatterlist sg[1]; | 
| 435 | unsigned long start, end; | 419 | unsigned long start, end; | 
| 436 | int bcount; | 420 | int bcount; | 
| 437 | int ret; | 421 | int ret; | 
| 438 | 422 | ||
| 439 | sg[0].page = virt_to_page(p); | 423 | sg_set_buf(sg, p, blen); | 
| 440 | sg[0].offset = offset_in_page(p); | ||
| 441 | sg[0].length = blen; | ||
| 442 | 424 | ||
| 443 | for (start = jiffies, end = start + sec * HZ, bcount = 0; | 425 | for (start = jiffies, end = start + sec * HZ, bcount = 0; | 
| 444 | time_before(jiffies, end); bcount++) { | 426 | time_before(jiffies, end); bcount++) { | 
| @@ -459,14 +441,12 @@ static int test_cipher_jiffies(struct crypto_tfm *tfm, int enc, char *p, | |||
| 459 | static int test_cipher_cycles(struct crypto_tfm *tfm, int enc, char *p, | 441 | static int test_cipher_cycles(struct crypto_tfm *tfm, int enc, char *p, | 
| 460 | int blen) | 442 | int blen) | 
| 461 | { | 443 | { | 
| 462 | struct scatterlist sg[8]; | 444 | struct scatterlist sg[1]; | 
| 463 | unsigned long cycles = 0; | 445 | unsigned long cycles = 0; | 
| 464 | int ret = 0; | 446 | int ret = 0; | 
| 465 | int i; | 447 | int i; | 
| 466 | 448 | ||
| 467 | sg[0].page = virt_to_page(p); | 449 | sg_set_buf(sg, p, blen); | 
| 468 | sg[0].offset = offset_in_page(p); | ||
| 469 | sg[0].length = blen; | ||
| 470 | 450 | ||
| 471 | local_bh_disable(); | 451 | local_bh_disable(); | 
| 472 | local_irq_disable(); | 452 | local_irq_disable(); | 
| @@ -709,9 +689,7 @@ static void test_crc32c(void) | |||
| 709 | for (i = 0; i < NUMVEC; i++) { | 689 | for (i = 0; i < NUMVEC; i++) { | 
| 710 | for (j = 0; j < VECSIZE; j++) | 690 | for (j = 0; j < VECSIZE; j++) | 
| 711 | test_vec[i][j] = ++b; | 691 | test_vec[i][j] = ++b; | 
| 712 | sg[i].page = virt_to_page(test_vec[i]); | 692 | sg_set_buf(&sg[i], test_vec[i], VECSIZE); | 
| 713 | sg[i].offset = offset_in_page(test_vec[i]); | ||
| 714 | sg[i].length = VECSIZE; | ||
| 715 | } | 693 | } | 
| 716 | 694 | ||
| 717 | seed = SEEDTESTVAL; | 695 | seed = SEEDTESTVAL; | 
| diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 28c1a628621f..cf6631056683 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <linux/crypto.h> | 15 | #include <linux/crypto.h> | 
| 16 | #include <linux/workqueue.h> | 16 | #include <linux/workqueue.h> | 
| 17 | #include <asm/atomic.h> | 17 | #include <asm/atomic.h> | 
| 18 | #include <asm/scatterlist.h> | 18 | #include <linux/scatterlist.h> | 
| 19 | #include <asm/page.h> | 19 | #include <asm/page.h> | 
| 20 | 20 | ||
| 21 | #include "dm.h" | 21 | #include "dm.h" | 
| @@ -164,9 +164,7 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, struct dm_target *ti, | |||
| 164 | return -ENOMEM; | 164 | return -ENOMEM; | 
| 165 | } | 165 | } | 
| 166 | 166 | ||
| 167 | sg.page = virt_to_page(cc->key); | 167 | sg_set_buf(&sg, cc->key, cc->key_size); | 
| 168 | sg.offset = offset_in_page(cc->key); | ||
| 169 | sg.length = cc->key_size; | ||
| 170 | crypto_digest_digest(hash_tfm, &sg, 1, salt); | 168 | crypto_digest_digest(hash_tfm, &sg, 1, salt); | 
| 171 | crypto_free_tfm(hash_tfm); | 169 | crypto_free_tfm(hash_tfm); | 
| 172 | 170 | ||
| @@ -207,14 +205,12 @@ static void crypt_iv_essiv_dtr(struct crypt_config *cc) | |||
| 207 | 205 | ||
| 208 | static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | 206 | static int crypt_iv_essiv_gen(struct crypt_config *cc, u8 *iv, sector_t sector) | 
| 209 | { | 207 | { | 
| 210 | struct scatterlist sg = { NULL, }; | 208 | struct scatterlist sg; | 
| 211 | 209 | ||
| 212 | memset(iv, 0, cc->iv_size); | 210 | memset(iv, 0, cc->iv_size); | 
| 213 | *(u64 *)iv = cpu_to_le64(sector); | 211 | *(u64 *)iv = cpu_to_le64(sector); | 
| 214 | 212 | ||
| 215 | sg.page = virt_to_page(iv); | 213 | sg_set_buf(&sg, iv, cc->iv_size); | 
| 216 | sg.offset = offset_in_page(iv); | ||
| 217 | sg.length = cc->iv_size; | ||
| 218 | crypto_cipher_encrypt((struct crypto_tfm *)cc->iv_gen_private, | 214 | crypto_cipher_encrypt((struct crypto_tfm *)cc->iv_gen_private, | 
| 219 | &sg, &sg, cc->iv_size); | 215 | &sg, &sg, cc->iv_size); | 
| 220 | 216 | ||
| diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 4c11699bad91..750c0167539c 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> | 
| 36 | #include <linux/in.h> | 36 | #include <linux/in.h> | 
| 37 | #include <linux/bitops.h> | 37 | #include <linux/bitops.h> | 
| 38 | #include <linux/scatterlist.h> | ||
| 38 | #include <asm/io.h> | 39 | #include <asm/io.h> | 
| 39 | #include <asm/system.h> | 40 | #include <asm/system.h> | 
| 40 | 41 | ||
| @@ -1590,11 +1591,9 @@ static void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen, struct | |||
| 1590 | aes_counter[12] = (u8)(counter >> 24); | 1591 | aes_counter[12] = (u8)(counter >> 24); | 
| 1591 | counter++; | 1592 | counter++; | 
| 1592 | memcpy (plain, aes_counter, 16); | 1593 | memcpy (plain, aes_counter, 16); | 
| 1593 | sg[0].page = virt_to_page(plain); | 1594 | sg_set_buf(sg, plain, 16); | 
| 1594 | sg[0].offset = ((long) plain & ~PAGE_MASK); | ||
| 1595 | sg[0].length = 16; | ||
| 1596 | crypto_cipher_encrypt(tfm, sg, sg, 16); | 1595 | crypto_cipher_encrypt(tfm, sg, sg, 16); | 
| 1597 | cipher = kmap(sg[0].page) + sg[0].offset; | 1596 | cipher = kmap(sg->page) + sg->offset; | 
| 1598 | for (j=0; (j<16) && (i< (sizeof(context->coeff)/sizeof(context->coeff[0]))); ) { | 1597 | for (j=0; (j<16) && (i< (sizeof(context->coeff)/sizeof(context->coeff[0]))); ) { | 
| 1599 | context->coeff[i++] = ntohl(*(u32 *)&cipher[j]); | 1598 | context->coeff[i++] = ntohl(*(u32 *)&cipher[j]); | 
| 1600 | j += 4; | 1599 | j += 4; | 
| diff --git a/drivers/scsi/arm/scsi.h b/drivers/scsi/arm/scsi.h index 48e1c4d9738b..19937640e2e7 100644 --- a/drivers/scsi/arm/scsi.h +++ b/drivers/scsi/arm/scsi.h | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | * Commonly used scsi driver functions. | 10 | * Commonly used scsi driver functions. | 
| 11 | */ | 11 | */ | 
| 12 | 12 | ||
| 13 | #include <linux/scatterlist.h> | ||
| 14 | |||
| 13 | #define BELT_AND_BRACES | 15 | #define BELT_AND_BRACES | 
| 14 | 16 | ||
| 15 | /* | 17 | /* | 
| @@ -22,9 +24,7 @@ static inline int copy_SCp_to_sg(struct scatterlist *sg, Scsi_Pointer *SCp, int | |||
| 22 | 24 | ||
| 23 | BUG_ON(bufs + 1 > max); | 25 | BUG_ON(bufs + 1 > max); | 
| 24 | 26 | ||
| 25 | sg->page = virt_to_page(SCp->ptr); | 27 | sg_set_buf(sg, SCp->ptr, SCp->this_residual); | 
| 26 | sg->offset = offset_in_page(SCp->ptr); | ||
| 27 | sg->length = SCp->this_residual; | ||
| 28 | 28 | ||
| 29 | if (bufs) | 29 | if (bufs) | 
| 30 | memcpy(sg + 1, SCp->buffer + 1, | 30 | memcpy(sg + 1, SCp->buffer + 1, | 
| diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index b1b1c6f01419..5ca97605ff35 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/suspend.h> | 49 | #include <linux/suspend.h> | 
| 50 | #include <linux/workqueue.h> | 50 | #include <linux/workqueue.h> | 
| 51 | #include <linux/jiffies.h> | 51 | #include <linux/jiffies.h> | 
| 52 | #include <linux/scatterlist.h> | ||
| 52 | #include <scsi/scsi.h> | 53 | #include <scsi/scsi.h> | 
| 53 | #include "scsi.h" | 54 | #include "scsi.h" | 
| 54 | #include "scsi_priv.h" | 55 | #include "scsi_priv.h" | 
| @@ -2576,19 +2577,12 @@ void ata_qc_prep(struct ata_queued_cmd *qc) | |||
| 2576 | 2577 | ||
| 2577 | void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) | 2578 | void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) | 
| 2578 | { | 2579 | { | 
| 2579 | struct scatterlist *sg; | ||
| 2580 | |||
| 2581 | qc->flags |= ATA_QCFLAG_SINGLE; | 2580 | qc->flags |= ATA_QCFLAG_SINGLE; | 
| 2582 | 2581 | ||
| 2583 | memset(&qc->sgent, 0, sizeof(qc->sgent)); | ||
| 2584 | qc->sg = &qc->sgent; | 2582 | qc->sg = &qc->sgent; | 
| 2585 | qc->n_elem = 1; | 2583 | qc->n_elem = 1; | 
| 2586 | qc->buf_virt = buf; | 2584 | qc->buf_virt = buf; | 
| 2587 | 2585 | sg_init_one(qc->sg, buf, buflen); | |
| 2588 | sg = qc->sg; | ||
| 2589 | sg->page = virt_to_page(buf); | ||
| 2590 | sg->offset = (unsigned long) buf & ~PAGE_MASK; | ||
| 2591 | sg->length = buflen; | ||
| 2592 | } | 2586 | } | 
| 2593 | 2587 | ||
| 2594 | /** | 2588 | /** | 
| diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 2d30b46806bf..d86d5c26061d 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -49,6 +49,7 @@ static int sg_version_num = 30533; /* 2 digits for each component */ | |||
| 49 | #include <linux/seq_file.h> | 49 | #include <linux/seq_file.h> | 
| 50 | #include <linux/blkdev.h> | 50 | #include <linux/blkdev.h> | 
| 51 | #include <linux/delay.h> | 51 | #include <linux/delay.h> | 
| 52 | #include <linux/scatterlist.h> | ||
| 52 | 53 | ||
| 53 | #include "scsi.h" | 54 | #include "scsi.h" | 
| 54 | #include <scsi/scsi_dbg.h> | 55 | #include <scsi/scsi_dbg.h> | 
| @@ -1996,9 +1997,7 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) | |||
| 1996 | if (!p) | 1997 | if (!p) | 
| 1997 | break; | 1998 | break; | 
| 1998 | } | 1999 | } | 
| 1999 | sclp->page = virt_to_page(p); | 2000 | sg_set_buf(sclp, p, ret_sz); | 
| 2000 | sclp->offset = offset_in_page(p); | ||
| 2001 | sclp->length = ret_sz; | ||
| 2002 | 2001 | ||
| 2003 | SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n", | 2002 | SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n", | 
| 2004 | k, sg_scatg2virt(sclp), ret_sz)); | 2003 | k, sg_scatg2virt(sclp), ret_sz)); | 
| diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 90a96257d6ce..2997f558159b 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> | 
| 10 | #include <linux/module.h> | 10 | #include <linux/module.h> | 
| 11 | #include <linux/moduleparam.h> | 11 | #include <linux/moduleparam.h> | 
| 12 | #include <asm/scatterlist.h> | 12 | #include <linux/scatterlist.h> | 
| 13 | 13 | ||
| 14 | #include <linux/usb.h> | 14 | #include <linux/usb.h> | 
| 15 | 15 | ||
| @@ -381,7 +381,6 @@ alloc_sglist (int nents, int max, int vary) | |||
| 381 | sg = kmalloc (nents * sizeof *sg, SLAB_KERNEL); | 381 | sg = kmalloc (nents * sizeof *sg, SLAB_KERNEL); | 
| 382 | if (!sg) | 382 | if (!sg) | 
| 383 | return NULL; | 383 | return NULL; | 
| 384 | memset (sg, 0, nents * sizeof *sg); | ||
| 385 | 384 | ||
| 386 | for (i = 0; i < nents; i++) { | 385 | for (i = 0; i < nents; i++) { | 
| 387 | char *buf; | 386 | char *buf; | 
| @@ -394,9 +393,7 @@ alloc_sglist (int nents, int max, int vary) | |||
| 394 | memset (buf, 0, size); | 393 | memset (buf, 0, size); | 
| 395 | 394 | ||
| 396 | /* kmalloc pages are always physically contiguous! */ | 395 | /* kmalloc pages are always physically contiguous! */ | 
| 397 | sg [i].page = virt_to_page (buf); | 396 | sg_init_one(&sg[i], buf, size); | 
| 398 | sg [i].offset = offset_in_page (buf); | ||
| 399 | sg [i].length = size; | ||
| 400 | 397 | ||
| 401 | if (vary) { | 398 | if (vary) { | 
| 402 | size += vary; | 399 | size += vary; | 
| diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 7f717e95ae37..66ff545552f7 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h | |||
| @@ -1,14 +1,23 @@ | |||
| 1 | #ifndef _LINUX_SCATTERLIST_H | 1 | #ifndef _LINUX_SCATTERLIST_H | 
| 2 | #define _LINUX_SCATTERLIST_H | 2 | #define _LINUX_SCATTERLIST_H | 
| 3 | 3 | ||
| 4 | static inline void sg_init_one(struct scatterlist *sg, | 4 | #include <asm/scatterlist.h> | 
| 5 | u8 *buf, unsigned int buflen) | 5 | #include <linux/mm.h> | 
| 6 | { | 6 | #include <linux/string.h> | 
| 7 | memset(sg, 0, sizeof(*sg)); | ||
| 8 | 7 | ||
| 8 | static inline void sg_set_buf(struct scatterlist *sg, void *buf, | ||
| 9 | unsigned int buflen) | ||
| 10 | { | ||
| 9 | sg->page = virt_to_page(buf); | 11 | sg->page = virt_to_page(buf); | 
| 10 | sg->offset = offset_in_page(buf); | 12 | sg->offset = offset_in_page(buf); | 
| 11 | sg->length = buflen; | 13 | sg->length = buflen; | 
| 12 | } | 14 | } | 
| 13 | 15 | ||
| 16 | static inline void sg_init_one(struct scatterlist *sg, void *buf, | ||
| 17 | unsigned int buflen) | ||
| 18 | { | ||
| 19 | memset(sg, 0, sizeof(*sg)); | ||
| 20 | sg_set_buf(sg, buf, buflen); | ||
| 21 | } | ||
| 22 | |||
| 14 | #endif /* _LINUX_SCATTERLIST_H */ | 23 | #endif /* _LINUX_SCATTERLIST_H */ | 
| diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a970b4727ce8..41edc14851e8 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -75,7 +75,7 @@ | |||
| 75 | #ifdef CONFIG_IPV6_PRIVACY | 75 | #ifdef CONFIG_IPV6_PRIVACY | 
| 76 | #include <linux/random.h> | 76 | #include <linux/random.h> | 
| 77 | #include <linux/crypto.h> | 77 | #include <linux/crypto.h> | 
| 78 | #include <asm/scatterlist.h> | 78 | #include <linux/scatterlist.h> | 
| 79 | #endif | 79 | #endif | 
| 80 | 80 | ||
| 81 | #include <asm/uaccess.h> | 81 | #include <asm/uaccess.h> | 
| @@ -1217,12 +1217,8 @@ static int __ipv6_regen_rndid(struct inet6_dev *idev) | |||
| 1217 | struct net_device *dev; | 1217 | struct net_device *dev; | 
| 1218 | struct scatterlist sg[2]; | 1218 | struct scatterlist sg[2]; | 
| 1219 | 1219 | ||
| 1220 | sg[0].page = virt_to_page(idev->entropy); | 1220 | sg_set_buf(&sg[0], idev->entropy, 8); | 
| 1221 | sg[0].offset = offset_in_page(idev->entropy); | 1221 | sg_set_buf(&sg[1], idev->work_eui64, 8); | 
| 1222 | sg[0].length = 8; | ||
| 1223 | sg[1].page = virt_to_page(idev->work_eui64); | ||
| 1224 | sg[1].offset = offset_in_page(idev->work_eui64); | ||
| 1225 | sg[1].length = 8; | ||
| 1226 | 1222 | ||
| 1227 | dev = idev->dev; | 1223 | dev = idev->dev; | 
| 1228 | 1224 | ||
| diff --git a/net/sunrpc/auth_gss/gss_krb5_crypto.c b/net/sunrpc/auth_gss/gss_krb5_crypto.c index 3f3d5437f02d..97c981fa6b8e 100644 --- a/net/sunrpc/auth_gss/gss_krb5_crypto.c +++ b/net/sunrpc/auth_gss/gss_krb5_crypto.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | #include <linux/types.h> | 37 | #include <linux/types.h> | 
| 38 | #include <linux/mm.h> | 38 | #include <linux/mm.h> | 
| 39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> | 
| 40 | #include <asm/scatterlist.h> | 40 | #include <linux/scatterlist.h> | 
| 41 | #include <linux/crypto.h> | 41 | #include <linux/crypto.h> | 
| 42 | #include <linux/highmem.h> | 42 | #include <linux/highmem.h> | 
| 43 | #include <linux/pagemap.h> | 43 | #include <linux/pagemap.h> | 
| @@ -75,9 +75,7 @@ krb5_encrypt( | |||
| 75 | memcpy(local_iv, iv, crypto_tfm_alg_ivsize(tfm)); | 75 | memcpy(local_iv, iv, crypto_tfm_alg_ivsize(tfm)); | 
| 76 | 76 | ||
| 77 | memcpy(out, in, length); | 77 | memcpy(out, in, length); | 
| 78 | sg[0].page = virt_to_page(out); | 78 | sg_set_buf(sg, out, length); | 
| 79 | sg[0].offset = offset_in_page(out); | ||
| 80 | sg[0].length = length; | ||
| 81 | 79 | ||
| 82 | ret = crypto_cipher_encrypt_iv(tfm, sg, sg, length, local_iv); | 80 | ret = crypto_cipher_encrypt_iv(tfm, sg, sg, length, local_iv); | 
| 83 | 81 | ||
| @@ -117,9 +115,7 @@ krb5_decrypt( | |||
| 117 | memcpy(local_iv,iv, crypto_tfm_alg_ivsize(tfm)); | 115 | memcpy(local_iv,iv, crypto_tfm_alg_ivsize(tfm)); | 
| 118 | 116 | ||
| 119 | memcpy(out, in, length); | 117 | memcpy(out, in, length); | 
| 120 | sg[0].page = virt_to_page(out); | 118 | sg_set_buf(sg, out, length); | 
| 121 | sg[0].offset = offset_in_page(out); | ||
| 122 | sg[0].length = length; | ||
| 123 | 119 | ||
| 124 | ret = crypto_cipher_decrypt_iv(tfm, sg, sg, length, local_iv); | 120 | ret = crypto_cipher_decrypt_iv(tfm, sg, sg, length, local_iv); | 
| 125 | 121 | ||
| @@ -132,13 +128,6 @@ out: | |||
| 132 | 128 | ||
| 133 | EXPORT_SYMBOL(krb5_decrypt); | 129 | EXPORT_SYMBOL(krb5_decrypt); | 
| 134 | 130 | ||
| 135 | static void | ||
| 136 | buf_to_sg(struct scatterlist *sg, char *ptr, int len) { | ||
| 137 | sg->page = virt_to_page(ptr); | ||
| 138 | sg->offset = offset_in_page(ptr); | ||
| 139 | sg->length = len; | ||
| 140 | } | ||
| 141 | |||
| 142 | static int | 131 | static int | 
| 143 | process_xdr_buf(struct xdr_buf *buf, int offset, int len, | 132 | process_xdr_buf(struct xdr_buf *buf, int offset, int len, | 
| 144 | int (*actor)(struct scatterlist *, void *), void *data) | 133 | int (*actor)(struct scatterlist *, void *), void *data) | 
| @@ -152,7 +141,7 @@ process_xdr_buf(struct xdr_buf *buf, int offset, int len, | |||
| 152 | thislen = buf->head[0].iov_len - offset; | 141 | thislen = buf->head[0].iov_len - offset; | 
| 153 | if (thislen > len) | 142 | if (thislen > len) | 
| 154 | thislen = len; | 143 | thislen = len; | 
| 155 | buf_to_sg(sg, buf->head[0].iov_base + offset, thislen); | 144 | sg_set_buf(sg, buf->head[0].iov_base + offset, thislen); | 
| 156 | ret = actor(sg, data); | 145 | ret = actor(sg, data); | 
| 157 | if (ret) | 146 | if (ret) | 
| 158 | goto out; | 147 | goto out; | 
| @@ -195,7 +184,7 @@ process_xdr_buf(struct xdr_buf *buf, int offset, int len, | |||
| 195 | thislen = buf->tail[0].iov_len - offset; | 184 | thislen = buf->tail[0].iov_len - offset; | 
| 196 | if (thislen > len) | 185 | if (thislen > len) | 
| 197 | thislen = len; | 186 | thislen = len; | 
| 198 | buf_to_sg(sg, buf->tail[0].iov_base + offset, thislen); | 187 | sg_set_buf(sg, buf->tail[0].iov_base + offset, thislen); | 
| 199 | ret = actor(sg, data); | 188 | ret = actor(sg, data); | 
| 200 | len -= thislen; | 189 | len -= thislen; | 
| 201 | } | 190 | } | 
| @@ -241,7 +230,7 @@ make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body, | |||
| 241 | goto out; | 230 | goto out; | 
| 242 | 231 | ||
| 243 | crypto_digest_init(tfm); | 232 | crypto_digest_init(tfm); | 
| 244 | buf_to_sg(sg, header, hdrlen); | 233 | sg_set_buf(sg, header, hdrlen); | 
| 245 | crypto_digest_update(tfm, sg, 1); | 234 | crypto_digest_update(tfm, sg, 1); | 
| 246 | process_xdr_buf(body, body_offset, body->len - body_offset, | 235 | process_xdr_buf(body, body_offset, body->len - body_offset, | 
| 247 | checksummer, tfm); | 236 | checksummer, tfm); | 
