block: move cmdfilter from gendisk to request_queue
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Sat, 16 Aug 2008 05:10:05 +0000 (14:10 +0900)
committerJens Axboe <jens.axboe@oracle.com>
Wed, 27 Aug 2008 07:50:19 +0000 (09:50 +0200)
commitabf5439370491dd6fbb4fe1a7939680d2a9bc9d4
treeaa3630557fe4a4bc6313617f5770af30eec68515
parent1941246dd98089dd637f44d3bd4f6cc1c61aa9e4
block: move cmdfilter from gendisk to request_queue

cmd_filter works only for the block layer SG_IO with SCSI block
devices. It breaks scsi/sg.c, bsg, and the block layer SG_IO with SCSI
character devices (such as st). We hit a kernel crash with them.

The problem is that cmd_filter code accesses to gendisk (having struct
blk_scsi_cmd_filter) via inode->i_bdev->bd_disk. It works for only
SCSI block device files. With character device files, inode->i_bdev
leads you to struct cdev. inode->i_bdev->bd_disk->blk_scsi_cmd_filter
isn't safe.

SCSI ULDs don't expose gendisk; they keep it private. bsg needs to be
independent on any protocols. We shouldn't change ULDs to expose their
gendisk.

This patch moves struct blk_scsi_cmd_filter from gendisk to
request_queue, a common object, which eveyone can access to.

The user interface doesn't change; users can change the filters via
/sys/block/. gendisk has a pointer to request_queue so the cmd_filter
code accesses to struct blk_scsi_cmd_filter.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/blk-core.c
block/bsg.c
block/cmd-filter.c
block/scsi_ioctl.c
drivers/scsi/sg.c
include/linux/blkdev.h
include/linux/genhd.h