mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 13:44:26 -04:00
Merge branch 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block
* 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block: (63 commits) Fix memory leak in dm-crypt SPARC64: sg chaining support SPARC: sg chaining support PPC: sg chaining support PS3: sg chaining support IA64: sg chaining support x86-64: enable sg chaining x86-64: update pci-gart iommu to sg helpers x86-64: update nommu to sg helpers x86-64: update calgary iommu to sg helpers swiotlb: sg chaining support i386: enable sg chaining i386 dma_map_sg: convert to using sg helpers mmc: need to zero sglist on init Panic in blk_rq_map_sg() from CCISS driver remove sglist_len remove blk_queue_max_phys_segments in libata revert sg segment size ifdefs Fixup u14-34f ENABLE_SG_CHAINING qla1280: enable use_sg_chaining option ...
This commit is contained in:
commit
92d15c2ccb
142 changed files with 1186 additions and 1115 deletions
|
|
@ -176,13 +176,28 @@ struct bio {
|
|||
#define bio_offset(bio) bio_iovec((bio))->bv_offset
|
||||
#define bio_segments(bio) ((bio)->bi_vcnt - (bio)->bi_idx)
|
||||
#define bio_sectors(bio) ((bio)->bi_size >> 9)
|
||||
#define bio_cur_sectors(bio) (bio_iovec(bio)->bv_len >> 9)
|
||||
#define bio_data(bio) (page_address(bio_page((bio))) + bio_offset((bio)))
|
||||
#define bio_barrier(bio) ((bio)->bi_rw & (1 << BIO_RW_BARRIER))
|
||||
#define bio_sync(bio) ((bio)->bi_rw & (1 << BIO_RW_SYNC))
|
||||
#define bio_failfast(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST))
|
||||
#define bio_rw_ahead(bio) ((bio)->bi_rw & (1 << BIO_RW_AHEAD))
|
||||
#define bio_rw_meta(bio) ((bio)->bi_rw & (1 << BIO_RW_META))
|
||||
#define bio_empty_barrier(bio) (bio_barrier(bio) && !(bio)->bi_size)
|
||||
|
||||
static inline unsigned int bio_cur_sectors(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_vcnt)
|
||||
return bio_iovec(bio)->bv_len >> 9;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void *bio_data(struct bio *bio)
|
||||
{
|
||||
if (bio->bi_vcnt)
|
||||
return page_address(bio_page(bio)) + bio_offset(bio);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* will die
|
||||
|
|
|
|||
|
|
@ -330,7 +330,6 @@ typedef void (unplug_fn) (struct request_queue *);
|
|||
|
||||
struct bio_vec;
|
||||
typedef int (merge_bvec_fn) (struct request_queue *, struct bio *, struct bio_vec *);
|
||||
typedef int (issue_flush_fn) (struct request_queue *, struct gendisk *, sector_t *);
|
||||
typedef void (prepare_flush_fn) (struct request_queue *, struct request *);
|
||||
typedef void (softirq_done_fn)(struct request *);
|
||||
|
||||
|
|
@ -368,7 +367,6 @@ struct request_queue
|
|||
prep_rq_fn *prep_rq_fn;
|
||||
unplug_fn *unplug_fn;
|
||||
merge_bvec_fn *merge_bvec_fn;
|
||||
issue_flush_fn *issue_flush_fn;
|
||||
prepare_flush_fn *prepare_flush_fn;
|
||||
softirq_done_fn *softirq_done_fn;
|
||||
|
||||
|
|
@ -540,6 +538,7 @@ enum {
|
|||
#define blk_barrier_rq(rq) ((rq)->cmd_flags & REQ_HARDBARRIER)
|
||||
#define blk_fua_rq(rq) ((rq)->cmd_flags & REQ_FUA)
|
||||
#define blk_bidi_rq(rq) ((rq)->next_rq != NULL)
|
||||
#define blk_empty_barrier(rq) (blk_barrier_rq(rq) && blk_fs_request(rq) && !(rq)->hard_nr_sectors)
|
||||
|
||||
#define list_entry_rq(ptr) list_entry((ptr), struct request, queuelist)
|
||||
|
||||
|
|
@ -729,7 +728,9 @@ static inline void blk_run_address_space(struct address_space *mapping)
|
|||
extern int end_that_request_first(struct request *, int, int);
|
||||
extern int end_that_request_chunk(struct request *, int, int);
|
||||
extern void end_that_request_last(struct request *, int);
|
||||
extern void end_request(struct request *req, int uptodate);
|
||||
extern void end_request(struct request *, int);
|
||||
extern void end_queued_request(struct request *, int);
|
||||
extern void end_dequeued_request(struct request *, int);
|
||||
extern void blk_complete_request(struct request *);
|
||||
|
||||
/*
|
||||
|
|
@ -767,7 +768,6 @@ extern void blk_queue_dma_alignment(struct request_queue *, int);
|
|||
extern void blk_queue_softirq_done(struct request_queue *, softirq_done_fn *);
|
||||
extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);
|
||||
extern int blk_queue_ordered(struct request_queue *, unsigned, prepare_flush_fn *);
|
||||
extern void blk_queue_issue_flush_fn(struct request_queue *, issue_flush_fn *);
|
||||
extern int blk_do_ordered(struct request_queue *, struct request **);
|
||||
extern unsigned blk_ordered_cur_seq(struct request_queue *);
|
||||
extern unsigned blk_ordered_req_seq(struct request *);
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/workqueue.h> /* work_struct */
|
||||
#include <linux/mempool.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/semaphore.h> /* Needed for MUTEX init macros */
|
||||
|
|
@ -837,7 +838,7 @@ static inline int i2o_dma_map_sg(struct i2o_controller *c,
|
|||
if ((sizeof(dma_addr_t) > 4) && c->pae_support)
|
||||
*mptr++ = cpu_to_le32(i2o_dma_high(sg_dma_address(sg)));
|
||||
#endif
|
||||
sg++;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
*sg_ptr = mptr;
|
||||
|
||||
|
|
|
|||
|
|
@ -772,7 +772,7 @@ typedef struct hwif_s {
|
|||
|
||||
unsigned int nsect;
|
||||
unsigned int nleft;
|
||||
unsigned int cursg;
|
||||
struct scatterlist *cursg;
|
||||
unsigned int cursg_ofs;
|
||||
|
||||
int rqsize; /* max sectors per request */
|
||||
|
|
@ -1092,11 +1092,6 @@ extern ide_startstop_t ide_do_reset (ide_drive_t *);
|
|||
*/
|
||||
extern void ide_init_drive_cmd (struct request *rq);
|
||||
|
||||
/*
|
||||
* this function returns error location sector offset in case of a write error
|
||||
*/
|
||||
extern u64 ide_get_error_location(ide_drive_t *, char *);
|
||||
|
||||
/*
|
||||
* "action" parameter type for ide_do_drive_cmd() below.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <asm/scatterlist.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ata.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
|
@ -416,6 +416,7 @@ struct ata_queued_cmd {
|
|||
unsigned long flags; /* ATA_QCFLAG_xxx */
|
||||
unsigned int tag;
|
||||
unsigned int n_elem;
|
||||
unsigned int n_iter;
|
||||
unsigned int orig_n_elem;
|
||||
|
||||
int dma_dir;
|
||||
|
|
@ -426,7 +427,7 @@ struct ata_queued_cmd {
|
|||
unsigned int nbytes;
|
||||
unsigned int curbytes;
|
||||
|
||||
unsigned int cursg;
|
||||
struct scatterlist *cursg;
|
||||
unsigned int cursg_ofs;
|
||||
|
||||
struct scatterlist sgent;
|
||||
|
|
@ -1043,7 +1044,7 @@ ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc)
|
|||
return 1;
|
||||
if (qc->pad_len)
|
||||
return 0;
|
||||
if (((sg - qc->__sg) + 1) == qc->n_elem)
|
||||
if (qc->n_iter == qc->n_elem)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1051,6 +1052,7 @@ ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc)
|
|||
static inline struct scatterlist *
|
||||
ata_qc_first_sg(struct ata_queued_cmd *qc)
|
||||
{
|
||||
qc->n_iter = 0;
|
||||
if (qc->n_elem)
|
||||
return qc->__sg;
|
||||
if (qc->pad_len)
|
||||
|
|
@ -1063,8 +1065,8 @@ ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc)
|
|||
{
|
||||
if (sg == &qc->pad_sgent)
|
||||
return NULL;
|
||||
if (++sg - qc->__sg < qc->n_elem)
|
||||
return sg;
|
||||
if (++qc->n_iter < qc->n_elem)
|
||||
return sg_next(sg);
|
||||
if (qc->pad_len)
|
||||
return &qc->pad_sgent;
|
||||
return NULL;
|
||||
|
|
@ -1309,9 +1311,11 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
|
|||
qc->dma_dir = DMA_NONE;
|
||||
qc->__sg = NULL;
|
||||
qc->flags = 0;
|
||||
qc->cursg = qc->cursg_ofs = 0;
|
||||
qc->cursg = NULL;
|
||||
qc->cursg_ofs = 0;
|
||||
qc->nbytes = qc->curbytes = 0;
|
||||
qc->n_elem = 0;
|
||||
qc->n_iter = 0;
|
||||
qc->err_mask = 0;
|
||||
qc->pad_len = 0;
|
||||
qc->sect_size = ATA_SECT_SIZE;
|
||||
|
|
|
|||
|
|
@ -20,4 +20,88 @@ static inline void sg_init_one(struct scatterlist *sg, const void *buf,
|
|||
sg_set_buf(sg, buf, buflen);
|
||||
}
|
||||
|
||||
/*
|
||||
* We overload the LSB of the page pointer to indicate whether it's
|
||||
* a valid sg entry, or whether it points to the start of a new scatterlist.
|
||||
* Those low bits are there for everyone! (thanks mason :-)
|
||||
*/
|
||||
#define sg_is_chain(sg) ((unsigned long) (sg)->page & 0x01)
|
||||
#define sg_chain_ptr(sg) \
|
||||
((struct scatterlist *) ((unsigned long) (sg)->page & ~0x01))
|
||||
|
||||
/**
|
||||
* sg_next - return the next scatterlist entry in a list
|
||||
* @sg: The current sg entry
|
||||
*
|
||||
* Usually the next entry will be @sg@ + 1, but if this sg element is part
|
||||
* of a chained scatterlist, it could jump to the start of a new
|
||||
* scatterlist array.
|
||||
*
|
||||
* Note that the caller must ensure that there are further entries after
|
||||
* the current entry, this function will NOT return NULL for an end-of-list.
|
||||
*
|
||||
*/
|
||||
static inline struct scatterlist *sg_next(struct scatterlist *sg)
|
||||
{
|
||||
sg++;
|
||||
|
||||
if (unlikely(sg_is_chain(sg)))
|
||||
sg = sg_chain_ptr(sg);
|
||||
|
||||
return sg;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop over each sg element, following the pointer to a new list if necessary
|
||||
*/
|
||||
#define for_each_sg(sglist, sg, nr, __i) \
|
||||
for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg))
|
||||
|
||||
/**
|
||||
* sg_last - return the last scatterlist entry in a list
|
||||
* @sgl: First entry in the scatterlist
|
||||
* @nents: Number of entries in the scatterlist
|
||||
*
|
||||
* Should only be used casually, it (currently) scan the entire list
|
||||
* to get the last entry.
|
||||
*
|
||||
* Note that the @sgl@ pointer passed in need not be the first one,
|
||||
* the important bit is that @nents@ denotes the number of entries that
|
||||
* exist from @sgl@.
|
||||
*
|
||||
*/
|
||||
static inline struct scatterlist *sg_last(struct scatterlist *sgl,
|
||||
unsigned int nents)
|
||||
{
|
||||
#ifndef ARCH_HAS_SG_CHAIN
|
||||
struct scatterlist *ret = &sgl[nents - 1];
|
||||
#else
|
||||
struct scatterlist *sg, *ret = NULL;
|
||||
int i;
|
||||
|
||||
for_each_sg(sgl, sg, nents, i)
|
||||
ret = sg;
|
||||
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_chain - Chain two sglists together
|
||||
* @prv: First scatterlist
|
||||
* @prv_nents: Number of entries in prv
|
||||
* @sgl: Second scatterlist
|
||||
*
|
||||
* Links @prv@ and @sgl@ together, to form a longer scatterlist.
|
||||
*
|
||||
*/
|
||||
static inline void sg_chain(struct scatterlist *prv, unsigned int prv_nents,
|
||||
struct scatterlist *sgl)
|
||||
{
|
||||
#ifndef ARCH_HAS_SG_CHAIN
|
||||
BUG();
|
||||
#endif
|
||||
prv[prv_nents - 1].page = (struct page *) ((unsigned long) sgl | 0x01);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_SCATTERLIST_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue