linux/block/bsg.c
<<
>>
Prefs
   1/*
   2 * bsg.c - block layer implementation of the sg v4 interface
   3 *
   4 * Copyright (C) 2004 Jens Axboe <axboe@suse.de> SUSE Labs
   5 * Copyright (C) 2004 Peter M. Jones <pjones@redhat.com>
   6 *
   7 *  This file is subject to the terms and conditions of the GNU General Public
   8 *  License version 2.  See the file "COPYING" in the main directory of this
   9 *  archive for more details.
  10 *
  11 */
  12#include <linux/module.h>
  13#include <linux/init.h>
  14#include <linux/file.h>
  15#include <linux/blkdev.h>
  16#include <linux/poll.h>
  17#include <linux/cdev.h>
  18#include <linux/percpu.h>
  19#include <linux/uio.h>
  20#include <linux/idr.h>
  21#include <linux/bsg.h>
  22
  23#include <scsi/scsi.h>
  24#include <scsi/scsi_ioctl.h>
  25#include <scsi/scsi_cmnd.h>
  26#include <scsi/scsi_device.h>
  27#include <scsi/scsi_driver.h>
  28#include <scsi/sg.h>
  29
  30#define BSG_DESCRIPTION "Block layer SCSI generic (bsg) driver"
  31#define BSG_VERSION     "0.4"
  32
  33struct bsg_device {
  34        struct request_queue *queue;
  35        spinlock_t lock;
  36        struct list_head busy_list;
  37        struct list_head done_list;
  38        struct hlist_node dev_list;
  39        atomic_t ref_count;
  40        int minor;
  41        int queued_cmds;
  42        int done_cmds;
  43        wait_queue_head_t wq_done;
  44        wait_queue_head_t wq_free;
  45        char name[BUS_ID_SIZE];
  46        int max_queue;
  47        unsigned long flags;
  48};
  49
  50enum {
  51        BSG_F_BLOCK             = 1,
  52        BSG_F_WRITE_PERM        = 2,
  53};
  54
  55#define BSG_DEFAULT_CMDS        64
  56#define BSG_MAX_DEVS            32768
  57
  58#undef BSG_DEBUG
  59
  60#ifdef BSG_DEBUG
  61#define dprintk(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ##args)
  62#else
  63#define dprintk(fmt, args...)
  64#endif
  65
  66static DEFINE_MUTEX(bsg_mutex);
  67static DEFINE_IDR(bsg_minor_idr);
  68
  69#define BSG_LIST_ARRAY_SIZE     8
  70static struct hlist_head bsg_device_list[BSG_LIST_ARRAY_SIZE];
  71
  72static struct class *bsg_class;
  73static int bsg_major;
  74
  75static struct kmem_cache *bsg_cmd_cachep;
  76
  77/*
  78 * our internal command type
  79 */
  80struct bsg_command {
  81        struct bsg_device *bd;
  82        struct list_head list;
  83        struct request *rq;
  84        struct bio *bio;
  85        struct bio *bidi_bio;
  86        int err;
  87        struct sg_io_v4 hdr;
  88        char sense[SCSI_SENSE_BUFFERSIZE];
  89};
  90
  91static void bsg_free_command(struct bsg_command *bc)
  92{
  93        struct bsg_device *bd = bc->bd;
  94        unsigned long flags;
  95
  96        kmem_cache_free(bsg_cmd_cachep, bc);
  97
  98        spin_lock_irqsave(&bd->lock, flags);
  99        bd->queued_cmds--;
 100        spin_unlock_irqrestore(&bd->lock, flags);
 101
 102        wake_up(&bd->wq_free);
 103}
 104
 105static struct bsg_command *bsg_alloc_command(struct bsg_device *bd)
 106{
 107        struct bsg_command *bc = ERR_PTR(-EINVAL);
 108
 109        spin_lock_irq(&bd->lock);
 110
 111        if (bd->queued_cmds >= bd->max_queue)
 112                goto out;
 113
 114        bd->queued_cmds++;
 115        spin_unlock_irq(&bd->lock);
 116
 117        bc = kmem_cache_zalloc(bsg_cmd_cachep, GFP_KERNEL);
 118        if (unlikely(!bc)) {
 119                spin_lock_irq(&bd->lock);
 120                bd->queued_cmds--;
 121                bc = ERR_PTR(-ENOMEM);
 122                goto out;
 123        }
 124
 125        bc->bd = bd;
 126        INIT_LIST_HEAD(&bc->list);
 127        dprintk("%s: returning free cmd %p\n", bd->name, bc);
 128        return bc;
 129out:
 130        spin_unlock_irq(&bd->lock);
 131        return bc;
 132}
 133
 134static inline struct hlist_head *bsg_dev_idx_hash(int index)
 135{
 136        return &bsg_device_list[index & (BSG_LIST_ARRAY_SIZE - 1)];
 137}
 138
 139static int bsg_io_schedule(struct bsg_device *bd)
 140{
 141        DEFINE_WAIT(wait);
 142        int ret = 0;
 143
 144        spin_lock_irq(&bd->lock);
 145
 146        BUG_ON(bd->done_cmds > bd->queued_cmds);
 147
 148        /*
 149         * -ENOSPC or -ENODATA?  I'm going for -ENODATA, meaning "I have no
 150         * work to do", even though we return -ENOSPC after this same test
 151         * during bsg_write() -- there, it means our buffer can't have more
 152         * bsg_commands added to it, thus has no space left.
 153         */
 154        if (bd->done_cmds == bd->queued_cmds) {
 155                ret = -ENODATA;
 156                goto unlock;
 157        }
 158
 159        if (!test_bit(BSG_F_BLOCK, &bd->flags)) {
 160                ret = -EAGAIN;
 161                goto unlock;
 162        }
 163
 164        prepare_to_wait(&bd->wq_done, &wait, TASK_UNINTERRUPTIBLE);
 165        spin_unlock_irq(&bd->lock);
 166        io_schedule();
 167        finish_wait(&bd->wq_done, &wait);
 168
 169        return ret;
 170unlock:
 171        spin_unlock_irq(&bd->lock);
 172        return ret;
 173}
 174
 175static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
 176                                struct sg_io_v4 *hdr, int has_write_perm)
 177{
 178        memset(rq->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */
 179
 180        if (copy_from_user(rq->cmd, (void *)(unsigned long)hdr->request,
 181                           hdr->request_len))
 182                return -EFAULT;
 183
 184        if (hdr->subprotocol == BSG_SUB_PROTOCOL_SCSI_CMD) {
 185                if (blk_verify_command(rq->cmd, has_write_perm))
 186                        return -EPERM;
 187        } else if (!capable(CAP_SYS_RAWIO))
 188                return -EPERM;
 189
 190        /*
 191         * fill in request structure
 192         */
 193        rq->cmd_len = hdr->request_len;
 194        rq->cmd_type = REQ_TYPE_BLOCK_PC;
 195
 196        rq->timeout = (hdr->timeout * HZ) / 1000;
 197        if (!rq->timeout)
 198                rq->timeout = q->sg_timeout;
 199        if (!rq->timeout)
 200                rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
 201
 202        return 0;
 203}
 204
 205/*
 206 * Check if sg_io_v4 from user is allowed and valid
 207 */
 208static int
 209bsg_validate_sgv4_hdr(struct request_queue *q, struct sg_io_v4 *hdr, int *rw)
 210{
 211        int ret = 0;
 212
 213        if (hdr->guard != 'Q')
 214                return -EINVAL;
 215        if (hdr->request_len > BLK_MAX_CDB)
 216                return -EINVAL;
 217        if (hdr->dout_xfer_len > (q->max_sectors << 9) ||
 218            hdr->din_xfer_len > (q->max_sectors << 9))
 219                return -EIO;
 220
 221        switch (hdr->protocol) {
 222        case BSG_PROTOCOL_SCSI:
 223                switch (hdr->subprotocol) {
 224                case BSG_SUB_PROTOCOL_SCSI_CMD:
 225                case BSG_SUB_PROTOCOL_SCSI_TRANSPORT:
 226                        break;
 227                default:
 228                        ret = -EINVAL;
 229                }
 230                break;
 231        default:
 232                ret = -EINVAL;
 233        }
 234
 235        *rw = hdr->dout_xfer_len ? WRITE : READ;
 236        return ret;
 237}
 238
 239/*
 240 * map sg_io_v4 to a request.
 241 */
 242static struct request *
 243bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr)
 244{
 245        struct request_queue *q = bd->queue;
 246        struct request *rq, *next_rq = NULL;
 247        int ret, rw;
 248        unsigned int dxfer_len;
 249        void *dxferp = NULL;
 250
 251        dprintk("map hdr %llx/%u %llx/%u\n", (unsigned long long) hdr->dout_xferp,
 252                hdr->dout_xfer_len, (unsigned long long) hdr->din_xferp,
 253                hdr->din_xfer_len);
 254
 255        ret = bsg_validate_sgv4_hdr(q, hdr, &rw);
 256        if (ret)
 257                return ERR_PTR(ret);
 258
 259        /*
 260         * map scatter-gather elements seperately and string them to request
 261         */
 262        rq = blk_get_request(q, rw, GFP_KERNEL);
 263        if (!rq)
 264                return ERR_PTR(-ENOMEM);
 265        ret = blk_fill_sgv4_hdr_rq(q, rq, hdr, test_bit(BSG_F_WRITE_PERM,
 266                                                       &bd->flags));
 267        if (ret)
 268                goto out;
 269
 270        if (rw == WRITE && hdr->din_xfer_len) {
 271                if (!test_bit(QUEUE_FLAG_BIDI, &q->queue_flags)) {
 272                        ret = -EOPNOTSUPP;
 273                        goto out;
 274                }
 275
 276                next_rq = blk_get_request(q, READ, GFP_KERNEL);
 277                if (!next_rq) {
 278                        ret = -ENOMEM;
 279                        goto out;
 280                }
 281                rq->next_rq = next_rq;
 282
 283                dxferp = (void*)(unsigned long)hdr->din_xferp;
 284                ret =  blk_rq_map_user(q, next_rq, dxferp, hdr->din_xfer_len);
 285                if (ret)
 286                        goto out;
 287        }
 288
 289        if (hdr->dout_xfer_len) {
 290                dxfer_len = hdr->dout_xfer_len;
 291                dxferp = (void*)(unsigned long)hdr->dout_xferp;
 292        } else if (hdr->din_xfer_len) {
 293                dxfer_len = hdr->din_xfer_len;
 294                dxferp = (void*)(unsigned long)hdr->din_xferp;
 295        } else
 296                dxfer_len = 0;
 297
 298        if (dxfer_len) {
 299                ret = blk_rq_map_user(q, rq, dxferp, dxfer_len);
 300                if (ret)
 301                        goto out;
 302        }
 303        return rq;
 304out:
 305        blk_put_request(rq);
 306        if (next_rq) {
 307                blk_rq_unmap_user(next_rq->bio);
 308                blk_put_request(next_rq);
 309        }
 310        return ERR_PTR(ret);
 311}
 312
 313/*
 314 * async completion call-back from the block layer, when scsi/ide/whatever
 315 * calls end_that_request_last() on a request
 316 */
 317static void bsg_rq_end_io(struct request *rq, int uptodate)
 318{
 319        struct bsg_command *bc = rq->end_io_data;
 320        struct bsg_device *bd = bc->bd;
 321        unsigned long flags;
 322
 323        dprintk("%s: finished rq %p bc %p, bio %p stat %d\n",
 324                bd->name, rq, bc, bc->bio, uptodate);
 325
 326        bc->hdr.duration = jiffies_to_msecs(jiffies - bc->hdr.duration);
 327
 328        spin_lock_irqsave(&bd->lock, flags);
 329        list_move_tail(&bc->list, &bd->done_list);
 330        bd->done_cmds++;
 331        spin_unlock_irqrestore(&bd->lock, flags);
 332
 333        wake_up(&bd->wq_done);
 334}
 335
 336/*
 337 * do final setup of a 'bc' and submit the matching 'rq' to the block
 338 * layer for io
 339 */
 340static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,
 341                            struct bsg_command *bc, struct request *rq)
 342{
 343        rq->sense = bc->sense;
 344        rq->sense_len = 0;
 345
 346        /*
 347         * add bc command to busy queue and submit rq for io
 348         */
 349        bc->rq = rq;
 350        bc->bio = rq->bio;
 351        if (rq->next_rq)
 352                bc->bidi_bio = rq->next_rq->bio;
 353        bc->hdr.duration = jiffies;
 354        spin_lock_irq(&bd->lock);
 355        list_add_tail(&bc->list, &bd->busy_list);
 356        spin_unlock_irq(&bd->lock);
 357
 358        dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc);
 359
 360        rq->end_io_data = bc;
 361        blk_execute_rq_nowait(q, NULL, rq, 1, bsg_rq_end_io);
 362}
 363
 364static struct bsg_command *bsg_next_done_cmd(struct bsg_device *bd)
 365{
 366        struct bsg_command *bc = NULL;
 367
 368        spin_lock_irq(&bd->lock);
 369        if (bd->done_cmds) {
 370                bc = list_entry(bd->done_list.next, struct bsg_command, list);
 371                list_del(&bc->list);
 372                bd->done_cmds--;
 373        }
 374        spin_unlock_irq(&bd->lock);
 375
 376        return bc;
 377}
 378
 379/*
 380 * Get a finished command from the done list
 381 */
 382static struct bsg_command *bsg_get_done_cmd(struct bsg_device *bd)
 383{
 384        struct bsg_command *bc;
 385        int ret;
 386
 387        do {
 388                bc = bsg_next_done_cmd(bd);
 389                if (bc)
 390                        break;
 391
 392                if (!test_bit(BSG_F_BLOCK, &bd->flags)) {
 393                        bc = ERR_PTR(-EAGAIN);
 394                        break;
 395                }
 396
 397                ret = wait_event_interruptible(bd->wq_done, bd->done_cmds);
 398                if (ret) {
 399                        bc = ERR_PTR(-ERESTARTSYS);
 400                        break;
 401                }
 402        } while (1);
 403
 404        dprintk("%s: returning done %p\n", bd->name, bc);
 405
 406        return bc;
 407}
 408
 409static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
 410                                    struct bio *bio, struct bio *bidi_bio)
 411{
 412        int ret = 0;
 413
 414        dprintk("rq %p bio %p %u\n", rq, bio, rq->errors);
 415        /*
 416         * fill in all the output members
 417         */
 418        hdr->device_status = status_byte(rq->errors);
 419        hdr->transport_status = host_byte(rq->errors);
 420        hdr->driver_status = driver_byte(rq->errors);
 421        hdr->info = 0;
 422        if (hdr->device_status || hdr->transport_status || hdr->driver_status)
 423                hdr->info |= SG_INFO_CHECK;
 424        hdr->response_len = 0;
 425
 426        if (rq->sense_len && hdr->response) {
 427                int len = min_t(unsigned int, hdr->max_response_len,
 428                                        rq->sense_len);
 429
 430                ret = copy_to_user((void*)(unsigned long)hdr->response,
 431                                   rq->sense, len);
 432                if (!ret)
 433                        hdr->response_len = len;
 434                else
 435                        ret = -EFAULT;
 436        }
 437
 438        if (rq->next_rq) {
 439                hdr->dout_resid = rq->data_len;
 440                hdr->din_resid = rq->next_rq->data_len;
 441                blk_rq_unmap_user(bidi_bio);
 442                blk_put_request(rq->next_rq);
 443        } else if (rq_data_dir(rq) == READ)
 444                hdr->din_resid = rq->data_len;
 445        else
 446                hdr->dout_resid = rq->data_len;
 447
 448        blk_rq_unmap_user(bio);
 449        blk_put_request(rq);
 450
 451        return ret;
 452}
 453
 454static int bsg_complete_all_commands(struct bsg_device *bd)
 455{
 456        struct bsg_command *bc;
 457        int ret, tret;
 458
 459        dprintk("%s: entered\n", bd->name);
 460
 461        set_bit(BSG_F_BLOCK, &bd->flags);
 462
 463        /*
 464         * wait for all commands to complete
 465         */
 466        ret = 0;
 467        do {
 468                ret = bsg_io_schedule(bd);
 469                /*
 470                 * look for -ENODATA specifically -- we'll sometimes get
 471                 * -ERESTARTSYS when we've taken a signal, but we can't
 472                 * return until we're done freeing the queue, so ignore
 473                 * it.  The signal will get handled when we're done freeing
 474                 * the bsg_device.
 475                 */
 476        } while (ret != -ENODATA);
 477
 478        /*
 479         * discard done commands
 480         */
 481        ret = 0;
 482        do {
 483                spin_lock_irq(&bd->lock);
 484                if (!bd->queued_cmds) {
 485                        spin_unlock_irq(&bd->lock);
 486                        break;
 487                }
 488                spin_unlock_irq(&bd->lock);
 489
 490                bc = bsg_get_done_cmd(bd);
 491                if (IS_ERR(bc))
 492                        break;
 493
 494                tret = blk_complete_sgv4_hdr_rq(bc->rq, &bc->hdr, bc->bio,
 495                                                bc->bidi_bio);
 496                if (!ret)
 497                        ret = tret;
 498
 499                bsg_free_command(bc);
 500        } while (1);
 501
 502        return ret;
 503}
 504
 505static int
 506__bsg_read(char __user *buf, size_t count, struct bsg_device *bd,
 507           const struct iovec *iov, ssize_t *bytes_read)
 508{
 509        struct bsg_command *bc;
 510        int nr_commands, ret;
 511
 512        if (count % sizeof(struct sg_io_v4))
 513                return -EINVAL;
 514
 515        ret = 0;
 516        nr_commands = count / sizeof(struct sg_io_v4);
 517        while (nr_commands) {
 518                bc = bsg_get_done_cmd(bd);
 519                if (IS_ERR(bc)) {
 520                        ret = PTR_ERR(bc);
 521                        break;
 522                }
 523
 524                /*
 525                 * this is the only case where we need to copy data back
 526                 * after completing the request. so do that here,
 527                 * bsg_complete_work() cannot do that for us
 528                 */
 529                ret = blk_complete_sgv4_hdr_rq(bc->rq, &bc->hdr, bc->bio,
 530                                               bc->bidi_bio);
 531
 532                if (copy_to_user(buf, &bc->hdr, sizeof(bc->hdr)))
 533                        ret = -EFAULT;
 534
 535                bsg_free_command(bc);
 536
 537                if (ret)
 538                        break;
 539
 540                buf += sizeof(struct sg_io_v4);
 541                *bytes_read += sizeof(struct sg_io_v4);
 542                nr_commands--;
 543        }
 544
 545        return ret;
 546}
 547
 548static inline void bsg_set_block(struct bsg_device *bd, struct file *file)
 549{
 550        if (file->f_flags & O_NONBLOCK)
 551                clear_bit(BSG_F_BLOCK, &bd->flags);
 552        else
 553                set_bit(BSG_F_BLOCK, &bd->flags);
 554}
 555
 556static inline void bsg_set_write_perm(struct bsg_device *bd, struct file *file)
 557{
 558        if (file->f_mode & FMODE_WRITE)
 559                set_bit(BSG_F_WRITE_PERM, &bd->flags);
 560        else
 561                clear_bit(BSG_F_WRITE_PERM, &bd->flags);
 562}
 563
 564/*
 565 * Check if the error is a "real" error that we should return.
 566 */
 567static inline int err_block_err(int ret)
 568{
 569        if (ret && ret != -ENOSPC && ret != -ENODATA && ret != -EAGAIN)
 570                return 1;
 571
 572        return 0;
 573}
 574
 575static ssize_t
 576bsg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 577{
 578        struct bsg_device *bd = file->private_data;
 579        int ret;
 580        ssize_t bytes_read;
 581
 582        dprintk("%s: read %Zd bytes\n", bd->name, count);
 583
 584        bsg_set_block(bd, file);
 585        bytes_read = 0;
 586        ret = __bsg_read(buf, count, bd, NULL, &bytes_read);
 587        *ppos = bytes_read;
 588
 589        if (!bytes_read || (bytes_read && err_block_err(ret)))
 590                bytes_read = ret;
 591
 592        return bytes_read;
 593}
 594
 595static int __bsg_write(struct bsg_device *bd, const char __user *buf,
 596                       size_t count, ssize_t *bytes_written)
 597{
 598        struct bsg_command *bc;
 599        struct request *rq;
 600        int ret, nr_commands;
 601
 602        if (count % sizeof(struct sg_io_v4))
 603                return -EINVAL;
 604
 605        nr_commands = count / sizeof(struct sg_io_v4);
 606        rq = NULL;
 607        bc = NULL;
 608        ret = 0;
 609        while (nr_commands) {
 610                struct request_queue *q = bd->queue;
 611
 612                bc = bsg_alloc_command(bd);
 613                if (IS_ERR(bc)) {
 614                        ret = PTR_ERR(bc);
 615                        bc = NULL;
 616                        break;
 617                }
 618
 619                if (copy_from_user(&bc->hdr, buf, sizeof(bc->hdr))) {
 620                        ret = -EFAULT;
 621                        break;
 622                }
 623
 624                /*
 625                 * get a request, fill in the blanks, and add to request queue
 626                 */
 627                rq = bsg_map_hdr(bd, &bc->hdr);
 628                if (IS_ERR(rq)) {
 629                        ret = PTR_ERR(rq);
 630                        rq = NULL;
 631                        break;
 632                }
 633
 634                bsg_add_command(bd, q, bc, rq);
 635                bc = NULL;
 636                rq = NULL;
 637                nr_commands--;
 638                buf += sizeof(struct sg_io_v4);
 639                *bytes_written += sizeof(struct sg_io_v4);
 640        }
 641
 642        if (bc)
 643                bsg_free_command(bc);
 644
 645        return ret;
 646}
 647
 648static ssize_t
 649bsg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
 650{
 651        struct bsg_device *bd = file->private_data;
 652        ssize_t bytes_written;
 653        int ret;
 654
 655        dprintk("%s: write %Zd bytes\n", bd->name, count);
 656
 657        bsg_set_block(bd, file);
 658        bsg_set_write_perm(bd, file);
 659
 660        bytes_written = 0;
 661        ret = __bsg_write(bd, buf, count, &bytes_written);
 662        *ppos = bytes_written;
 663
 664        /*
 665         * return bytes written on non-fatal errors
 666         */
 667        if (!bytes_written || (bytes_written && err_block_err(ret)))
 668                bytes_written = ret;
 669
 670        dprintk("%s: returning %Zd\n", bd->name, bytes_written);
 671        return bytes_written;
 672}
 673
 674static struct bsg_device *bsg_alloc_device(void)
 675{
 676        struct bsg_device *bd;
 677
 678        bd = kzalloc(sizeof(struct bsg_device), GFP_KERNEL);
 679        if (unlikely(!bd))
 680                return NULL;
 681
 682        spin_lock_init(&bd->lock);
 683
 684        bd->max_queue = BSG_DEFAULT_CMDS;
 685
 686        INIT_LIST_HEAD(&bd->busy_list);
 687        INIT_LIST_HEAD(&bd->done_list);
 688        INIT_HLIST_NODE(&bd->dev_list);
 689
 690        init_waitqueue_head(&bd->wq_free);
 691        init_waitqueue_head(&bd->wq_done);
 692        return bd;
 693}
 694
 695static int bsg_put_device(struct bsg_device *bd)
 696{
 697        int ret = 0;
 698
 699        mutex_lock(&bsg_mutex);
 700
 701        if (!atomic_dec_and_test(&bd->ref_count))
 702                goto out;
 703
 704        dprintk("%s: tearing down\n", bd->name);
 705
 706        /*
 707         * close can always block
 708         */
 709        set_bit(BSG_F_BLOCK, &bd->flags);
 710
 711        /*
 712         * correct error detection baddies here again. it's the responsibility
 713         * of the app to properly reap commands before close() if it wants
 714         * fool-proof error detection
 715         */
 716        ret = bsg_complete_all_commands(bd);
 717
 718        blk_put_queue(bd->queue);
 719        hlist_del(&bd->dev_list);
 720        kfree(bd);
 721out:
 722        mutex_unlock(&bsg_mutex);
 723        return ret;
 724}
 725
 726static struct bsg_device *bsg_add_device(struct inode *inode,
 727                                         struct request_queue *rq,
 728                                         struct file *file)
 729{
 730        struct bsg_device *bd;
 731#ifdef BSG_DEBUG
 732        unsigned char buf[32];
 733#endif
 734
 735        bd = bsg_alloc_device();
 736        if (!bd)
 737                return ERR_PTR(-ENOMEM);
 738
 739        bd->queue = rq;
 740        kobject_get(&rq->kobj);
 741        bsg_set_block(bd, file);
 742
 743        atomic_set(&bd->ref_count, 1);
 744        bd->minor = iminor(inode);
 745        mutex_lock(&bsg_mutex);
 746        hlist_add_head(&bd->dev_list, bsg_dev_idx_hash(bd->minor));
 747
 748        strncpy(bd->name, rq->bsg_dev.class_dev->class_id, sizeof(bd->name) - 1);
 749        dprintk("bound to <%s>, max queue %d\n",
 750                format_dev_t(buf, inode->i_rdev), bd->max_queue);
 751
 752        mutex_unlock(&bsg_mutex);
 753        return bd;
 754}
 755
 756static struct bsg_device *__bsg_get_device(int minor)
 757{
 758        struct bsg_device *bd = NULL;
 759        struct hlist_node *entry;
 760
 761        mutex_lock(&bsg_mutex);
 762
 763        hlist_for_each(entry, bsg_dev_idx_hash(minor)) {
 764                bd = hlist_entry(entry, struct bsg_device, dev_list);
 765                if (bd->minor == minor) {
 766                        atomic_inc(&bd->ref_count);
 767                        break;
 768                }
 769
 770                bd = NULL;
 771        }
 772
 773        mutex_unlock(&bsg_mutex);
 774        return bd;
 775}
 776
 777static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file)
 778{
 779        struct bsg_device *bd;
 780        struct bsg_class_device *bcd;
 781
 782        bd = __bsg_get_device(iminor(inode));
 783        if (bd)
 784                return bd;
 785
 786        /*
 787         * find the class device
 788         */
 789        mutex_lock(&bsg_mutex);
 790        bcd = idr_find(&bsg_minor_idr, iminor(inode));
 791        mutex_unlock(&bsg_mutex);
 792
 793        if (!bcd)
 794                return ERR_PTR(-ENODEV);
 795
 796        return bsg_add_device(inode, bcd->queue, file);
 797}
 798
 799static int bsg_open(struct inode *inode, struct file *file)
 800{
 801        struct bsg_device *bd = bsg_get_device(inode, file);
 802
 803        if (IS_ERR(bd))
 804                return PTR_ERR(bd);
 805
 806        file->private_data = bd;
 807        return 0;
 808}
 809
 810static int bsg_release(struct inode *inode, struct file *file)
 811{
 812        struct bsg_device *bd = file->private_data;
 813
 814        file->private_data = NULL;
 815        return bsg_put_device(bd);
 816}
 817
 818static unsigned int bsg_poll(struct file *file, poll_table *wait)
 819{
 820        struct bsg_device *bd = file->private_data;
 821        unsigned int mask = 0;
 822
 823        poll_wait(file, &bd->wq_done, wait);
 824        poll_wait(file, &bd->wq_free, wait);
 825
 826        spin_lock_irq(&bd->lock);
 827        if (!list_empty(&bd->done_list))
 828                mask |= POLLIN | POLLRDNORM;
 829        if (bd->queued_cmds >= bd->max_queue)
 830                mask |= POLLOUT;
 831        spin_unlock_irq(&bd->lock);
 832
 833        return mask;
 834}
 835
 836static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 837{
 838        struct bsg_device *bd = file->private_data;
 839        int __user *uarg = (int __user *) arg;
 840
 841        switch (cmd) {
 842                /*
 843                 * our own ioctls
 844                 */
 845        case SG_GET_COMMAND_Q:
 846                return put_user(bd->max_queue, uarg);
 847        case SG_SET_COMMAND_Q: {
 848                int queue;
 849
 850                if (get_user(queue, uarg))
 851                        return -EFAULT;
 852                if (queue < 1)
 853                        return -EINVAL;
 854
 855                spin_lock_irq(&bd->lock);
 856                bd->max_queue = queue;
 857                spin_unlock_irq(&bd->lock);
 858                return 0;
 859        }
 860
 861        /*
 862         * SCSI/sg ioctls
 863         */
 864        case SG_GET_VERSION_NUM:
 865        case SCSI_IOCTL_GET_IDLUN:
 866        case SCSI_IOCTL_GET_BUS_NUMBER:
 867        case SG_SET_TIMEOUT:
 868        case SG_GET_TIMEOUT:
 869        case SG_GET_RESERVED_SIZE:
 870        case SG_SET_RESERVED_SIZE:
 871        case SG_EMULATED_HOST:
 872        case SCSI_IOCTL_SEND_COMMAND: {
 873                void __user *uarg = (void __user *) arg;
 874                return scsi_cmd_ioctl(file, bd->queue, NULL, cmd, uarg);
 875        }
 876        case SG_IO: {
 877                struct request *rq;
 878                struct bio *bio, *bidi_bio = NULL;
 879                struct sg_io_v4 hdr;
 880
 881                if (copy_from_user(&hdr, uarg, sizeof(hdr)))
 882                        return -EFAULT;
 883
 884                rq = bsg_map_hdr(bd, &hdr);
 885                if (IS_ERR(rq))
 886                        return PTR_ERR(rq);
 887
 888                bio = rq->bio;
 889                if (rq->next_rq)
 890                        bidi_bio = rq->next_rq->bio;
 891                blk_execute_rq(bd->queue, NULL, rq, 0);
 892                blk_complete_sgv4_hdr_rq(rq, &hdr, bio, bidi_bio);
 893
 894                if (copy_to_user(uarg, &hdr, sizeof(hdr)))
 895                        return -EFAULT;
 896
 897                return 0;
 898        }
 899        /*
 900         * block device ioctls
 901         */
 902        default:
 903#if 0
 904                return ioctl_by_bdev(bd->bdev, cmd, arg);
 905#else
 906                return -ENOTTY;
 907#endif
 908        }
 909}
 910
 911static const struct file_operations bsg_fops = {
 912        .read           =       bsg_read,
 913        .write          =       bsg_write,
 914        .poll           =       bsg_poll,
 915        .open           =       bsg_open,
 916        .release        =       bsg_release,
 917        .unlocked_ioctl =       bsg_ioctl,
 918        .owner          =       THIS_MODULE,
 919};
 920
 921void bsg_unregister_queue(struct request_queue *q)
 922{
 923        struct bsg_class_device *bcd = &q->bsg_dev;
 924
 925        if (!bcd->class_dev)
 926                return;
 927
 928        mutex_lock(&bsg_mutex);
 929        idr_remove(&bsg_minor_idr, bcd->minor);
 930        sysfs_remove_link(&q->kobj, "bsg");
 931        class_device_unregister(bcd->class_dev);
 932        put_device(bcd->dev);
 933        bcd->class_dev = NULL;
 934        bcd->dev = NULL;
 935        mutex_unlock(&bsg_mutex);
 936}
 937EXPORT_SYMBOL_GPL(bsg_unregister_queue);
 938
 939int bsg_register_queue(struct request_queue *q, struct device *gdev,
 940                       const char *name)
 941{
 942        struct bsg_class_device *bcd;
 943        dev_t dev;
 944        int ret, minor;
 945        struct class_device *class_dev = NULL;
 946        const char *devname;
 947
 948        if (name)
 949                devname = name;
 950        else
 951                devname = gdev->bus_id;
 952
 953        /*
 954         * we need a proper transport to send commands, not a stacked device
 955         */
 956        if (!q->request_fn)
 957                return 0;
 958
 959        bcd = &q->bsg_dev;
 960        memset(bcd, 0, sizeof(*bcd));
 961
 962        mutex_lock(&bsg_mutex);
 963
 964        ret = idr_pre_get(&bsg_minor_idr, GFP_KERNEL);
 965        if (!ret) {
 966                ret = -ENOMEM;
 967                goto unlock;
 968        }
 969
 970        ret = idr_get_new(&bsg_minor_idr, bcd, &minor);
 971        if (ret < 0)
 972                goto unlock;
 973
 974        if (minor >= BSG_MAX_DEVS) {
 975                printk(KERN_ERR "bsg: too many bsg devices\n");
 976                ret = -EINVAL;
 977                goto remove_idr;
 978        }
 979
 980        bcd->minor = minor;
 981        bcd->queue = q;
 982        bcd->dev = get_device(gdev);
 983        dev = MKDEV(bsg_major, bcd->minor);
 984        class_dev = class_device_create(bsg_class, NULL, dev, gdev, "%s",
 985                                        devname);
 986        if (IS_ERR(class_dev)) {
 987                ret = PTR_ERR(class_dev);
 988                goto put_dev;
 989        }
 990        bcd->class_dev = class_dev;
 991
 992        if (q->kobj.sd) {
 993                ret = sysfs_create_link(&q->kobj, &bcd->class_dev->kobj, "bsg");
 994                if (ret)
 995                        goto unregister_class_dev;
 996        }
 997
 998        mutex_unlock(&bsg_mutex);
 999        return 0;
1000
1001unregister_class_dev:
1002        class_device_unregister(class_dev);
1003put_dev:
1004        put_device(gdev);
1005remove_idr:
1006        idr_remove(&bsg_minor_idr, minor);
1007unlock:
1008        mutex_unlock(&bsg_mutex);
1009        return ret;
1010}
1011EXPORT_SYMBOL_GPL(bsg_register_queue);
1012
1013static struct cdev bsg_cdev;
1014
1015static int __init bsg_init(void)
1016{
1017        int ret, i;
1018        dev_t devid;
1019
1020        bsg_cmd_cachep = kmem_cache_create("bsg_cmd",
1021                                sizeof(struct bsg_command), 0, 0, NULL);
1022        if (!bsg_cmd_cachep) {
1023                printk(KERN_ERR "bsg: failed creating slab cache\n");
1024                return -ENOMEM;
1025        }
1026
1027        for (i = 0; i < BSG_LIST_ARRAY_SIZE; i++)
1028                INIT_HLIST_HEAD(&bsg_device_list[i]);
1029
1030        bsg_class = class_create(THIS_MODULE, "bsg");
1031        if (IS_ERR(bsg_class)) {
1032                ret = PTR_ERR(bsg_class);
1033                goto destroy_kmemcache;
1034        }
1035
1036        ret = alloc_chrdev_region(&devid, 0, BSG_MAX_DEVS, "bsg");
1037        if (ret)
1038                goto destroy_bsg_class;
1039
1040        bsg_major = MAJOR(devid);
1041
1042        cdev_init(&bsg_cdev, &bsg_fops);
1043        ret = cdev_add(&bsg_cdev, MKDEV(bsg_major, 0), BSG_MAX_DEVS);
1044        if (ret)
1045                goto unregister_chrdev;
1046
1047        printk(KERN_INFO BSG_DESCRIPTION " version " BSG_VERSION
1048               " loaded (major %d)\n", bsg_major);
1049        return 0;
1050unregister_chrdev:
1051        unregister_chrdev_region(MKDEV(bsg_major, 0), BSG_MAX_DEVS);
1052destroy_bsg_class:
1053        class_destroy(bsg_class);
1054destroy_kmemcache:
1055        kmem_cache_destroy(bsg_cmd_cachep);
1056        return ret;
1057}
1058
1059MODULE_AUTHOR("Jens Axboe");
1060MODULE_DESCRIPTION(BSG_DESCRIPTION);
1061MODULE_LICENSE("GPL");
1062
1063device_initcall(bsg_init);
1064
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.