DEFINE_IDA(blk_queue_ida);
+int trap_non_toi_io;
+EXPORT_SYMBOL_GPL(trap_non_toi_io);
+
/*
* For the allocated request tables
*/
__set_bit(QUEUE_FLAG_BYPASS, &q->queue_flags);
if (blkcg_init_queue(q))
- goto fail_id;
+ goto fail_bdi;
return q;
+fail_bdi:
+ bdi_destroy(&q->backing_dev_info);
fail_id:
ida_simple_remove(&blk_queue_ida, q->id);
fail_q:
q->sg_reserved_size = INT_MAX;
+ /* Protect q->elevator from elevator_change */
+ mutex_lock(&q->sysfs_lock);
+
/* init elevator */
- if (elevator_init(q, NULL))
+ if (elevator_init(q, NULL)) {
+ mutex_unlock(&q->sysfs_lock);
return NULL;
+ }
+
+ mutex_unlock(&q->sysfs_lock);
+
return q;
}
EXPORT_SYMBOL(blk_init_allocated_queue);
{
bio->bi_rw |= rw;
+ if (unlikely(trap_non_toi_io))
+ BUG_ON(!(bio->bi_flags & BIO_TOI));
+
/*
* If it's a regular read/write or a barrier with data attached,
* go through the normal accounting stuff before submission.
count_vm_events(PGPGOUT, count);
} else {
task_io_account_read(bio->bi_size);
+#if defined(FEATURE_STORAGE_PID_LOGGER)
+ {
+ int i;
+ struct bio_vec *bvec;
+
+ //printk(KERN_INFO"submit_bio size:%d", bio->bi_size);
+ bio_for_each_segment(bvec, bio, i)
+ {
+ struct page_pid_logger *tmp_logger;
+ extern unsigned char *page_logger;
+ extern spinlock_t g_locker;
+ unsigned long flags;
+ //printk(KERN_INFO"submit_bio bvec:%p size:%d", bvec, bio->bi_size);
+ if( page_logger && bvec->bv_page) {
+ unsigned long page_index;
+ //#if defined(CONFIG_FLATMEM)
+ //page_index = (unsigned long)((bvec->bv_page) - mem_map) ;
+ //#else
+ page_index = (unsigned long)(__page_to_pfn(bvec->bv_page))- PHYS_PFN_OFFSET;
+ //#endif
+ //printk(KERN_INFO"hank:submit_bio page_index:%lu", page_index);
+ tmp_logger =((struct page_pid_logger *)page_logger) + page_index;
+ spin_lock_irqsave(&g_locker, flags);
+ if( page_index < num_physpages) {
+ if( tmp_logger->pid1 == 0XFFFF && tmp_logger->pid2 != current->pid)
+ tmp_logger->pid1 = current->pid;
+ else if( tmp_logger->pid1 != current->pid )
+ tmp_logger->pid2 = current->pid;
+ }
+ spin_unlock_irqrestore(&g_locker, flags);
+ //printk(KERN_INFO"hank tmp logger pid1:%u pid2:%u pfn:%d \n", tmp_logger->pid1, tmp_logger->pid2, (unsigned long)((page) - mem_map) );
+ }
+
+
+ }
+ }
+#endif
count_vm_events(PGPGIN, count);
}
if (unlikely(blk_bidi_rq(req)))
req->next_rq->resid_len = blk_rq_bytes(req->next_rq);
+ BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags));
blk_add_timer(req);
}
EXPORT_SYMBOL(blk_start_request);
if (!req->bio)
return false;
- trace_block_rq_complete(req->q, req);
+ trace_block_rq_complete(req->q, req, nr_bytes);
/*
* For fs requests, rq is just carrier of independent bio's