/* * Transfer a single BIO. */ static int sbd_xfer_bio(struct sbd_device *dev, struct bio *bio) { int i; struct bio_vec *bvec; sector_t sector = bio->bi_sector; /* Do each segment independently. */ bio_for_each_segment(bvec, bio, i) { char *buffer = __bio_kmap_atomic(bio, i, KM_USER0); sbd_transfer(dev, sector, bio_cur_sectors(bio), buffer, bio_data_dir(bio) == WRITE); sector += bio_cur_sectors(bio); __bio_kunmap_atomic(bio, KM_USER0); }
/* * Cette fonction permet de sélectionner une requête dans une file * donnée (q) et de l'envoyer à la fonction sbd_transfert afin de la * traiter. * Une requête peut être composée de plusieurs "morceaux". Dans cette * fonction, chaque "morceau" de la requête sera traité consécutivement * jusqu'à ce que cette dernière soit traitée entièrement. */ static void sbd_request(struct request_queue *q) { struct request *req; /* Instancie la requête */ req = blk_fetch_request(q); /* Sélection de la requête dans la file */ while (req != NULL) { /* Tant que la requête n'est pas nulle, i.e. file de requête n'est pas vide */ if (req == NULL || (req->cmd_type != REQ_TYPE_FS)) { /* Si requête nulle ou n'ayant pas le type "fs", i.e. s'il ne s'agit pas d'une requête liée au système de fichiers */ printk (KERN_NOTICE "Skip non-CMD request\n"); /* Inscription dans syslog de la non-exécution de la requête */ __blk_end_request_all(req, -EIO); /* Finition de la requête */ continue; /* Ignore les instructions suivantes et effectue un nouveau tour de boucle */ } sbd_transfer(&Device, blk_rq_pos(req), blk_rq_cur_sectors(req), req->buffer, rq_data_dir(req)); /* Traitement de la requete */ if ( ! __blk_end_request_cur(req, 0) ) { /* Si la requete n'est pas complètement traitée */ req = blk_fetch_request(q); /* Sélectionne la suite de la requête dans la file */ } } }
static void sbd_request(struct request_queue *q) { struct request *req; req = blk_fetch_request(q); while (req != NULL) { // blk_fs_request() was removed in 2.6.36 - many thanks to // Christian Paro for the heads up and fix... //if (!blk_fs_request(req)) { if (req == NULL || (req->cmd_type != REQ_TYPE_FS)) { printk (KERN_NOTICE "Skip non-CMD request\n"); __blk_end_request_all(req, -EIO); continue; } sbd_transfer(&Device, blk_rq_pos(req), blk_rq_cur_sectors(req), req->buffer, rq_data_dir(req)); if ( ! __blk_end_request_cur(req, 0) ) { req = blk_fetch_request(q); } } }