EXPORT_SYMBOL(blkdev_issue_flush);
  
 -void drive_stat_acct(struct request *rq, int nr_sectors, int new_io)
+ /**
+  * blkdev_scsi_issue_flush_fn - issue flush for SCSI devices
+  * @q:                device queue
+  * @disk:     gendisk
+  * @error_sector:     error offset
+  *
+  * Description:
+  *    Devices understanding the SCSI command set, can use this function as
+  *    a helper for issuing a cache flush. Note: driver is required to store
+  *    the error offset (in case of error flushing) in ->sector of struct
+  *    request.
+  */
+ int blkdev_scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk,
+                              sector_t *error_sector)
+ {
+       struct request *rq = blk_get_request(q, WRITE, __GFP_WAIT);
+       int ret;
+ 
+       rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER;
+       rq->sector = 0;
+       memset(rq->cmd, 0, sizeof(rq->cmd));
+       rq->cmd[0] = 0x35;
+       rq->cmd_len = 12;
+       rq->data = NULL;
+       rq->data_len = 0;
+       rq->timeout = 60 * HZ;
+ 
+       ret = blk_execute_rq(q, disk, rq, 0);
+ 
+       if (ret && error_sector)
+               *error_sector = rq->sector;
+ 
+       blk_put_request(rq);
+       return ret;
+ }
+ 
+ EXPORT_SYMBOL(blkdev_scsi_issue_flush_fn);
+ 
 +static void drive_stat_acct(struct request *rq, int nr_sectors, int new_io)
  {
        int rw = rq_data_dir(rq);