Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block

* 'for-linus' of git://git.kernel.dk/linux-2.6-block:
block: remove blk_queue_tag_depth() and blk_queue_tag_queue()
block: remove unused ->busy part of the block queue tag map
bio: fix __bio_copy_iov() handling of bio->bv_len
bio: fix bio_copy_kern() handling of bio->bv_len
block: submit_bh() inadvertently discards barrier flag on a sync write
block: clean up cmdfilter sysfs interface
block: rename blk_scsi_cmd_filter to blk_cmd_filter
sg: restore command permission for TYPE_SCANNER
block: move cmdfilter from gendisk to request_queue

+224 -226
+2
block/blk-core.c
··· 582 582 583 583 q->sg_reserved_size = INT_MAX; 584 584 585 + blk_set_cmd_filter_defaults(&q->cmd_filter); 586 + 585 587 /* 586 588 * all done 587 589 */
+2 -4
block/blk-tag.c
··· 38 38 39 39 retval = atomic_dec_and_test(&bqt->refcnt); 40 40 if (retval) { 41 - BUG_ON(bqt->busy); 41 + BUG_ON(find_first_bit(bqt->tag_map, bqt->max_depth) < 42 + bqt->max_depth); 42 43 43 44 kfree(bqt->tag_index); 44 45 bqt->tag_index = NULL; ··· 148 147 if (init_tag_map(q, tags, depth)) 149 148 goto fail; 150 149 151 - tags->busy = 0; 152 150 atomic_set(&tags->refcnt, 1); 153 151 return tags; 154 152 fail: ··· 313 313 * unlock memory barrier semantics. 314 314 */ 315 315 clear_bit_unlock(tag, bqt->tag_map); 316 - bqt->busy--; 317 316 } 318 317 EXPORT_SYMBOL(blk_queue_end_tag); 319 318 ··· 367 368 bqt->tag_index[tag] = rq; 368 369 blkdev_dequeue_request(rq); 369 370 list_add(&rq->queuelist, &q->tag_busy_list); 370 - bqt->busy++; 371 371 return 0; 372 372 } 373 373 EXPORT_SYMBOL(blk_queue_start_tag);
+11 -33
block/bsg.c
··· 45 45 char name[BUS_ID_SIZE]; 46 46 int max_queue; 47 47 unsigned long flags; 48 - struct blk_scsi_cmd_filter *cmd_filter; 49 - mode_t *f_mode; 50 48 }; 51 49 52 50 enum { ··· 172 174 } 173 175 174 176 static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, 175 - struct sg_io_v4 *hdr, struct bsg_device *bd) 177 + struct sg_io_v4 *hdr, struct bsg_device *bd, 178 + int has_write_perm) 176 179 { 177 180 if (hdr->request_len > BLK_MAX_CDB) { 178 181 rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL); ··· 186 187 return -EFAULT; 187 188 188 189 if (hdr->subprotocol == BSG_SUB_PROTOCOL_SCSI_CMD) { 189 - if (blk_cmd_filter_verify_command(bd->cmd_filter, rq->cmd, 190 - bd->f_mode)) 190 + if (blk_verify_command(&q->cmd_filter, rq->cmd, has_write_perm)) 191 191 return -EPERM; 192 192 } else if (!capable(CAP_SYS_RAWIO)) 193 193 return -EPERM; ··· 242 244 * map sg_io_v4 to a request. 243 245 */ 244 246 static struct request * 245 - bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr) 247 + bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, int has_write_perm) 246 248 { 247 249 struct request_queue *q = bd->queue; 248 250 struct request *rq, *next_rq = NULL; ··· 264 266 rq = blk_get_request(q, rw, GFP_KERNEL); 265 267 if (!rq) 266 268 return ERR_PTR(-ENOMEM); 267 - ret = blk_fill_sgv4_hdr_rq(q, rq, hdr, bd); 269 + ret = blk_fill_sgv4_hdr_rq(q, rq, hdr, bd, has_write_perm); 268 270 if (ret) 269 271 goto out; 270 272 ··· 566 568 set_bit(BSG_F_BLOCK, &bd->flags); 567 569 } 568 570 569 - static void bsg_set_cmd_filter(struct bsg_device *bd, 570 - struct file *file) 571 - { 572 - struct inode *inode; 573 - struct gendisk *disk; 574 - 575 - if (!file) 576 - return; 577 - 578 - inode = file->f_dentry->d_inode; 579 - if (!inode) 580 - return; 581 - 582 - disk = inode->i_bdev->bd_disk; 583 - 584 - bd->cmd_filter = &disk->cmd_filter; 585 - bd->f_mode = &file->f_mode; 586 - } 587 - 588 571 /* 589 572 * Check if the error is a "real" error that we should return. 590 573 */ ··· 587 608 dprintk("%s: read %Zd bytes\n", bd->name, count); 588 609 589 610 bsg_set_block(bd, file); 590 - bsg_set_cmd_filter(bd, file); 591 611 592 612 bytes_read = 0; 593 613 ret = __bsg_read(buf, count, bd, NULL, &bytes_read); ··· 599 621 } 600 622 601 623 static int __bsg_write(struct bsg_device *bd, const char __user *buf, 602 - size_t count, ssize_t *bytes_written) 624 + size_t count, ssize_t *bytes_written, int has_write_perm) 603 625 { 604 626 struct bsg_command *bc; 605 627 struct request *rq; ··· 630 652 /* 631 653 * get a request, fill in the blanks, and add to request queue 632 654 */ 633 - rq = bsg_map_hdr(bd, &bc->hdr); 655 + rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm); 634 656 if (IS_ERR(rq)) { 635 657 ret = PTR_ERR(rq); 636 658 rq = NULL; ··· 661 683 dprintk("%s: write %Zd bytes\n", bd->name, count); 662 684 663 685 bsg_set_block(bd, file); 664 - bsg_set_cmd_filter(bd, file); 665 686 666 687 bytes_written = 0; 667 - ret = __bsg_write(bd, buf, count, &bytes_written); 688 + ret = __bsg_write(bd, buf, count, &bytes_written, 689 + file->f_mode & FMODE_WRITE); 690 + 668 691 *ppos = bytes_written; 669 692 670 693 /* ··· 771 792 bd->queue = rq; 772 793 773 794 bsg_set_block(bd, file); 774 - bsg_set_cmd_filter(bd, file); 775 795 776 796 atomic_set(&bd->ref_count, 1); 777 797 mutex_lock(&bsg_mutex); ··· 921 943 if (copy_from_user(&hdr, uarg, sizeof(hdr))) 922 944 return -EFAULT; 923 945 924 - rq = bsg_map_hdr(bd, &hdr); 946 + rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE); 925 947 if (IS_ERR(rq)) 926 948 return PTR_ERR(rq); 927 949
+49 -149
block/cmd-filter.c
··· 20 20 #include <linux/list.h> 21 21 #include <linux/genhd.h> 22 22 #include <linux/spinlock.h> 23 - #include <linux/parser.h> 24 23 #include <linux/capability.h> 25 24 #include <linux/bitops.h> 26 25 27 26 #include <scsi/scsi.h> 28 27 #include <linux/cdrom.h> 29 28 30 - int blk_cmd_filter_verify_command(struct blk_scsi_cmd_filter *filter, 31 - unsigned char *cmd, mode_t *f_mode) 29 + int blk_verify_command(struct blk_cmd_filter *filter, 30 + unsigned char *cmd, int has_write_perm) 32 31 { 33 32 /* root can do any command. */ 34 33 if (capable(CAP_SYS_RAWIO)) ··· 42 43 return 0; 43 44 44 45 /* Write-safe commands require a writable open */ 45 - if (test_bit(cmd[0], filter->write_ok) && (*f_mode & FMODE_WRITE)) 46 + if (test_bit(cmd[0], filter->write_ok) && has_write_perm) 46 47 return 0; 47 48 48 49 return -EPERM; 49 50 } 50 - EXPORT_SYMBOL(blk_cmd_filter_verify_command); 51 - 52 - int blk_verify_command(struct file *file, unsigned char *cmd) 53 - { 54 - struct gendisk *disk; 55 - struct inode *inode; 56 - 57 - if (!file) 58 - return -EINVAL; 59 - 60 - inode = file->f_dentry->d_inode; 61 - if (!inode) 62 - return -EINVAL; 63 - 64 - disk = inode->i_bdev->bd_disk; 65 - 66 - return blk_cmd_filter_verify_command(&disk->cmd_filter, 67 - cmd, &file->f_mode); 68 - } 69 51 EXPORT_SYMBOL(blk_verify_command); 70 52 71 53 /* and now, the sysfs stuff */ 72 - static ssize_t rcf_cmds_show(struct blk_scsi_cmd_filter *filter, char *page, 54 + static ssize_t rcf_cmds_show(struct blk_cmd_filter *filter, char *page, 73 55 int rw) 74 56 { 75 57 char *npage = page; ··· 64 84 65 85 for (i = 0; i < BLK_SCSI_MAX_CMDS; i++) { 66 86 if (test_bit(i, okbits)) { 67 - sprintf(npage, "%02x", i); 68 - npage += 2; 87 + npage += sprintf(npage, "0x%02x", i); 69 88 if (i < BLK_SCSI_MAX_CMDS - 1) 70 89 sprintf(npage++, " "); 71 90 } ··· 76 97 return npage - page; 77 98 } 78 99 79 - static ssize_t rcf_readcmds_show(struct blk_scsi_cmd_filter *filter, char *page) 100 + static ssize_t rcf_readcmds_show(struct blk_cmd_filter *filter, char *page) 80 101 { 81 102 return rcf_cmds_show(filter, page, READ); 82 103 } 83 104 84 - static ssize_t rcf_writecmds_show(struct blk_scsi_cmd_filter *filter, 105 + static ssize_t rcf_writecmds_show(struct blk_cmd_filter *filter, 85 106 char *page) 86 107 { 87 108 return rcf_cmds_show(filter, page, WRITE); 88 109 } 89 110 90 - static ssize_t rcf_cmds_store(struct blk_scsi_cmd_filter *filter, 111 + static ssize_t rcf_cmds_store(struct blk_cmd_filter *filter, 91 112 const char *page, size_t count, int rw) 92 113 { 93 - ssize_t ret = 0; 94 114 unsigned long okbits[BLK_SCSI_CMD_PER_LONG], *target_okbits; 95 - int cmd, status, len; 96 - substring_t ss; 115 + int cmd, set; 116 + char *p, *status; 97 117 98 - memset(&okbits, 0, sizeof(okbits)); 99 - 100 - for (len = strlen(page); len > 0; len -= 3) { 101 - if (len < 2) 102 - break; 103 - ss.from = (char *) page + ret; 104 - ss.to = (char *) page + ret + 2; 105 - ret += 3; 106 - status = match_hex(&ss, &cmd); 107 - /* either of these cases means invalid input, so do nothing. */ 108 - if (status || cmd >= BLK_SCSI_MAX_CMDS) 109 - return -EINVAL; 110 - 111 - __set_bit(cmd, okbits); 118 + if (rw == READ) { 119 + memcpy(&okbits, filter->read_ok, sizeof(okbits)); 120 + target_okbits = filter->read_ok; 121 + } else { 122 + memcpy(&okbits, filter->write_ok, sizeof(okbits)); 123 + target_okbits = filter->write_ok; 112 124 } 113 125 114 - if (rw == READ) 115 - target_okbits = filter->read_ok; 116 - else 117 - target_okbits = filter->write_ok; 126 + while ((p = strsep((char **)&page, " ")) != NULL) { 127 + set = 1; 118 128 119 - memmove(target_okbits, okbits, sizeof(okbits)); 129 + if (p[0] == '+') { 130 + p++; 131 + } else if (p[0] == '-') { 132 + set = 0; 133 + p++; 134 + } 135 + 136 + cmd = simple_strtol(p, &status, 16); 137 + 138 + /* either of these cases means invalid input, so do nothing. */ 139 + if ((status == p) || cmd >= BLK_SCSI_MAX_CMDS) 140 + return -EINVAL; 141 + 142 + if (set) 143 + __set_bit(cmd, okbits); 144 + else 145 + __clear_bit(cmd, okbits); 146 + } 147 + 148 + memcpy(target_okbits, okbits, sizeof(okbits)); 120 149 return count; 121 150 } 122 151 123 - static ssize_t rcf_readcmds_store(struct blk_scsi_cmd_filter *filter, 152 + static ssize_t rcf_readcmds_store(struct blk_cmd_filter *filter, 124 153 const char *page, size_t count) 125 154 { 126 155 return rcf_cmds_store(filter, page, count, READ); 127 156 } 128 157 129 - static ssize_t rcf_writecmds_store(struct blk_scsi_cmd_filter *filter, 158 + static ssize_t rcf_writecmds_store(struct blk_cmd_filter *filter, 130 159 const char *page, size_t count) 131 160 { 132 161 return rcf_cmds_store(filter, page, count, WRITE); ··· 142 155 143 156 struct rcf_sysfs_entry { 144 157 struct attribute attr; 145 - ssize_t (*show)(struct blk_scsi_cmd_filter *, char *); 146 - ssize_t (*store)(struct blk_scsi_cmd_filter *, const char *, size_t); 158 + ssize_t (*show)(struct blk_cmd_filter *, char *); 159 + ssize_t (*store)(struct blk_cmd_filter *, const char *, size_t); 147 160 }; 148 161 149 162 static struct rcf_sysfs_entry rcf_readcmds_entry = { ··· 170 183 rcf_attr_show(struct kobject *kobj, struct attribute *attr, char *page) 171 184 { 172 185 struct rcf_sysfs_entry *entry = to_rcf(attr); 173 - struct blk_scsi_cmd_filter *filter; 186 + struct blk_cmd_filter *filter; 174 187 175 - filter = container_of(kobj, struct blk_scsi_cmd_filter, kobj); 188 + filter = container_of(kobj, struct blk_cmd_filter, kobj); 176 189 if (entry->show) 177 190 return entry->show(filter, page); 178 191 ··· 184 197 const char *page, size_t length) 185 198 { 186 199 struct rcf_sysfs_entry *entry = to_rcf(attr); 187 - struct blk_scsi_cmd_filter *filter; 200 + struct blk_cmd_filter *filter; 188 201 189 202 if (!capable(CAP_SYS_RAWIO)) 190 203 return -EPERM; ··· 192 205 if (!entry->store) 193 206 return -EINVAL; 194 207 195 - filter = container_of(kobj, struct blk_scsi_cmd_filter, kobj); 208 + filter = container_of(kobj, struct blk_cmd_filter, kobj); 196 209 return entry->store(filter, page, length); 197 210 } 198 211 ··· 206 219 .default_attrs = default_attrs, 207 220 }; 208 221 209 - #ifndef MAINTENANCE_IN_CMD 210 - #define MAINTENANCE_IN_CMD 0xa3 211 - #endif 212 - 213 - static void rcf_set_defaults(struct blk_scsi_cmd_filter *filter) 214 - { 215 - /* Basic read-only commands */ 216 - __set_bit(TEST_UNIT_READY, filter->read_ok); 217 - __set_bit(REQUEST_SENSE, filter->read_ok); 218 - __set_bit(READ_6, filter->read_ok); 219 - __set_bit(READ_10, filter->read_ok); 220 - __set_bit(READ_12, filter->read_ok); 221 - __set_bit(READ_16, filter->read_ok); 222 - __set_bit(READ_BUFFER, filter->read_ok); 223 - __set_bit(READ_DEFECT_DATA, filter->read_ok); 224 - __set_bit(READ_CAPACITY, filter->read_ok); 225 - __set_bit(READ_LONG, filter->read_ok); 226 - __set_bit(INQUIRY, filter->read_ok); 227 - __set_bit(MODE_SENSE, filter->read_ok); 228 - __set_bit(MODE_SENSE_10, filter->read_ok); 229 - __set_bit(LOG_SENSE, filter->read_ok); 230 - __set_bit(START_STOP, filter->read_ok); 231 - __set_bit(GPCMD_VERIFY_10, filter->read_ok); 232 - __set_bit(VERIFY_16, filter->read_ok); 233 - __set_bit(REPORT_LUNS, filter->read_ok); 234 - __set_bit(SERVICE_ACTION_IN, filter->read_ok); 235 - __set_bit(RECEIVE_DIAGNOSTIC, filter->read_ok); 236 - __set_bit(MAINTENANCE_IN_CMD, filter->read_ok); 237 - __set_bit(GPCMD_READ_BUFFER_CAPACITY, filter->read_ok); 238 - 239 - /* Audio CD commands */ 240 - __set_bit(GPCMD_PLAY_CD, filter->read_ok); 241 - __set_bit(GPCMD_PLAY_AUDIO_10, filter->read_ok); 242 - __set_bit(GPCMD_PLAY_AUDIO_MSF, filter->read_ok); 243 - __set_bit(GPCMD_PLAY_AUDIO_TI, filter->read_ok); 244 - __set_bit(GPCMD_PAUSE_RESUME, filter->read_ok); 245 - 246 - /* CD/DVD data reading */ 247 - __set_bit(GPCMD_READ_CD, filter->read_ok); 248 - __set_bit(GPCMD_READ_CD_MSF, filter->read_ok); 249 - __set_bit(GPCMD_READ_DISC_INFO, filter->read_ok); 250 - __set_bit(GPCMD_READ_CDVD_CAPACITY, filter->read_ok); 251 - __set_bit(GPCMD_READ_DVD_STRUCTURE, filter->read_ok); 252 - __set_bit(GPCMD_READ_HEADER, filter->read_ok); 253 - __set_bit(GPCMD_READ_TRACK_RZONE_INFO, filter->read_ok); 254 - __set_bit(GPCMD_READ_SUBCHANNEL, filter->read_ok); 255 - __set_bit(GPCMD_READ_TOC_PMA_ATIP, filter->read_ok); 256 - __set_bit(GPCMD_REPORT_KEY, filter->read_ok); 257 - __set_bit(GPCMD_SCAN, filter->read_ok); 258 - __set_bit(GPCMD_GET_CONFIGURATION, filter->read_ok); 259 - __set_bit(GPCMD_READ_FORMAT_CAPACITIES, filter->read_ok); 260 - __set_bit(GPCMD_GET_EVENT_STATUS_NOTIFICATION, filter->read_ok); 261 - __set_bit(GPCMD_GET_PERFORMANCE, filter->read_ok); 262 - __set_bit(GPCMD_SEEK, filter->read_ok); 263 - __set_bit(GPCMD_STOP_PLAY_SCAN, filter->read_ok); 264 - 265 - /* Basic writing commands */ 266 - __set_bit(WRITE_6, filter->write_ok); 267 - __set_bit(WRITE_10, filter->write_ok); 268 - __set_bit(WRITE_VERIFY, filter->write_ok); 269 - __set_bit(WRITE_12, filter->write_ok); 270 - __set_bit(WRITE_VERIFY_12, filter->write_ok); 271 - __set_bit(WRITE_16, filter->write_ok); 272 - __set_bit(WRITE_LONG, filter->write_ok); 273 - __set_bit(WRITE_LONG_2, filter->write_ok); 274 - __set_bit(ERASE, filter->write_ok); 275 - __set_bit(GPCMD_MODE_SELECT_10, filter->write_ok); 276 - __set_bit(MODE_SELECT, filter->write_ok); 277 - __set_bit(LOG_SELECT, filter->write_ok); 278 - __set_bit(GPCMD_BLANK, filter->write_ok); 279 - __set_bit(GPCMD_CLOSE_TRACK, filter->write_ok); 280 - __set_bit(GPCMD_FLUSH_CACHE, filter->write_ok); 281 - __set_bit(GPCMD_FORMAT_UNIT, filter->write_ok); 282 - __set_bit(GPCMD_REPAIR_RZONE_TRACK, filter->write_ok); 283 - __set_bit(GPCMD_RESERVE_RZONE_TRACK, filter->write_ok); 284 - __set_bit(GPCMD_SEND_DVD_STRUCTURE, filter->write_ok); 285 - __set_bit(GPCMD_SEND_EVENT, filter->write_ok); 286 - __set_bit(GPCMD_SEND_KEY, filter->write_ok); 287 - __set_bit(GPCMD_SEND_OPC, filter->write_ok); 288 - __set_bit(GPCMD_SEND_CUE_SHEET, filter->write_ok); 289 - __set_bit(GPCMD_SET_SPEED, filter->write_ok); 290 - __set_bit(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, filter->write_ok); 291 - __set_bit(GPCMD_LOAD_UNLOAD, filter->write_ok); 292 - __set_bit(GPCMD_SET_STREAMING, filter->write_ok); 293 - } 294 - 295 222 int blk_register_filter(struct gendisk *disk) 296 223 { 297 224 int ret; 298 - struct blk_scsi_cmd_filter *filter = &disk->cmd_filter; 225 + struct blk_cmd_filter *filter = &disk->queue->cmd_filter; 299 226 struct kobject *parent = kobject_get(disk->holder_dir->parent); 300 227 301 228 if (!parent) 302 229 return -ENODEV; 303 230 304 231 ret = kobject_init_and_add(&filter->kobj, &rcf_ktype, parent, 305 - "%s", "cmd_filter"); 232 + "%s", "cmd_filter"); 306 233 307 234 if (ret < 0) 308 235 return ret; 309 236 310 - rcf_set_defaults(filter); 311 237 return 0; 312 238 } 313 239 314 240 void blk_unregister_filter(struct gendisk *disk) 315 241 { 316 - struct blk_scsi_cmd_filter *filter = &disk->cmd_filter; 242 + struct blk_cmd_filter *filter = &disk->queue->cmd_filter; 317 243 318 244 kobject_put(&filter->kobj); 319 245 kobject_put(disk->holder_dir->parent);
+91 -3
block/scsi_ioctl.c
··· 105 105 return put_user(1, p); 106 106 } 107 107 108 + void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter) 109 + { 110 + /* Basic read-only commands */ 111 + __set_bit(TEST_UNIT_READY, filter->read_ok); 112 + __set_bit(REQUEST_SENSE, filter->read_ok); 113 + __set_bit(READ_6, filter->read_ok); 114 + __set_bit(READ_10, filter->read_ok); 115 + __set_bit(READ_12, filter->read_ok); 116 + __set_bit(READ_16, filter->read_ok); 117 + __set_bit(READ_BUFFER, filter->read_ok); 118 + __set_bit(READ_DEFECT_DATA, filter->read_ok); 119 + __set_bit(READ_CAPACITY, filter->read_ok); 120 + __set_bit(READ_LONG, filter->read_ok); 121 + __set_bit(INQUIRY, filter->read_ok); 122 + __set_bit(MODE_SENSE, filter->read_ok); 123 + __set_bit(MODE_SENSE_10, filter->read_ok); 124 + __set_bit(LOG_SENSE, filter->read_ok); 125 + __set_bit(START_STOP, filter->read_ok); 126 + __set_bit(GPCMD_VERIFY_10, filter->read_ok); 127 + __set_bit(VERIFY_16, filter->read_ok); 128 + __set_bit(REPORT_LUNS, filter->read_ok); 129 + __set_bit(SERVICE_ACTION_IN, filter->read_ok); 130 + __set_bit(RECEIVE_DIAGNOSTIC, filter->read_ok); 131 + __set_bit(MAINTENANCE_IN, filter->read_ok); 132 + __set_bit(GPCMD_READ_BUFFER_CAPACITY, filter->read_ok); 133 + 134 + /* Audio CD commands */ 135 + __set_bit(GPCMD_PLAY_CD, filter->read_ok); 136 + __set_bit(GPCMD_PLAY_AUDIO_10, filter->read_ok); 137 + __set_bit(GPCMD_PLAY_AUDIO_MSF, filter->read_ok); 138 + __set_bit(GPCMD_PLAY_AUDIO_TI, filter->read_ok); 139 + __set_bit(GPCMD_PAUSE_RESUME, filter->read_ok); 140 + 141 + /* CD/DVD data reading */ 142 + __set_bit(GPCMD_READ_CD, filter->read_ok); 143 + __set_bit(GPCMD_READ_CD_MSF, filter->read_ok); 144 + __set_bit(GPCMD_READ_DISC_INFO, filter->read_ok); 145 + __set_bit(GPCMD_READ_CDVD_CAPACITY, filter->read_ok); 146 + __set_bit(GPCMD_READ_DVD_STRUCTURE, filter->read_ok); 147 + __set_bit(GPCMD_READ_HEADER, filter->read_ok); 148 + __set_bit(GPCMD_READ_TRACK_RZONE_INFO, filter->read_ok); 149 + __set_bit(GPCMD_READ_SUBCHANNEL, filter->read_ok); 150 + __set_bit(GPCMD_READ_TOC_PMA_ATIP, filter->read_ok); 151 + __set_bit(GPCMD_REPORT_KEY, filter->read_ok); 152 + __set_bit(GPCMD_SCAN, filter->read_ok); 153 + __set_bit(GPCMD_GET_CONFIGURATION, filter->read_ok); 154 + __set_bit(GPCMD_READ_FORMAT_CAPACITIES, filter->read_ok); 155 + __set_bit(GPCMD_GET_EVENT_STATUS_NOTIFICATION, filter->read_ok); 156 + __set_bit(GPCMD_GET_PERFORMANCE, filter->read_ok); 157 + __set_bit(GPCMD_SEEK, filter->read_ok); 158 + __set_bit(GPCMD_STOP_PLAY_SCAN, filter->read_ok); 159 + 160 + /* Basic writing commands */ 161 + __set_bit(WRITE_6, filter->write_ok); 162 + __set_bit(WRITE_10, filter->write_ok); 163 + __set_bit(WRITE_VERIFY, filter->write_ok); 164 + __set_bit(WRITE_12, filter->write_ok); 165 + __set_bit(WRITE_VERIFY_12, filter->write_ok); 166 + __set_bit(WRITE_16, filter->write_ok); 167 + __set_bit(WRITE_LONG, filter->write_ok); 168 + __set_bit(WRITE_LONG_2, filter->write_ok); 169 + __set_bit(ERASE, filter->write_ok); 170 + __set_bit(GPCMD_MODE_SELECT_10, filter->write_ok); 171 + __set_bit(MODE_SELECT, filter->write_ok); 172 + __set_bit(LOG_SELECT, filter->write_ok); 173 + __set_bit(GPCMD_BLANK, filter->write_ok); 174 + __set_bit(GPCMD_CLOSE_TRACK, filter->write_ok); 175 + __set_bit(GPCMD_FLUSH_CACHE, filter->write_ok); 176 + __set_bit(GPCMD_FORMAT_UNIT, filter->write_ok); 177 + __set_bit(GPCMD_REPAIR_RZONE_TRACK, filter->write_ok); 178 + __set_bit(GPCMD_RESERVE_RZONE_TRACK, filter->write_ok); 179 + __set_bit(GPCMD_SEND_DVD_STRUCTURE, filter->write_ok); 180 + __set_bit(GPCMD_SEND_EVENT, filter->write_ok); 181 + __set_bit(GPCMD_SEND_KEY, filter->write_ok); 182 + __set_bit(GPCMD_SEND_OPC, filter->write_ok); 183 + __set_bit(GPCMD_SEND_CUE_SHEET, filter->write_ok); 184 + __set_bit(GPCMD_SET_SPEED, filter->write_ok); 185 + __set_bit(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, filter->write_ok); 186 + __set_bit(GPCMD_LOAD_UNLOAD, filter->write_ok); 187 + __set_bit(GPCMD_SET_STREAMING, filter->write_ok); 188 + } 189 + EXPORT_SYMBOL_GPL(blk_set_cmd_filter_defaults); 190 + 108 191 static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, 109 192 struct sg_io_hdr *hdr, struct file *file) 110 193 { 111 194 if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) 112 195 return -EFAULT; 113 - if (blk_verify_command(file, rq->cmd)) 196 + if (blk_verify_command(&q->cmd_filter, rq->cmd, 197 + file->f_mode & FMODE_WRITE)) 114 198 return -EPERM; 115 199 116 200 /* ··· 382 298 struct gendisk *disk, struct scsi_ioctl_command __user *sic) 383 299 { 384 300 struct request *rq; 385 - int err; 301 + int err, write_perm = 0; 386 302 unsigned int in_len, out_len, bytes, opcode, cmdlen; 387 303 char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; 388 304 ··· 424 340 if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) 425 341 goto error; 426 342 427 - err = blk_verify_command(file, rq->cmd); 343 + /* scsi_ioctl passes NULL */ 344 + if (file && (file->f_mode & FMODE_WRITE)) 345 + write_perm = 1; 346 + 347 + err = blk_verify_command(&q->cmd_filter, rq->cmd, write_perm); 428 348 if (err) 429 349 goto error; 430 350
+15 -2
drivers/scsi/sg.c
··· 217 217 #define SZ_SG_IOVEC sizeof(sg_iovec_t) 218 218 #define SZ_SG_REQ_INFO sizeof(sg_req_info_t) 219 219 220 + static int sg_allow_access(struct file *filp, unsigned char *cmd) 221 + { 222 + struct sg_fd *sfp = (struct sg_fd *)filp->private_data; 223 + struct request_queue *q = sfp->parentdp->device->request_queue; 224 + 225 + if (sfp->parentdp->device->type == TYPE_SCANNER) 226 + return 0; 227 + 228 + return blk_verify_command(&q->cmd_filter, 229 + cmd, filp->f_mode & FMODE_WRITE); 230 + } 231 + 220 232 static int 221 233 sg_open(struct inode *inode, struct file *filp) 222 234 { ··· 701 689 sg_remove_request(sfp, srp); 702 690 return -EFAULT; 703 691 } 704 - if (read_only && !blk_verify_command(file, cmnd)) { 692 + if (read_only && sg_allow_access(file, cmnd)) { 705 693 sg_remove_request(sfp, srp); 706 694 return -EPERM; 707 695 } ··· 805 793 806 794 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) 807 795 return -ENXIO; 796 + 808 797 SCSI_LOG_TIMEOUT(3, printk("sg_ioctl: %s, cmd=0x%x\n", 809 798 sdp->disk->disk_name, (int) cmd_in)); 810 799 read_only = (O_RDWR != (filp->f_flags & O_ACCMODE)); ··· 1074 1061 1075 1062 if (copy_from_user(&opcode, siocp->data, 1)) 1076 1063 return -EFAULT; 1077 - if (!blk_verify_command(filp, &opcode)) 1064 + if (sg_allow_access(filp, &opcode)) 1078 1065 return -EPERM; 1079 1066 } 1080 1067 return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p);
+33 -15
fs/bio.c
··· 469 469 kfree(bmd); 470 470 } 471 471 472 - static struct bio_map_data *bio_alloc_map_data(int nr_segs, int iov_count) 472 + static struct bio_map_data *bio_alloc_map_data(int nr_segs, int iov_count, 473 + gfp_t gfp_mask) 473 474 { 474 - struct bio_map_data *bmd = kmalloc(sizeof(*bmd), GFP_KERNEL); 475 + struct bio_map_data *bmd = kmalloc(sizeof(*bmd), gfp_mask); 475 476 476 477 if (!bmd) 477 478 return NULL; 478 479 479 - bmd->iovecs = kmalloc(sizeof(struct bio_vec) * nr_segs, GFP_KERNEL); 480 + bmd->iovecs = kmalloc(sizeof(struct bio_vec) * nr_segs, gfp_mask); 480 481 if (!bmd->iovecs) { 481 482 kfree(bmd); 482 483 return NULL; 483 484 } 484 485 485 - bmd->sgvecs = kmalloc(sizeof(struct sg_iovec) * iov_count, GFP_KERNEL); 486 + bmd->sgvecs = kmalloc(sizeof(struct sg_iovec) * iov_count, gfp_mask); 486 487 if (bmd->sgvecs) 487 488 return bmd; 488 489 ··· 492 491 return NULL; 493 492 } 494 493 495 - static int __bio_copy_iov(struct bio *bio, struct sg_iovec *iov, int iov_count, 496 - int uncopy) 494 + static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs, 495 + struct sg_iovec *iov, int iov_count, int uncopy) 497 496 { 498 497 int ret = 0, i; 499 498 struct bio_vec *bvec; ··· 503 502 504 503 __bio_for_each_segment(bvec, bio, i, 0) { 505 504 char *bv_addr = page_address(bvec->bv_page); 506 - unsigned int bv_len = bvec->bv_len; 505 + unsigned int bv_len = iovecs[i].bv_len; 507 506 508 507 while (bv_len && iov_idx < iov_count) { 509 508 unsigned int bytes; ··· 555 554 struct bio_map_data *bmd = bio->bi_private; 556 555 int ret; 557 556 558 - ret = __bio_copy_iov(bio, bmd->sgvecs, bmd->nr_sgvecs, 1); 557 + ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, bmd->nr_sgvecs, 1); 559 558 560 559 bio_free_map_data(bmd); 561 560 bio_put(bio); ··· 597 596 len += iov[i].iov_len; 598 597 } 599 598 600 - bmd = bio_alloc_map_data(nr_pages, iov_count); 599 + bmd = bio_alloc_map_data(nr_pages, iov_count, GFP_KERNEL); 601 600 if (!bmd) 602 601 return ERR_PTR(-ENOMEM); 603 602 ··· 634 633 * success 635 634 */ 636 635 if (!write_to_vm) { 637 - ret = __bio_copy_iov(bio, iov, iov_count, 0); 636 + ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0); 638 637 if (ret) 639 638 goto cleanup; 640 639 } ··· 943 942 { 944 943 struct bio_vec *bvec; 945 944 const int read = bio_data_dir(bio) == READ; 946 - char *p = bio->bi_private; 945 + struct bio_map_data *bmd = bio->bi_private; 947 946 int i; 947 + char *p = bmd->sgvecs[0].iov_base; 948 948 949 949 __bio_for_each_segment(bvec, bio, i, 0) { 950 950 char *addr = page_address(bvec->bv_page); 951 + int len = bmd->iovecs[i].bv_len; 951 952 952 953 if (read && !err) 953 - memcpy(p, addr, bvec->bv_len); 954 + memcpy(p, addr, len); 954 955 955 956 __free_page(bvec->bv_page); 956 - p += bvec->bv_len; 957 + p += len; 957 958 } 958 959 960 + bio_free_map_data(bmd); 959 961 bio_put(bio); 960 962 } 961 963 ··· 982 978 const int nr_pages = end - start; 983 979 struct bio *bio; 984 980 struct bio_vec *bvec; 981 + struct bio_map_data *bmd; 985 982 int i, ret; 983 + struct sg_iovec iov; 986 984 985 + iov.iov_base = data; 986 + iov.iov_len = len; 987 + 988 + bmd = bio_alloc_map_data(nr_pages, 1, gfp_mask); 989 + if (!bmd) 990 + return ERR_PTR(-ENOMEM); 991 + 992 + ret = -ENOMEM; 987 993 bio = bio_alloc(gfp_mask, nr_pages); 988 994 if (!bio) 989 - return ERR_PTR(-ENOMEM); 995 + goto out_bmd; 990 996 991 997 while (len) { 992 998 struct page *page; ··· 1030 1016 } 1031 1017 } 1032 1018 1033 - bio->bi_private = data; 1019 + bio->bi_private = bmd; 1034 1020 bio->bi_end_io = bio_copy_kern_endio; 1021 + 1022 + bio_set_map_data(bmd, bio, &iov, 1); 1035 1023 return bio; 1036 1024 cleanup: 1037 1025 bio_for_each_segment(bvec, bio, i) 1038 1026 __free_page(bvec->bv_page); 1039 1027 1040 1028 bio_put(bio); 1029 + out_bmd: 1030 + bio_free_map_data(bmd); 1041 1031 1042 1032 return ERR_PTR(ret); 1043 1033 }
+8 -5
fs/buffer.c
··· 2926 2926 BUG_ON(!buffer_mapped(bh)); 2927 2927 BUG_ON(!bh->b_end_io); 2928 2928 2929 - if (buffer_ordered(bh) && (rw == WRITE)) 2930 - rw = WRITE_BARRIER; 2929 + /* 2930 + * Mask in barrier bit for a write (could be either a WRITE or a 2931 + * WRITE_SYNC 2932 + */ 2933 + if (buffer_ordered(bh) && (rw & WRITE)) 2934 + rw |= WRITE_BARRIER; 2931 2935 2932 2936 /* 2933 - * Only clear out a write error when rewriting, should this 2934 - * include WRITE_SYNC as well? 2937 + * Only clear out a write error when rewriting 2935 2938 */ 2936 - if (test_set_buffer_req(bh) && (rw == WRITE || rw == WRITE_BARRIER)) 2939 + if (test_set_buffer_req(bh) && (rw & WRITE)) 2937 2940 clear_buffer_write_io_error(bh); 2938 2941 2939 2942 /*
+13 -5
include/linux/blkdev.h
··· 280 280 atomic_t refcnt; /* map can be shared */ 281 281 }; 282 282 283 + #define BLK_SCSI_MAX_CMDS (256) 284 + #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) 285 + 286 + struct blk_cmd_filter { 287 + unsigned long read_ok[BLK_SCSI_CMD_PER_LONG]; 288 + unsigned long write_ok[BLK_SCSI_CMD_PER_LONG]; 289 + struct kobject kobj; 290 + }; 291 + 283 292 struct request_queue 284 293 { 285 294 /* ··· 407 398 #if defined(CONFIG_BLK_DEV_BSG) 408 399 struct bsg_class_device bsg_dev; 409 400 #endif 401 + struct blk_cmd_filter cmd_filter; 410 402 }; 411 403 412 404 #define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */ ··· 817 807 /* 818 808 * tag stuff 819 809 */ 820 - #define blk_queue_tag_depth(q) ((q)->queue_tags->busy) 821 - #define blk_queue_tag_queue(q) ((q)->queue_tags->busy < (q)->queue_tags->max_depth) 822 810 #define blk_rq_tagged(rq) ((rq)->cmd_flags & REQ_QUEUED) 823 811 extern int blk_queue_start_tag(struct request_queue *, struct request *); 824 812 extern struct request *blk_queue_find_tag(struct request_queue *, int); ··· 841 833 /* 842 834 * command filter functions 843 835 */ 844 - extern int blk_verify_command(struct file *file, unsigned char *cmd); 845 - extern int blk_cmd_filter_verify_command(struct blk_scsi_cmd_filter *filter, 846 - unsigned char *cmd, mode_t *f_mode); 836 + extern int blk_verify_command(struct blk_cmd_filter *filter, 837 + unsigned char *cmd, int has_write_perm); 847 838 extern int blk_register_filter(struct gendisk *disk); 848 839 extern void blk_unregister_filter(struct gendisk *disk); 840 + extern void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter); 849 841 850 842 #define MAX_PHYS_SEGMENTS 128 851 843 #define MAX_HW_SEGMENTS 128
-10
include/linux/genhd.h
··· 110 110 #define GENHD_FL_SUPPRESS_PARTITION_INFO 32 111 111 #define GENHD_FL_FAIL 64 112 112 113 - #define BLK_SCSI_MAX_CMDS (256) 114 - #define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8)) 115 - 116 - struct blk_scsi_cmd_filter { 117 - unsigned long read_ok[BLK_SCSI_CMD_PER_LONG]; 118 - unsigned long write_ok[BLK_SCSI_CMD_PER_LONG]; 119 - struct kobject kobj; 120 - }; 121 - 122 113 struct gendisk { 123 114 int major; /* major number of driver */ 124 115 int first_minor; ··· 119 128 struct hd_struct **part; /* [indexed by minor] */ 120 129 struct block_device_operations *fops; 121 130 struct request_queue *queue; 122 - struct blk_scsi_cmd_filter cmd_filter; 123 131 void *private_data; 124 132 sector_t capacity; 125 133