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                next_rq->cmd_type = rq->cmd_type;
 283
 284                dxferp = (void*)(unsigned long)hdr->din_xferp;
 285                ret =  blk_rq_map_user(q, next_rq, dxferp, hdr->din_xfer_len);
 286                if (ret)
 287                        goto out;
 288        }
 289
 290        if (hdr->dout_xfer_len) {
 291                dxfer_len = hdr->dout_xfer_len;
 292                dxferp = (void*)(unsigned long)hdr->dout_xferp;
 293        } else if (hdr->din_xfer_len) {
 294                dxfer_len = hdr->din_xfer_len;
 295                dxferp = (void*)(unsigned long)hdr->din_xferp;
 296        } else
 297                dxfer_len = 0;
 298
 299        if (dxfer_len) {
 300                ret = blk_rq_map_user(q, rq, dxferp, dxfer_len);
 301                if (ret)
 302                        goto out;
 303        }
 304        return rq;
 305out:
 306        blk_put_request(rq);
 307        if (next_rq) {
 308                blk_rq_unmap_user(next_rq->bio);
 309                blk_put_request(next_rq);
 310        }
 311        return ERR_PTR(ret);
 312}
 313
 314/*
 315 * async completion call-back from the block layer, when scsi/ide/whatever
 316 * calls end_that_request_last() on a request
 317 */
 318static void bsg_rq_end_io(struct request *rq, int uptodate)
 319{
 320        struct bsg_command *bc = rq->end_io_data;
 321        struct bsg_device *bd = bc->bd;
 322        unsigned long flags;
 323
 324        dprintk("%s: finished rq %p bc %p, bio %p stat %d\n",
 325                bd->name, rq, bc, bc->bio, uptodate);
 326
 327        bc->hdr.duration = jiffies_to_msecs(jiffies - bc->hdr.duration);
 328
 329        spin_lock_irqsave(&bd->lock, flags);
 330        list_move_tail(&bc->list, &bd->done_list);
 331        bd->done_cmds++;
 332        spin_unlock_irqrestore(&bd->lock, flags);
 333
 334        wake_up(&bd->wq_done);
 335}
 336
 337/*
 338 * do final setup of a 'bc' and submit the matching 'rq' to the block
 339 * layer for io
 340 */
 341static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,
 342                            struct bsg_command *bc, struct request *rq)
 343{
 344        rq->sense = bc->sense;
 345        rq->sense_len = 0;
 346
 347        /*
 348         * add bc command to busy queue and submit rq for io
 349         */
 350        bc->rq = rq;
 351        bc->bio = rq->bio;
 352        if (rq->next_rq)
 353                bc->bidi_bio = rq->next_rq->bio;
 354        bc->hdr.duration = jiffies;
 355        spin_lock_irq(&bd->lock);
 356        list_add_tail(&bc->list, &bd->busy_list);
 357        spin_unlock_irq(&bd->lock);
 358
 359        dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc);
 360
 361        rq->end_io_data = bc;
 362        blk_execute_rq_nowait(q, NULL, rq, 1, bsg_rq_end_io);
 363}
 364
 365static struct bsg_command *bsg_next_done_cmd(struct bsg_device *bd)
 366{
 367        struct bsg_command *bc = NULL;
 368
 369        spin_lock_irq(&bd->lock);
 370        if (bd->done_cmds) {
 371                bc = list_entry(bd->done_list.next, struct bsg_command, list);
 372                list_del(&bc->list);
 373                bd->done_cmds--;
 374        }
 375        spin_unlock_irq(&bd->lock);
 376
 377        return bc;
 378}
 379
 380/*
 381 * Get a finished command from the done list
 382 */
 383static struct bsg_command *bsg_get_done_cmd(struct bsg_device *bd)
 384{
 385        struct bsg_command *bc;
 386        int ret;
 387
 388        do {
 389                bc = bsg_next_done_cmd(bd);
 390                if (bc)
 391                        break;
 392
 393                if (!test_bit(BSG_F_BLOCK, &bd->flags)) {
 394                        bc = ERR_PTR(-EAGAIN);
 395                        break;
 396                }
 397
 398                ret = wait_event_interruptible(bd->wq_done, bd->done_cmds);
 399                if (ret) {
 400                        bc = ERR_PTR(-ERESTARTSYS);
 401                        break;
 402                }
 403        } while (1);
 404
 405        dprintk("%s: returning done %p\n", bd->name, bc);
 406
 407        return bc;
 408}
 409
 410static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
 411                                    struct bio *bio, struct bio *bidi_bio)
 412{
 413        int ret = 0;
 414
 415        dprintk("rq %p bio %p %u\n", rq, bio, rq->errors);
 416        /*
 417         * fill in all the output members
 418         */
 419        hdr->device_status = status_byte(rq->errors);
 420        hdr->transport_status = host_byte(rq->errors);
 421        hdr->driver_status = driver_byte(rq->errors);
 422        hdr->info = 0;
 423        if (hdr->device_status || hdr->transport_status || hdr->driver_status)
 424                hdr->info |= SG_INFO_CHECK;
 425        hdr->response_len = 0;
 426
 427        if (rq->sense_len && hdr->response) {
 428                int len = min_t(unsigned int, hdr->max_response_len,
 429                                        rq->sense_len);
 430
 431                ret = copy_to_user((void*)(unsigned long)hdr->response,
 432                                   rq->sense, len);
 433                if (!ret)
 434                        hdr->response_len = len;
 435                else
 436                        ret = -EFAULT;
 437        }
 438
 439        if (rq->next_rq) {
 440                hdr->dout_resid = rq->data_len;
 441                hdr->din_resid = rq->next_rq->data_len;
 442                blk_rq_unmap_user(bidi_bio);
 443                blk_put_request(rq->next_rq);
 444        } else if (rq_data_dir(rq) == READ)
 445                hdr->din_resid = rq->data_len;
 446        else
 447                hdr->dout_resid = rq->data_len;
 448
 449        /*
 450         * If the request generated a negative error number, return it
 451         * (providing we aren't already returning an error); if it's
 452         * just a protocol response (i.e. non negative), that gets
 453         * processed above.
 454         */
 455        if (!ret && rq->errors < 0)
 456                ret = rq->errors;
 457
 458        blk_rq_unmap_user(bio);
 459        blk_put_request(rq);
 460
 461        return ret;
 462}
 463
 464static int bsg_complete_all_commands(struct bsg_device *bd)
 465{
 466        struct bsg_command *bc;
 467        int ret, tret;
 468
 469        dprintk("%s: entered\n", bd->name);
 470
 471        set_bit(BSG_F_BLOCK, &bd->flags);
 472
 473        /*
 474         * wait for all commands to complete
 475         */
 476        ret = 0;
 477        do {
 478                ret = bsg_io_schedule(bd);
 479                /*
 480                 * look for -ENODATA specifically -- we'll sometimes get
 481                 * -ERESTARTSYS when we've taken a signal, but we can't
 482                 * return until we're done freeing the queue, so ignore
 483                 * it.  The signal will get handled when we're done freeing
 484                 * the bsg_device.
 485                 */
 486        } while (ret != -ENODATA);
 487
 488        /*
 489         * discard done commands
 490         */
 491        ret = 0;
 492        do {
 493                spin_lock_irq(&bd->lock);
 494                if (!bd->queued_cmds) {
 495                        spin_unlock_irq(&bd->lock);
 496                        break;
 497                }
 498                spin_unlock_irq(&bd->lock);
 499
 500                bc = bsg_get_done_cmd(bd);
 501                if (IS_ERR(bc))
 502                        break;
 503
 504                tret = blk_complete_sgv4_hdr_rq(bc->rq, &bc->hdr, bc->bio,
 505                                                bc->bidi_bio);
 506                if (!ret)
 507                        ret = tret;
 508
 509                bsg_free_command(bc);
 510        } while (1);
 511
 512        return ret;
 513}
 514
 515static int
 516__bsg_read(char __user *buf, size_t count, struct bsg_device *bd,
 517           const struct iovec *iov, ssize_t *bytes_read)
 518{
 519        struct bsg_command *bc;
 520        int nr_commands, ret;
 521
 522        if (count % sizeof(struct sg_io_v4))
 523                return -EINVAL;
 524
 525        ret = 0;
 526        nr_commands = count / sizeof(struct sg_io_v4);
 527        while (nr_commands) {
 528                bc = bsg_get_done_cmd(bd);
 529                if (IS_ERR(bc)) {
 530                        ret = PTR_ERR(bc);
 531                        break;
 532                }
 533
 534                /*
 535                 * this is the only case where we need to copy data back
 536                 * after completing the request. so do that here,
 537                 * bsg_complete_work() cannot do that for us
 538                 */
 539                ret = blk_complete_sgv4_hdr_rq(bc->rq, &bc->hdr, bc->bio,
 540                                               bc->bidi_bio);
 541
 542                if (copy_to_user(buf, &bc->hdr, sizeof(bc->hdr)))
 543                        ret = -EFAULT;
 544
 545                bsg_free_command(bc);
 546
 547                if (ret)
 548                        break;
 549
 550                buf += sizeof(struct sg_io_v4);
 551                *bytes_read += sizeof(struct sg_io_v4);
 552                nr_commands--;
 553        }
 554
 555        return ret;
 556}
 557
 558static inline void bsg_set_block(struct bsg_device *bd, struct file *file)
 559{
 560        if (file->f_flags & O_NONBLOCK)
 561                clear_bit(BSG_F_BLOCK, &bd->flags);
 562        else
 563                set_bit(BSG_F_BLOCK, &bd->flags);
 564}
 565
 566static inline void bsg_set_write_perm(struct bsg_device *bd, struct file *file)
 567{
 568        if (file->f_mode & FMODE_WRITE)
 569                set_bit(BSG_F_WRITE_PERM, &bd->flags);
 570        else
 571                clear_bit(BSG_F_WRITE_PERM, &bd->flags);
 572}
 573
 574/*
 575 * Check if the error is a "real" error that we should return.
 576 */
 577static inline int err_block_err(int ret)
 578{
 579        if (ret && ret != -ENOSPC && ret != -ENODATA && ret != -EAGAIN)
 580                return 1;
 581
 582        return 0;
 583}
 584
 585static ssize_t
 586bsg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 587{
 588        struct bsg_device *bd = file->private_data;
 589        int ret;
 590        ssize_t bytes_read;
 591
 592        dprintk("%s: read %Zd bytes\n", bd->name, count);
 593
 594        bsg_set_block(bd, file);
 595        bytes_read = 0;
 596        ret = __bsg_read(buf, count, bd, NULL, &bytes_read);
 597        *ppos = bytes_read;
 598
 599        if (!bytes_read || (bytes_read && err_block_err(ret)))
 600                bytes_read = ret;
 601
 602        return bytes_read;
 603}
 604
 605static int __bsg_write(struct bsg_device *bd, const char __user *buf,
 606                       size_t count, ssize_t *bytes_written)
 607{
 608        struct bsg_command *bc;
 609        struct request *rq;
 610        int ret, nr_commands;
 611
 612        if (count % sizeof(struct sg_io_v4))
 613                return -EINVAL;
 614
 615        nr_commands = count / sizeof(struct sg_io_v4);
 616        rq = NULL;
 617        bc = NULL;
 618        ret = 0;
 619        while (nr_commands) {
 620                struct request_queue *q = bd->queue;
 621
 622                bc = bsg_alloc_command(bd);
 623                if (IS_ERR(bc)) {
 624                        ret = PTR_ERR(bc);
 625                        bc = NULL;
 626                        break;
 627                }
 628
 629                if (copy_from_user(&bc->hdr, buf, sizeof(bc->hdr))) {
 630                        ret = -EFAULT;
 631                        break;
 632                }
 633
 634                /*
 635                 * get a request, fill in the blanks, and add to request queue
 636                 */
 637                rq = bsg_map_hdr(bd, &bc->hdr);
 638                if (IS_ERR(rq)) {
 639                        ret = PTR_ERR(rq);
 640                        rq = NULL;
 641                        break;
 642                }
 643
 644                bsg_add_command(bd, q, bc, rq);
 645                bc = NULL;
 646                rq = NULL;
 647                nr_commands--;
 648                buf += sizeof(struct sg_io_v4);
 649                *bytes_written += sizeof(struct sg_io_v4);
 650        }
 651
 652        if (bc)
 653                bsg_free_command(bc);
 654
 655        return ret;
 656}
 657
 658static ssize_t
 659bsg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
 660{
 661        struct bsg_device *bd = file->private_data;
 662        ssize_t bytes_written;
 663        int ret;
 664
 665        dprintk("%s: write %Zd bytes\n", bd->name, count);
 666
 667        bsg_set_block(bd, file);
 668        bsg_set_write_perm(bd, file);
 669
 670        bytes_written = 0;
 671        ret = __bsg_write(bd, buf, count, &bytes_written);
 672        *ppos = bytes_written;
 673
 674        /*
 675         * return bytes written on non-fatal errors
 676         */
 677        if (!bytes_written || (bytes_written && err_block_err(ret)))
 678                bytes_written = ret;
 679
 680        dprintk("%s: returning %Zd\n", bd->name, bytes_written);
 681        return bytes_written;
 682}
 683
 684static struct bsg_device *bsg_alloc_device(void)
 685{
 686        struct bsg_device *bd;
 687
 688        bd = kzalloc(sizeof(struct bsg_device), GFP_KERNEL);
 689        if (unlikely(!bd))
 690                return NULL;
 691
 692        spin_lock_init(&bd->lock);
 693
 694        bd->max_queue = BSG_DEFAULT_CMDS;
 695
 696        INIT_LIST_HEAD(&bd->busy_list);
 697        INIT_LIST_HEAD(&bd->done_list);
 698        INIT_HLIST_NODE(&bd->dev_list);
 699
 700        init_waitqueue_head(&bd->wq_free);
 701        init_waitqueue_head(&bd->wq_done);
 702        return bd;
 703}
 704
 705static int bsg_put_device(struct bsg_device *bd)
 706{
 707        int ret = 0;
 708
 709        mutex_lock(&bsg_mutex);
 710
 711        if (!atomic_dec_and_test(&bd->ref_count))
 712                goto out;
 713
 714        dprintk("%s: tearing down\n", bd->name);
 715
 716        /*
 717         * close can always block
 718         */
 719        set_bit(BSG_F_BLOCK, &bd->flags);
 720
 721        /*
 722         * correct error detection baddies here again. it's the responsibility
 723         * of the app to properly reap commands before close() if it wants
 724         * fool-proof error detection
 725         */
 726        ret = bsg_complete_all_commands(bd);
 727
 728        blk_put_queue(bd->queue);
 729        hlist_del(&bd->dev_list);
 730        kfree(bd);
 731out:
 732        mutex_unlock(&bsg_mutex);
 733        return ret;
 734}
 735
 736static struct bsg_device *bsg_add_device(struct inode *inode,
 737                                         struct request_queue *rq,
 738                                         struct file *file)
 739{
 740        struct bsg_device *bd;
 741#ifdef BSG_DEBUG
 742        unsigned char buf[32];
 743#endif
 744
 745        bd = bsg_alloc_device();
 746        if (!bd)
 747                return ERR_PTR(-ENOMEM);
 748
 749        bd->queue = rq;
 750        kobject_get(&rq->kobj);
 751        bsg_set_block(bd, file);
 752
 753        atomic_set(&bd->ref_count, 1);
 754        bd->minor = iminor(inode);
 755        mutex_lock(&bsg_mutex);
 756        hlist_add_head(&bd->dev_list, bsg_dev_idx_hash(bd->minor));
 757
 758        strncpy(bd->name, rq->bsg_dev.class_dev->class_id, sizeof(bd->name) - 1);
 759        dprintk("bound to <%s>, max queue %d\n",
 760                format_dev_t(buf, inode->i_rdev), bd->max_queue);
 761
 762        mutex_unlock(&bsg_mutex);
 763        return bd;
 764}
 765
 766static struct bsg_device *__bsg_get_device(int minor)
 767{
 768        struct bsg_device *bd = NULL;
 769        struct hlist_node *entry;
 770
 771        mutex_lock(&bsg_mutex);
 772
 773        hlist_for_each(entry, bsg_dev_idx_hash(minor)) {
 774                bd = hlist_entry(entry, struct bsg_device, dev_list);
 775                if (bd->minor == minor) {
 776                        atomic_inc(&bd->ref_count);
 777                        break;
 778                }
 779
 780                bd = NULL;
 781        }
 782
 783        mutex_unlock(&bsg_mutex);
 784        return bd;
 785}
 786
 787static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file)
 788{
 789        struct bsg_device *bd;
 790        struct bsg_class_device *bcd;
 791
 792        bd = __bsg_get_device(iminor(inode));
 793        if (bd)
 794                return bd;
 795
 796        /*
 797         * find the class device
 798         */
 799        mutex_lock(&bsg_mutex);
 800        bcd = idr_find(&bsg_minor_idr, iminor(inode));
 801        mutex_unlock(&bsg_mutex);
 802
 803        if (!bcd)
 804                return ERR_PTR(-ENODEV);
 805
 806        return bsg_add_device(inode, bcd->queue, file);
 807}
 808
 809static int bsg_open(struct inode *inode, struct file *file)
 810{
 811        struct bsg_device *bd = bsg_get_device(inode, file);
 812
 813        if (IS_ERR(bd))
 814                return PTR_ERR(bd);
 815
 816        file->private_data = bd;
 817        return 0;
 818}
 819
 820static int bsg_release(struct inode *inode, struct file *file)
 821{
 822        struct bsg_device *bd = file->private_data;
 823
 824        file->private_data = NULL;
 825        return bsg_put_device(bd);
 826}
 827
 828static unsigned int bsg_poll(struct file *file, poll_table *wait)
 829{
 830        struct bsg_device *bd = file->private_data;
 831        unsigned int mask = 0;
 832
 833        poll_wait(file, &bd->wq_done, wait);
 834        poll_wait(file, &bd->wq_free, wait);
 835
 836        spin_lock_irq(&bd->lock);
 837        if (!list_empty(&bd->done_list))
 838                mask |= POLLIN | POLLRDNORM;
 839        if (bd->queued_cmds >= bd->max_queue)
 840                mask |= POLLOUT;
 841        spin_unlock_irq(&bd->lock);
 842
 843        return mask;
 844}
 845
 846static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 847{
 848        struct bsg_device *bd = file->private_data;
 849        int __user *uarg = (int __user *) arg;
 850        int ret;
 851
 852        switch (cmd) {
 853                /*
 854                 * our own ioctls
 855                 */
 856        case SG_GET_COMMAND_Q:
 857                return put_user(bd->max_queue, uarg);
 858        case SG_SET_COMMAND_Q: {
 859                int queue;
 860
 861                if (get_user(queue, uarg))
 862                        return -EFAULT;
 863                if (queue < 1)
 864                        return -EINVAL;
 865
 866                spin_lock_irq(&bd->lock);
 867                bd->max_queue = queue;
 868                spin_unlock_irq(&bd->lock);
 869                return 0;
 870        }
 871
 872        /*
 873         * SCSI/sg ioctls
 874         */
 875        case SG_GET_VERSION_NUM:
 876        case SCSI_IOCTL_GET_IDLUN:
 877        case SCSI_IOCTL_GET_BUS_NUMBER:
 878        case SG_SET_TIMEOUT:
 879        case SG_GET_TIMEOUT:
 880        case SG_GET_RESERVED_SIZE:
 881        case SG_SET_RESERVED_SIZE:
 882        case SG_EMULATED_HOST:
 883        case SCSI_IOCTL_SEND_COMMAND: {
 884                void __user *uarg = (void __user *) arg;
 885                return scsi_cmd_ioctl(file, bd->queue, NULL, cmd, uarg);
 886        }
 887        case SG_IO: {
 888                struct request *rq;
 889                struct bio *bio, *bidi_bio = NULL;
 890                struct sg_io_v4 hdr;
 891
 892                if (copy_from_user(&hdr, uarg, sizeof(hdr)))
 893                        return -EFAULT;
 894
 895                rq = bsg_map_hdr(bd, &hdr);
 896                if (IS_ERR(rq))
 897                        return PTR_ERR(rq);
 898
 899                bio = rq->bio;
 900                if (rq->next_rq)
 901                        bidi_bio = rq->next_rq->bio;
 902                blk_execute_rq(bd->queue, NULL, rq, 0);
 903                ret = blk_complete_sgv4_hdr_rq(rq, &hdr, bio, bidi_bio);
 904
 905                if (copy_to_user(uarg, &hdr, sizeof(hdr)))
 906                        return -EFAULT;
 907
 908                return ret;
 909        }
 910        /*
 911         * block device ioctls
 912         */
 913        default:
 914#if 0
 915                return ioctl_by_bdev(bd->bdev, cmd, arg);
 916#else
 917                return -ENOTTY;
 918#endif
 919        }
 920}
 921
 922static const struct file_operations bsg_fops = {
 923        .read           =       bsg_read,
 924        .write          =       bsg_write,
 925        .poll           =       bsg_poll,
 926        .open           =       bsg_open,
 927        .release        =       bsg_release,
 928        .unlocked_ioctl =       bsg_ioctl,
 929        .owner          =       THIS_MODULE,
 930};
 931
 932void bsg_unregister_queue(struct request_queue *q)
 933{
 934        struct bsg_class_device *bcd = &q->bsg_dev;
 935
 936        if (!bcd->class_dev)
 937                return;
 938
 939        mutex_lock(&bsg_mutex);
 940        idr_remove(&bsg_minor_idr, bcd->minor);
 941        sysfs_remove_link(&q->kobj, "bsg");
 942        class_device_unregister(bcd->class_dev);
 943        put_device(bcd->dev);
 944        bcd->class_dev = NULL;
 945        bcd->dev = NULL;
 946        mutex_unlock(&bsg_mutex);
 947}
 948EXPORT_SYMBOL_GPL(bsg_unregister_queue);
 949
 950int bsg_register_queue(struct request_queue *q, struct device *gdev,
 951                       const char *name)
 952{
 953        struct bsg_class_device *bcd;
 954        dev_t dev;
 955        int ret, minor;
 956        struct class_device *class_dev = NULL;
 957        const char *devname;
 958
 959        if (name)
 960                devname = name;
 961        else
 962                devname = gdev->bus_id;
 963
 964        /*
 965         * we need a proper transport to send commands, not a stacked device
 966         */
 967        if (!q->request_fn)
 968                return 0;
 969
 970        bcd = &q->bsg_dev;
 971        memset(bcd, 0, sizeof(*bcd));
 972
 973        mutex_lock(&bsg_mutex);
 974
 975        ret = idr_pre_get(&bsg_minor_idr, GFP_KERNEL);
 976        if (!ret) {
 977                ret = -ENOMEM;
 978                goto unlock;
 979        }
 980
 981        ret = idr_get_new(&bsg_minor_idr, bcd, &minor);
 982        if (ret < 0)
 983                goto unlock;
 984
 985        if (minor >= BSG_MAX_DEVS) {
 986                printk(KERN_ERR "bsg: too many bsg devices\n");
 987                ret = -EINVAL;
 988                goto remove_idr;
 989        }
 990
 991        bcd->minor = minor;
 992        bcd->queue = q;
 993        bcd->dev = get_device(gdev);
 994        dev = MKDEV(bsg_major, bcd->minor);
 995        class_dev = class_device_create(bsg_class, NULL, dev, gdev, "%s",
 996                                        devname);
 997        if (IS_ERR(class_dev)) {
 998                ret = PTR_ERR(class_dev);
 999                goto put_dev;
1000        }
1001        bcd->class_dev = class_dev;
1002
1003        if (q->kobj.sd) {
1004                ret = sysfs_create_link(&q->kobj, &bcd->class_dev->kobj, "bsg");
1005                if (ret)
1006                        goto unregister_class_dev;
1007        }
1008
1009        mutex_unlock(&bsg_mutex);
1010        return 0;
1011
1012unregister_class_dev:
1013        class_device_unregister(class_dev);
1014put_dev:
1015        put_device(gdev);
1016remove_idr:
1017        idr_remove(&bsg_minor_idr, minor);
1018unlock:
1019        mutex_unlock(&bsg_mutex);
1020        return ret;
1021}
1022EXPORT_SYMBOL_GPL(bsg_register_queue);
1023
1024static struct cdev bsg_cdev;
1025
1026static int __init bsg_init(void)
1027{
1028        int ret, i;
1029        dev_t devid;
1030
1031        bsg_cmd_cachep = kmem_cache_create("bsg_cmd",
1032                                sizeof(struct bsg_command), 0, 0, NULL);
1033        if (!bsg_cmd_cachep) {
1034                printk(KERN_ERR "bsg: failed creating slab cache\n");
1035                return -ENOMEM;
1036        }
1037
1038        for (i = 0; i < BSG_LIST_ARRAY_SIZE; i++)
1039                INIT_HLIST_HEAD(&bsg_device_list[i]);
1040
1041        bsg_class = class_create(THIS_MODULE, "bsg");
1042        if (IS_ERR(bsg_class)) {
1043                ret = PTR_ERR(bsg_class);
1044                goto destroy_kmemcache;
1045        }
1046
1047        ret = alloc_chrdev_region(&devid, 0, BSG_MAX_DEVS, "bsg");
1048        if (ret)
1049                goto destroy_bsg_class;
1050
1051        bsg_major = MAJOR(devid);
1052
1053        cdev_init(&bsg_cdev, &bsg_fops);
1054        ret = cdev_add(&bsg_cdev, MKDEV(bsg_major, 0), BSG_MAX_DEVS);
1055        if (ret)
1056                goto unregister_chrdev;
1057
1058        printk(KERN_INFO BSG_DESCRIPTION " version " BSG_VERSION
1059               " loaded (major %d)\n", bsg_major);
1060        return 0;
1061unregister_chrdev:
1062        unregister_chrdev_region(MKDEV(bsg_major, 0), BSG_MAX_DEVS);
1063destroy_bsg_class:
1064        class_destroy(bsg_class);
1065destroy_kmemcache:
1066        kmem_cache_destroy(bsg_cmd_cachep);
1067        return ret;
1068}
1069
1070MODULE_AUTHOR("Jens Axboe");
1071MODULE_DESCRIPTION(BSG_DESCRIPTION);
1072MODULE_LICENSE("GPL");
1073
1074device_initcall(bsg_init);
1075
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.