diff options
31 files changed, 98 insertions, 161 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index de5ba479c22..b01dee3ae7f 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c @@ -1366,9 +1366,7 @@ new_segment:  				sg = sg_next(sg);  			} -			sg_set_page(sg, bvec->bv_page); -			sg->length = nbytes; -			sg->offset = bvec->bv_offset; +			sg_set_page(sg, bvec->bv_page, nbytes, bvec->bv_offset);  			nsegs++;  		}  		bvprv = bvec; diff --git a/crypto/hmac.c b/crypto/hmac.c index e4eb6ac53b5..6691981bda1 100644 --- a/crypto/hmac.c +++ b/crypto/hmac.c @@ -160,8 +160,7 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg,  	sg_set_buf(sg1, ipad, bs); -	sg_set_page(&sg[1], (void *) sg); -	sg1[1].length = 0; +	sg_set_page(&sg[1], (void *) sg, 0, 0);  	sg_set_buf(sg2, opad, bs + ds);  	err = crypto_hash_digest(&desc, sg1, nbytes + bs, digest); diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 2d147b51c97..b5f7c591306 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -4689,8 +4689,8 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)  		 * data in this function or read data in ata_sg_clean.  		 */  		offset = lsg->offset + lsg->length - qc->pad_len; -		sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT)); -		psg->offset = offset_in_page(offset); +		sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT), +				qc->pad_len, offset_in_page(offset));  		if (qc->tf.flags & ATA_TFLAG_WRITE) {  			void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); diff --git a/drivers/block/cryptoloop.c b/drivers/block/cryptoloop.c index 1b58b010797..241167878ed 100644 --- a/drivers/block/cryptoloop.c +++ b/drivers/block/cryptoloop.c @@ -150,13 +150,8 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,  		u32 iv[4] = { 0, };  		iv[0] = cpu_to_le32(IV & 0xffffffff); -		sg_set_page(&sg_in, in_page); -		sg_in.offset = in_offs; -		sg_in.length = sz; - -		sg_set_page(&sg_out, out_page); -		sg_out.offset = out_offs; -		sg_out.length = sz; +		sg_set_page(&sg_in, in_page, sz, in_offs); +		sg_set_page(&sg_out, out_page, sz, out_offs);  		desc.info = iv;  		err = encdecfunc(&desc, &sg_out, &sg_in, sz); diff --git a/drivers/block/ub.c b/drivers/block/ub.c index 14143f2c484..5e740e14ab3 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c @@ -1428,9 +1428,8 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)  	scmd->state = UB_CMDST_INIT;  	scmd->nsg = 1;  	sg = &scmd->sgv[0]; -	sg_set_page(sg, virt_to_page(sc->top_sense)); -	sg->offset = (unsigned long)sc->top_sense & (PAGE_SIZE-1); -	sg->length = UB_SENSE_SIZE; +	sg_set_page(sg, virt_to_page(sc->top_sense), UB_SENSE_SIZE, +			(unsigned long)sc->top_sense & (PAGE_SIZE-1));  	scmd->len = UB_SENSE_SIZE;  	scmd->lun = cmd->lun;  	scmd->done = ub_top_sense_done; @@ -1864,9 +1863,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,  	cmd->state = UB_CMDST_INIT;  	cmd->nsg = 1;  	sg = &cmd->sgv[0]; -	sg_set_page(sg, virt_to_page(p)); -	sg->offset = (unsigned long)p & (PAGE_SIZE-1); -	sg->length = 8; +	sg_set_page(sg, virt_to_page(p), 8, (unsigned long)p & (PAGE_SIZE-1));  	cmd->len = 8;  	cmd->lun = lun;  	cmd->done = ub_probe_done; diff --git a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c index 3051e312fdc..f5f4983dfbf 100644 --- a/drivers/ieee1394/dma.c +++ b/drivers/ieee1394/dma.c @@ -111,8 +111,8 @@ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes,  		unsigned long va =  		    (unsigned long)dma->kvirt + (i << PAGE_SHIFT); -		sg_set_page(&dma->sglist[i], vmalloc_to_page((void *)va)); -		dma->sglist[i].length = PAGE_SIZE; +		sg_set_page(&dma->sglist[i], vmalloc_to_page((void *)va), +				PAGE_SIZE, 0);  	}  	/* map sglist to the IOMMU */ diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 14159ff2940..4e3128ff73c 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c @@ -171,9 +171,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,  				if (vma_list &&  				    !is_vm_hugetlb_page(vma_list[i + off]))  					umem->hugetlb = 0; -				sg_set_page(&chunk->page_list[i], page_list[i + off]); -				chunk->page_list[i].offset = 0; -				chunk->page_list[i].length = PAGE_SIZE; +				sg_set_page(&chunk->page_list[i], page_list[i + off], PAGE_SIZE, 0);  			}  			chunk->nmap = ib_dma_map_sg(context->device, diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c index 007b38157fc..1f4d27d7c16 100644 --- a/drivers/infiniband/hw/mthca/mthca_memfree.c +++ b/drivers/infiniband/hw/mthca/mthca_memfree.c @@ -113,9 +113,7 @@ static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_m  	if (!page)  		return -ENOMEM; -	sg_set_page(mem, page); -	mem->length = PAGE_SIZE << order; -	mem->offset = 0; +	sg_set_page(mem, page, PAGE_SIZE << order, 0);  	return 0;  } @@ -481,9 +479,8 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar,  	if (ret < 0)  		goto out; -	sg_set_page(&db_tab->page[i].mem, pages[0]); -	db_tab->page[i].mem.length = MTHCA_ICM_PAGE_SIZE; -	db_tab->page[i].mem.offset = uaddr & ~PAGE_MASK; +	sg_set_page(&db_tab->page[i].mem, pages[0], MTHCA_ICM_PAGE_SIZE, +			uaddr & ~PAGE_MASK);  	ret = pci_map_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE);  	if (ret < 0) { diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index ac54f697c50..1c159ac68c9 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -351,14 +351,10 @@ static int crypt_convert(struct crypt_config *cc,  		struct scatterlist sg_in, sg_out;  		sg_init_table(&sg_in, 1); -		sg_set_page(&sg_in, bv_in->bv_page); -		sg_in.offset = bv_in->bv_offset + ctx->offset_in; -		sg_in.length = 1 << SECTOR_SHIFT; +		sg_set_page(&sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT, bv_in->bv_offset + ctx->offset_in);  		sg_init_table(&sg_out, 1); -		sg_set_page(&sg_out, bv_out->bv_page); -		sg_out.offset = bv_out->bv_offset + ctx->offset_out; -		sg_out.length = 1 << SECTOR_SHIFT; +		sg_set_page(&sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT, bv_out->bv_offset + ctx->offset_out);  		ctx->offset_in += sg_in.length;  		if (ctx->offset_in >= bv_in->bv_len) { diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c index 2b1f8b4be00..cb034ead95a 100644 --- a/drivers/media/common/saa7146_core.c +++ b/drivers/media/common/saa7146_core.c @@ -118,8 +118,7 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)  		if (NULL == pg)  			goto err;  		BUG_ON(PageHighMem(pg)); -		sg_set_page(&sglist[i], pg); -		sglist[i].length = PAGE_SIZE; +		sg_set_page(&sglist[i], pg, PAGE_SIZE, 0);  	}  	return sglist; diff --git a/drivers/media/video/ivtv/ivtv-udma.c b/drivers/media/video/ivtv/ivtv-udma.c index 912b424e520..460db03b0ba 100644 --- a/drivers/media/video/ivtv/ivtv-udma.c +++ b/drivers/media/video/ivtv/ivtv-udma.c @@ -49,8 +49,6 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info  		unsigned int len = (i == dma_page->page_count - 1) ?  			dma_page->tail : PAGE_SIZE - offset; -		dma->SGlist[map_offset].length = len; -		dma->SGlist[map_offset].offset = offset;  		if (PageHighMem(dma->map[map_offset])) {  			void *src; @@ -63,10 +61,10 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info  			memcpy(page_address(dma->bouncemap[map_offset]) + offset, src, len);  			kunmap_atomic(src, KM_BOUNCE_READ);  			local_irq_restore(flags); -			sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset]); +			sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset], len, offset);  		}  		else { -			sg_set_page(&dma->SGlist[map_offset], dma->map[map_offset]); +			sg_set_page(&dma->SGlist[map_offset], dma->map[map_offset], len, offset);  		}  		offset = 0;  		map_offset++; diff --git a/drivers/media/video/videobuf-dma-sg.c b/drivers/media/video/videobuf-dma-sg.c index 9ab94a749d8..44ee408e145 100644 --- a/drivers/media/video/videobuf-dma-sg.c +++ b/drivers/media/video/videobuf-dma-sg.c @@ -67,8 +67,7 @@ videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages)  		if (NULL == pg)  			goto err;  		BUG_ON(PageHighMem(pg)); -		sg_set_page(&sglist[i], pg); -		sglist[i].length = PAGE_SIZE; +		sg_set_page(&sglist[i], pg, PAGE_SIZE, 0);  	}  	return sglist; @@ -95,16 +94,13 @@ videobuf_pages_to_sg(struct page **pages, int nr_pages, int offset)  	if (PageHighMem(pages[0]))  		/* DMA to highmem pages might not work */  		goto highmem; -	sg_set_page(&sglist[0], pages[0]); -	sglist[0].offset = offset; -	sglist[0].length = PAGE_SIZE - offset; +	sg_set_page(&sglist[0], pages[0], PAGE_SIZE - offset, offset);  	for (i = 1; i < nr_pages; i++) {  		if (NULL == pages[i])  			goto nopage;  		if (PageHighMem(pages[i]))  			goto highmem; -		sg_set_page(&sglist[i], pages[i]); -		sglist[i].length = PAGE_SIZE; +		sg_set_page(&sglist[i], pages[i], PAGE_SIZE, 0);  	}  	return sglist; diff --git a/drivers/net/mlx4/icm.c b/drivers/net/mlx4/icm.c index 887633b207d..2a5bef6388f 100644 --- a/drivers/net/mlx4/icm.c +++ b/drivers/net/mlx4/icm.c @@ -101,9 +101,7 @@ static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_ma  	if (!page)  		return -ENOMEM; -	sg_set_page(mem, page); -	mem->length = PAGE_SIZE << order; -	mem->offset = 0; +	sg_set_page(mem, page, PAGE_SIZE << order, 0);  	return 0;  } diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index d9e7be97976..00118499018 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c @@ -562,8 +562,6 @@ zfcp_sg_list_alloc(struct zfcp_sg_list *sg_list, size_t size)  	sg_init_table(sg_list->sg, sg_list->count);  	for (i = 0, sg = sg_list->sg; i < sg_list->count; i++, sg++) { -		sg->length = min(size, PAGE_SIZE); -		sg->offset = 0;  		address = (void *) get_zeroed_page(GFP_KERNEL);  		if (address == NULL) {  			sg_list->count = i; @@ -571,7 +569,7 @@ zfcp_sg_list_alloc(struct zfcp_sg_list *sg_list, size_t size)  			retval = -ENOMEM;  			goto out;  		} -		zfcp_address_to_sg(address, sg); +		zfcp_address_to_sg(address, sg, min(size, PAGE_SIZE));  		size -= sg->length;  	} @@ -1523,10 +1521,8 @@ zfcp_gid_pn_buffers_alloc(struct zfcp_gid_pn_data **gid_pn, mempool_t *pool)          data->ct.req = &data->req;          data->ct.resp = &data->resp;  	data->ct.req_count = data->ct.resp_count = 1; -	zfcp_address_to_sg(&data->ct_iu_req, &data->req); -        zfcp_address_to_sg(&data->ct_iu_resp, &data->resp); -        data->req.length = sizeof(struct ct_iu_gid_pn_req); -        data->resp.length = sizeof(struct ct_iu_gid_pn_resp); +	zfcp_address_to_sg(&data->ct_iu_req, &data->req, sizeof(struct ct_iu_gid_pn_req)); +        zfcp_address_to_sg(&data->ct_iu_resp, &data->resp, sizeof(struct ct_iu_gid_pn_resp));  	*gid_pn = data;  	return 0; diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 326e7ee232c..0754542978b 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h @@ -74,8 +74,7 @@ zfcp_sg_to_address(struct scatterlist *list)  static inline void  zfcp_address_to_sg(void *address, struct scatterlist *list)  { -	sg_set_page(list, virt_to_page(address)); -	list->offset = ((unsigned long) address) & (PAGE_SIZE - 1); +	sg_set_buf(list, address, 0);  }  #define REQUEST_LIST_SIZE 128 diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 9438d0b2879..5552b755c08 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c @@ -322,9 +322,9 @@ zfcp_erp_adisc(struct zfcp_port *port)  	if (address == NULL)  		goto nomem; -	zfcp_address_to_sg(address, send_els->req); +	zfcp_address_to_sg(address, send_els->req, sizeof(struct zfcp_ls_adisc));  	address += PAGE_SIZE >> 1; -	zfcp_address_to_sg(address, send_els->resp); +	zfcp_address_to_sg(address, send_els->resp, sizeof(struct zfcp_ls_adisc_acc));  	send_els->req_count = send_els->resp_count = 1;  	send_els->adapter = adapter; @@ -336,9 +336,6 @@ zfcp_erp_adisc(struct zfcp_port *port)  	adisc = zfcp_sg_to_address(send_els->req);  	send_els->ls_code = adisc->code = ZFCP_LS_ADISC; -	send_els->req->length = sizeof(struct zfcp_ls_adisc); -	send_els->resp->length = sizeof(struct zfcp_ls_adisc_acc); -  	/* acc. to FC-FS, hard_nport_id in ADISC should not be set for ports  	   without FC-AL-2 capability, so we don't set it */  	adisc->wwpn = fc_host_port_name(adapter->scsi_host); diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 439b97a6a26..0841df01bc1 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -2890,7 +2890,7 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len)  			return NULL;  		} -		sg_set_page(&scatterlist[i], page); +		sg_set_page(&scatterlist[i], page, 0, 0);  	}  	return sglist; diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 6ce4109efdf..097a136398c 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -79,9 +79,7 @@ static inline void  iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg)  {  	sg_init_table(&ibuf->sg, 1); -	sg_set_page(&ibuf->sg, sg_page(sg)); -	ibuf->sg.offset = sg->offset; -	ibuf->sg.length = sg->length; +	sg_set_page(&ibuf->sg, sg_page(sg), sg->length, sg->offset);  	/*  	 * Fastpath: sg element fits into single page  	 */ diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index 1c5c4b68f20..4652ad22516 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c @@ -5256,8 +5256,7 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma)  		STbuffer->sg[0].offset = 0;  		if (page != NULL) { -		    sg_set_page(&STbuffer->sg[0], page); -		    STbuffer->sg[0].length = b_size; +		    sg_set_page(&STbuffer->sg[0], page, b_size, 0);  		    STbuffer->b_data = page_address(page);  		    break;  		} @@ -5285,8 +5284,7 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma)  			normalize_buffer(STbuffer);  			return 0;  		} -		sg_set_page(&STbuffer->sg[segs], page); -		STbuffer->sg[segs].length = (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size; +		sg_set_page(&STbuffer->sg[segs], page, (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size, 0);  		got += STbuffer->sg[segs].length;  		STbuffer->buffer_size = got;  		STbuffer->sg_segs = ++segs; diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index cc197100284..b5fa4f09138 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1717,16 +1717,12 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages,  		   goto out_unlock; */          } -	sg_set_page(sgl, pages[0]); -	sgl[0].offset = uaddr & ~PAGE_MASK; +	sg_set_page(sgl, pages[0], 0, uaddr & ~PAGE_MASK);  	if (nr_pages > 1) {  		sgl[0].length = PAGE_SIZE - sgl[0].offset;  		count -= sgl[0].length; -		for (i=1; i < nr_pages ; i++) { -			sg_set_page(&sgl[i], pages[i]); -			sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; -			count -= PAGE_SIZE; -		} +		for (i=1; i < nr_pages ; i++) +			sg_set_page(&sgl[i], pages[i], count < PAGE_SIZE ? count : PAGE_SIZE, 0);  	}  	else {  		sgl[0].length = count; @@ -1854,8 +1850,7 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)  				scatter_elem_sz_prev = ret_sz;  			}  		} -		sg_set_page(sg, p); -		sg->length = (ret_sz > num) ? num : ret_sz; +		sg_set_page(sg, p, (ret_sz > num) ? num : ret_sz, 0);  		SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, "  				 "ret_sz=%d\n", k, num, ret_sz)); diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index ce69b9efc10..98dfd6ea209 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -3797,13 +3797,11 @@ static void buf_to_sg(struct st_buffer *STbp, unsigned int length)  	sg = &(STbp->sg[0]);  	frp = STbp->frp;  	for (i=count=0; count < length; i++) { -		sg_set_page(&sg[i], frp[i].page);  		if (length - count > frp[i].length) -			sg[i].length = frp[i].length; +			sg_set_page(&sg[i], frp[i].page, frp[i].length, 0);  		else -			sg[i].length = length - count; +			sg_set_page(&sg[i], frp[i].page, length - count, 0);  		count += sg[i].length; -		sg[i].offset = 0;  	}  	STbp->sg_segs = i;  	STbp->frp_sg_current = length; @@ -4446,15 +4444,13 @@ static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pa          }  	/* Populate the scatter/gather list */ -	sg_set_page(&sgl[0], pages[0]); -	sgl[0].offset = uaddr & ~PAGE_MASK; +	sg_set_page(&sgl[0], pages[0], 0, uaddr & ~PAGE_MASK);  	if (nr_pages > 1) {  		sgl[0].length = PAGE_SIZE - sgl[0].offset;  		count -= sgl[0].length;  		for (i=1; i < nr_pages ; i++) { -			sg_set_page(&sgl[i], pages[i]);; -			sgl[i].offset = 0; -			sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; +			sg_set_page(&sgl[i], pages[i], +				    count < PAGE_SIZE ? count : PAGE_SIZE, 0);;  			count -= PAGE_SIZE;  		}  	} diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 0a9882edf56..7a472b12999 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -282,10 +282,8 @@ int virt_to_scatterlist(const void *addr, int size, struct scatterlist *sg,  	while (size > 0 && i < sg_size) {  		pg = virt_to_page(addr);  		offset = offset_in_page(addr); -		if (sg) { -			sg_set_page(&sg[i], pg); -			sg[i].offset = offset; -		} +		if (sg) +			sg_set_page(&sg[i], pg, 0, offset);  		remainder_of_page = PAGE_CACHE_SIZE - offset;  		if (size >= remainder_of_page) {  			if (sg) @@ -716,12 +714,8 @@ ecryptfs_encrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat,  	sg_init_table(&src_sg, 1);  	sg_init_table(&dst_sg, 1); -	sg_set_page(&src_sg, src_page); -	src_sg.offset = src_offset; -	src_sg.length = size; -	sg_set_page(&dst_sg, dst_page); -	dst_sg.offset = dst_offset; -	dst_sg.length = size; +	sg_set_page(&src_sg, src_page, size, src_offset); +	sg_set_page(&dst_sg, dst_page, size, dst_offset);  	return encrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv);  } @@ -746,14 +740,11 @@ ecryptfs_decrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat,  	struct scatterlist src_sg, dst_sg;  	sg_init_table(&src_sg, 1); +	sg_set_page(&src_sg, src_page, size, src_offset); +  	sg_init_table(&dst_sg, 1); +	sg_set_page(&dst_sg, dst_page, size, dst_offset); -	sg_set_page(&src_sg, src_page); -	src_sg.offset = src_offset; -	src_sg.length = size; -	sg_set_page(&dst_sg, dst_page); -	dst_sg.offset = dst_offset; -	dst_sg.length = size;  	return decrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv);  } diff --git a/include/asm-frv/scatterlist.h b/include/asm-frv/scatterlist.h index 99ba76edc42..2e7143b5a7a 100644 --- a/include/asm-frv/scatterlist.h +++ b/include/asm-frv/scatterlist.h @@ -16,8 +16,7 @@   *   * can be rewritten as   * - * sg_set_page(virt_to_page(some_ptr)); - * sg->offset = (unsigned long) some_ptr & ~PAGE_MASK; + * sg_set_buf(sg, some_ptr, length);   *   * and that's it. There's no excuse for not highmem enabling YOUR driver. /jens   */ diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index df7ddcee7c4..809b2ac2e37 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -26,18 +26,16 @@  #define SG_MAGIC	0x87654321  /** - * sg_set_page - Set sg entry to point at given page - * @sg:		 SG entry - * @page:	 The page + * sg_assign_page - Assign a given page to an SG entry + * @sg:		    SG entry + * @page:	    The page   *   * Description: - *   Use this function to set an sg entry pointing at a page, never assign - *   the page directly. We encode sg table information in the lower bits - *   of the page pointer. See sg_page() for looking up the page belonging - *   to an sg entry. + *   Assign page to sg entry. Also see sg_set_page(), the most commonly used + *   variant.   *   **/ -static inline void sg_set_page(struct scatterlist *sg, struct page *page) +static inline void sg_assign_page(struct scatterlist *sg, struct page *page)  {  	unsigned long page_link = sg->page_link & 0x3; @@ -52,6 +50,28 @@ static inline void sg_set_page(struct scatterlist *sg, struct page *page)  	sg->page_link = page_link | (unsigned long) page;  } +/** + * sg_set_page - Set sg entry to point at given page + * @sg:		 SG entry + * @page:	 The page + * @len:	 Length of data + * @offset:	 Offset into page + * + * Description: + *   Use this function to set an sg entry pointing at a page, never assign + *   the page directly. We encode sg table information in the lower bits + *   of the page pointer. See sg_page() for looking up the page belonging + *   to an sg entry. + * + **/ +static inline void sg_set_page(struct scatterlist *sg, struct page *page, +			       unsigned int len, unsigned int offset) +{ +	sg_assign_page(sg, page); +	sg->offset = offset; +	sg->length = len; +} +  #define sg_page(sg)	((struct page *) ((sg)->page_link & ~0x3))  /** @@ -64,9 +84,7 @@ static inline void sg_set_page(struct scatterlist *sg, struct page *page)  static inline void sg_set_buf(struct scatterlist *sg, const void *buf,  			      unsigned int buflen)  { -	sg_set_page(sg, virt_to_page(buf)); -	sg->offset = offset_in_page(buf); -	sg->length = buflen; +	sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf));  }  /* diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 4e2c84fcf27..7b7c6c44c2d 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2045,9 +2045,7 @@ skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)  	if (copy > 0) {  		if (copy > len)  			copy = len; -		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; +		sg_set_buf(sg, skb->data + offset, copy);  		elt++;  		if ((len -= copy) == 0)  			return elt; @@ -2065,9 +2063,8 @@ skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)  			if (copy > len)  				copy = len; -			sg_set_page(&sg[elt], frag->page); -			sg[elt].offset = frag->page_offset+offset-start; -			sg[elt].length = copy; +			sg_set_page(&sg[elt], frag->page, copy, +					frag->page_offset+offset-start);  			elt++;  			if (!(len -= copy))  				return elt; diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index 74d017520a2..4cce3534e40 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c @@ -537,13 +537,8 @@ static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,  		return -1;  	}  	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_set_page(&sg[1], virt_to_page(data)); -	sg[1].offset = offset_in_page(data); -	sg[1].length = data_len; +	sg_set_buf(&sg[0], hdr, 16); +	sg_set_buf(&sg[1], data, data_len);  	if (crypto_hash_setkey(tfm_michael, key, 8))  		return -1; diff --git a/net/sctp/auth.c b/net/sctp/auth.c index cbd64b216cc..621113a109b 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c @@ -727,9 +727,7 @@ void sctp_auth_calculate_hmac(const struct sctp_association *asoc,  	/* set up scatter list */  	end = skb_tail_pointer(skb);  	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; +	sg_set_buf(&sg, auth, end - (unsigned char *)auth);  	desc.tfm = asoc->ep->auth_hmacs[hmac_id];  	desc.flags = 0; diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 658476c4d58..c055212875f 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -1514,9 +1514,7 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,  		/* Sign the message.  */  		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; +		sg_set_buf(&sg, &cookie->c, bodysize);  		keylen = SCTP_SECRET_SIZE;  		key = (char *)ep->secret_key[ep->current_key];  		desc.tfm = sctp_sk(ep->base.sk)->hmac; @@ -1587,9 +1585,7 @@ struct sctp_association *sctp_unpack_cookie(  	/* Check the signature.  */  	keylen = SCTP_SECRET_SIZE;  	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; +	sg_set_buf(&sg, bear_cookie, bodysize);  	key = (char *)ep->secret_key[ep->current_key];  	desc.tfm = sctp_sk(ep->base.sk)->hmac;  	desc.flags = 0; diff --git a/net/sunrpc/auth_gss/gss_krb5_crypto.c b/net/sunrpc/auth_gss/gss_krb5_crypto.c index 32be431affc..24711be4b2d 100644 --- a/net/sunrpc/auth_gss/gss_krb5_crypto.c +++ b/net/sunrpc/auth_gss/gss_krb5_crypto.c @@ -199,7 +199,7 @@ encryptor(struct scatterlist *sg, void *data)  	} else {  		in_page = sg_page(sg);  	} -	sg_set_page(&desc->infrags[desc->fragno], in_page); +	sg_assign_page(&desc->infrags[desc->fragno], in_page);  	desc->fragno++;  	desc->fraglen += sg->length;  	desc->pos += sg->length; @@ -215,11 +215,10 @@ encryptor(struct scatterlist *sg, void *data)  	if (ret)  		return ret;  	if (fraglen) { -		sg_set_page(&desc->outfrags[0], sg_page(sg)); -		desc->outfrags[0].offset = sg->offset + sg->length - fraglen; -		desc->outfrags[0].length = fraglen; +		sg_set_page(&desc->outfrags[0], sg_page(sg), fraglen, +				sg->offset + sg->length - fraglen);  		desc->infrags[0] = desc->outfrags[0]; -		sg_set_page(&desc->infrags[0], in_page); +		sg_assign_page(&desc->infrags[0], in_page);  		desc->fragno = 1;  		desc->fraglen = fraglen;  	} else { @@ -287,9 +286,8 @@ decryptor(struct scatterlist *sg, void *data)  	if (ret)  		return ret;  	if (fraglen) { -		sg_set_page(&desc->frags[0], sg_page(sg)); -		desc->frags[0].offset = sg->offset + sg->length - fraglen; -		desc->frags[0].length = fraglen; +		sg_set_page(&desc->frags[0], sg_page(sg), fraglen, +				sg->offset + sg->length - fraglen);  		desc->fragno = 1;  		desc->fraglen = fraglen;  	} else { diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 3d1f7cdf9dd..f38dac30481 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c @@ -1059,9 +1059,7 @@ xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len,  		do {  			if (thislen > page_len)  				thislen = page_len; -			sg_set_page(sg, buf->pages[i]); -			sg->offset = page_offset; -			sg->length = thislen; +			sg_set_page(sg, buf->pages[i], thislen, page_offset);  			ret = actor(sg, data);  			if (ret)  				goto out; diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 313d4bed3aa..fa45989a716 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c @@ -553,9 +553,7 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  		if (copy > len)  			copy = len; -		sg_set_page(&sg, virt_to_page(skb->data + offset)); -		sg.offset = (unsigned long)(skb->data + offset) % PAGE_SIZE; -		sg.length = copy; +		sg_set_buf(&sg, skb->data + offset, copy);  		err = icv_update(desc, &sg, copy);  		if (unlikely(err)) @@ -578,9 +576,8 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,  			if (copy > len)  				copy = len; -			sg_set_page(&sg, frag->page); -			sg.offset = frag->page_offset + offset-start; -			sg.length = copy; +			sg_set_page(&sg, frag->page, copy, +					frag->page_offset + offset-start);  			err = icv_update(desc, &sg, copy);  			if (unlikely(err))  |