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

Configure Feed

Select the types of activity you want to include in your feed.

at v3.8-rc3 738 lines 19 kB view raw
1/* 2 * storage_common.c -- Common definitions for mass storage functionality 3 * 4 * Copyright (C) 2003-2008 Alan Stern 5 * Copyeight (C) 2009 Samsung Electronics 6 * Author: Michal Nazarewicz (mina86@mina86.com) 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 */ 13 14/* 15 * This file requires the following identifiers used in USB strings to 16 * be defined (each of type pointer to char): 17 * - fsg_string_interface -- name of the interface 18 */ 19 20/* 21 * When USB_GADGET_DEBUG_FILES is defined the module param num_buffers 22 * sets the number of pipeline buffers (length of the fsg_buffhd array). 23 * The valid range of num_buffers is: num >= 2 && num <= 4. 24 */ 25 26 27#include <linux/usb/storage.h> 28#include <scsi/scsi.h> 29#include <asm/unaligned.h> 30 31 32/* 33 * Thanks to NetChip Technologies for donating this product ID. 34 * 35 * DO NOT REUSE THESE IDs with any other driver!! Ever!! 36 * Instead: allocate your own, using normal USB-IF procedures. 37 */ 38#define FSG_VENDOR_ID 0x0525 /* NetChip */ 39#define FSG_PRODUCT_ID 0xa4a5 /* Linux-USB File-backed Storage Gadget */ 40 41 42/*-------------------------------------------------------------------------*/ 43 44 45#ifndef DEBUG 46#undef VERBOSE_DEBUG 47#undef DUMP_MSGS 48#endif /* !DEBUG */ 49 50#ifdef VERBOSE_DEBUG 51#define VLDBG LDBG 52#else 53#define VLDBG(lun, fmt, args...) do { } while (0) 54#endif /* VERBOSE_DEBUG */ 55 56#define LDBG(lun, fmt, args...) dev_dbg (&(lun)->dev, fmt, ## args) 57#define LERROR(lun, fmt, args...) dev_err (&(lun)->dev, fmt, ## args) 58#define LWARN(lun, fmt, args...) dev_warn(&(lun)->dev, fmt, ## args) 59#define LINFO(lun, fmt, args...) dev_info(&(lun)->dev, fmt, ## args) 60 61 62#ifdef DUMP_MSGS 63 64# define dump_msg(fsg, /* const char * */ label, \ 65 /* const u8 * */ buf, /* unsigned */ length) do { \ 66 if (length < 512) { \ 67 DBG(fsg, "%s, length %u:\n", label, length); \ 68 print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, \ 69 16, 1, buf, length, 0); \ 70 } \ 71} while (0) 72 73# define dump_cdb(fsg) do { } while (0) 74 75#else 76 77# define dump_msg(fsg, /* const char * */ label, \ 78 /* const u8 * */ buf, /* unsigned */ length) do { } while (0) 79 80# ifdef VERBOSE_DEBUG 81 82# define dump_cdb(fsg) \ 83 print_hex_dump(KERN_DEBUG, "SCSI CDB: ", DUMP_PREFIX_NONE, \ 84 16, 1, (fsg)->cmnd, (fsg)->cmnd_size, 0) \ 85 86# else 87 88# define dump_cdb(fsg) do { } while (0) 89 90# endif /* VERBOSE_DEBUG */ 91 92#endif /* DUMP_MSGS */ 93 94/*-------------------------------------------------------------------------*/ 95 96/* CBI Interrupt data structure */ 97struct interrupt_data { 98 u8 bType; 99 u8 bValue; 100}; 101 102#define CBI_INTERRUPT_DATA_LEN 2 103 104/* CBI Accept Device-Specific Command request */ 105#define USB_CBI_ADSC_REQUEST 0x00 106 107 108/* Length of a SCSI Command Data Block */ 109#define MAX_COMMAND_SIZE 16 110 111/* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */ 112#define SS_NO_SENSE 0 113#define SS_COMMUNICATION_FAILURE 0x040800 114#define SS_INVALID_COMMAND 0x052000 115#define SS_INVALID_FIELD_IN_CDB 0x052400 116#define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x052100 117#define SS_LOGICAL_UNIT_NOT_SUPPORTED 0x052500 118#define SS_MEDIUM_NOT_PRESENT 0x023a00 119#define SS_MEDIUM_REMOVAL_PREVENTED 0x055302 120#define SS_NOT_READY_TO_READY_TRANSITION 0x062800 121#define SS_RESET_OCCURRED 0x062900 122#define SS_SAVING_PARAMETERS_NOT_SUPPORTED 0x053900 123#define SS_UNRECOVERED_READ_ERROR 0x031100 124#define SS_WRITE_ERROR 0x030c02 125#define SS_WRITE_PROTECTED 0x072700 126 127#define SK(x) ((u8) ((x) >> 16)) /* Sense Key byte, etc. */ 128#define ASC(x) ((u8) ((x) >> 8)) 129#define ASCQ(x) ((u8) (x)) 130 131 132/*-------------------------------------------------------------------------*/ 133 134 135struct fsg_lun { 136 struct file *filp; 137 loff_t file_length; 138 loff_t num_sectors; 139 140 unsigned int initially_ro:1; 141 unsigned int ro:1; 142 unsigned int removable:1; 143 unsigned int cdrom:1; 144 unsigned int prevent_medium_removal:1; 145 unsigned int registered:1; 146 unsigned int info_valid:1; 147 unsigned int nofua:1; 148 149 u32 sense_data; 150 u32 sense_data_info; 151 u32 unit_attention_data; 152 153 unsigned int blkbits; /* Bits of logical block size of bound block device */ 154 unsigned int blksize; /* logical block size of bound block device */ 155 struct device dev; 156}; 157 158static inline bool fsg_lun_is_open(struct fsg_lun *curlun) 159{ 160 return curlun->filp != NULL; 161} 162 163static inline struct fsg_lun *fsg_lun_from_dev(struct device *dev) 164{ 165 return container_of(dev, struct fsg_lun, dev); 166} 167 168 169/* Big enough to hold our biggest descriptor */ 170#define EP0_BUFSIZE 256 171#define DELAYED_STATUS (EP0_BUFSIZE + 999) /* An impossibly large value */ 172 173#ifdef CONFIG_USB_GADGET_DEBUG_FILES 174 175static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS; 176module_param_named(num_buffers, fsg_num_buffers, uint, S_IRUGO); 177MODULE_PARM_DESC(num_buffers, "Number of pipeline buffers"); 178 179#else 180 181/* 182 * Number of buffers we will use. 183 * 2 is usually enough for good buffering pipeline 184 */ 185#define fsg_num_buffers CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS 186 187#endif /* CONFIG_USB_DEBUG */ 188 189/* check if fsg_num_buffers is within a valid range */ 190static inline int fsg_num_buffers_validate(void) 191{ 192 if (fsg_num_buffers >= 2 && fsg_num_buffers <= 4) 193 return 0; 194 pr_err("fsg_num_buffers %u is out of range (%d to %d)\n", 195 fsg_num_buffers, 2 ,4); 196 return -EINVAL; 197} 198 199/* Default size of buffer length. */ 200#define FSG_BUFLEN ((u32)16384) 201 202/* Maximal number of LUNs supported in mass storage function */ 203#define FSG_MAX_LUNS 8 204 205enum fsg_buffer_state { 206 BUF_STATE_EMPTY = 0, 207 BUF_STATE_FULL, 208 BUF_STATE_BUSY 209}; 210 211struct fsg_buffhd { 212 void *buf; 213 enum fsg_buffer_state state; 214 struct fsg_buffhd *next; 215 216 /* 217 * The NetChip 2280 is faster, and handles some protocol faults 218 * better, if we don't submit any short bulk-out read requests. 219 * So we will record the intended request length here. 220 */ 221 unsigned int bulk_out_intended_length; 222 223 struct usb_request *inreq; 224 int inreq_busy; 225 struct usb_request *outreq; 226 int outreq_busy; 227}; 228 229enum fsg_state { 230 /* This one isn't used anywhere */ 231 FSG_STATE_COMMAND_PHASE = -10, 232 FSG_STATE_DATA_PHASE, 233 FSG_STATE_STATUS_PHASE, 234 235 FSG_STATE_IDLE = 0, 236 FSG_STATE_ABORT_BULK_OUT, 237 FSG_STATE_RESET, 238 FSG_STATE_INTERFACE_CHANGE, 239 FSG_STATE_CONFIG_CHANGE, 240 FSG_STATE_DISCONNECT, 241 FSG_STATE_EXIT, 242 FSG_STATE_TERMINATED 243}; 244 245enum data_direction { 246 DATA_DIR_UNKNOWN = 0, 247 DATA_DIR_FROM_HOST, 248 DATA_DIR_TO_HOST, 249 DATA_DIR_NONE 250}; 251 252 253/*-------------------------------------------------------------------------*/ 254 255 256static inline u32 get_unaligned_be24(u8 *buf) 257{ 258 return 0xffffff & (u32) get_unaligned_be32(buf - 1); 259} 260 261 262/*-------------------------------------------------------------------------*/ 263 264 265enum { 266 FSG_STRING_INTERFACE 267}; 268 269 270/* There is only one interface. */ 271 272static struct usb_interface_descriptor 273fsg_intf_desc = { 274 .bLength = sizeof fsg_intf_desc, 275 .bDescriptorType = USB_DT_INTERFACE, 276 277 .bNumEndpoints = 2, /* Adjusted during fsg_bind() */ 278 .bInterfaceClass = USB_CLASS_MASS_STORAGE, 279 .bInterfaceSubClass = USB_SC_SCSI, /* Adjusted during fsg_bind() */ 280 .bInterfaceProtocol = USB_PR_BULK, /* Adjusted during fsg_bind() */ 281 .iInterface = FSG_STRING_INTERFACE, 282}; 283 284/* 285 * Three full-speed endpoint descriptors: bulk-in, bulk-out, and 286 * interrupt-in. 287 */ 288 289static struct usb_endpoint_descriptor 290fsg_fs_bulk_in_desc = { 291 .bLength = USB_DT_ENDPOINT_SIZE, 292 .bDescriptorType = USB_DT_ENDPOINT, 293 294 .bEndpointAddress = USB_DIR_IN, 295 .bmAttributes = USB_ENDPOINT_XFER_BULK, 296 /* wMaxPacketSize set by autoconfiguration */ 297}; 298 299static struct usb_endpoint_descriptor 300fsg_fs_bulk_out_desc = { 301 .bLength = USB_DT_ENDPOINT_SIZE, 302 .bDescriptorType = USB_DT_ENDPOINT, 303 304 .bEndpointAddress = USB_DIR_OUT, 305 .bmAttributes = USB_ENDPOINT_XFER_BULK, 306 /* wMaxPacketSize set by autoconfiguration */ 307}; 308 309static struct usb_descriptor_header *fsg_fs_function[] = { 310 (struct usb_descriptor_header *) &fsg_intf_desc, 311 (struct usb_descriptor_header *) &fsg_fs_bulk_in_desc, 312 (struct usb_descriptor_header *) &fsg_fs_bulk_out_desc, 313 NULL, 314}; 315 316 317/* 318 * USB 2.0 devices need to expose both high speed and full speed 319 * descriptors, unless they only run at full speed. 320 * 321 * That means alternate endpoint descriptors (bigger packets) 322 * and a "device qualifier" ... plus more construction options 323 * for the configuration descriptor. 324 */ 325static struct usb_endpoint_descriptor 326fsg_hs_bulk_in_desc = { 327 .bLength = USB_DT_ENDPOINT_SIZE, 328 .bDescriptorType = USB_DT_ENDPOINT, 329 330 /* bEndpointAddress copied from fs_bulk_in_desc during fsg_bind() */ 331 .bmAttributes = USB_ENDPOINT_XFER_BULK, 332 .wMaxPacketSize = cpu_to_le16(512), 333}; 334 335static struct usb_endpoint_descriptor 336fsg_hs_bulk_out_desc = { 337 .bLength = USB_DT_ENDPOINT_SIZE, 338 .bDescriptorType = USB_DT_ENDPOINT, 339 340 /* bEndpointAddress copied from fs_bulk_out_desc during fsg_bind() */ 341 .bmAttributes = USB_ENDPOINT_XFER_BULK, 342 .wMaxPacketSize = cpu_to_le16(512), 343 .bInterval = 1, /* NAK every 1 uframe */ 344}; 345 346 347static struct usb_descriptor_header *fsg_hs_function[] = { 348 (struct usb_descriptor_header *) &fsg_intf_desc, 349 (struct usb_descriptor_header *) &fsg_hs_bulk_in_desc, 350 (struct usb_descriptor_header *) &fsg_hs_bulk_out_desc, 351 NULL, 352}; 353 354static struct usb_endpoint_descriptor 355fsg_ss_bulk_in_desc = { 356 .bLength = USB_DT_ENDPOINT_SIZE, 357 .bDescriptorType = USB_DT_ENDPOINT, 358 359 /* bEndpointAddress copied from fs_bulk_in_desc during fsg_bind() */ 360 .bmAttributes = USB_ENDPOINT_XFER_BULK, 361 .wMaxPacketSize = cpu_to_le16(1024), 362}; 363 364static struct usb_ss_ep_comp_descriptor fsg_ss_bulk_in_comp_desc = { 365 .bLength = sizeof(fsg_ss_bulk_in_comp_desc), 366 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 367 368 /*.bMaxBurst = DYNAMIC, */ 369}; 370 371static struct usb_endpoint_descriptor 372fsg_ss_bulk_out_desc = { 373 .bLength = USB_DT_ENDPOINT_SIZE, 374 .bDescriptorType = USB_DT_ENDPOINT, 375 376 /* bEndpointAddress copied from fs_bulk_out_desc during fsg_bind() */ 377 .bmAttributes = USB_ENDPOINT_XFER_BULK, 378 .wMaxPacketSize = cpu_to_le16(1024), 379}; 380 381static struct usb_ss_ep_comp_descriptor fsg_ss_bulk_out_comp_desc = { 382 .bLength = sizeof(fsg_ss_bulk_in_comp_desc), 383 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, 384 385 /*.bMaxBurst = DYNAMIC, */ 386}; 387 388static __maybe_unused struct usb_ext_cap_descriptor fsg_ext_cap_desc = { 389 .bLength = USB_DT_USB_EXT_CAP_SIZE, 390 .bDescriptorType = USB_DT_DEVICE_CAPABILITY, 391 .bDevCapabilityType = USB_CAP_TYPE_EXT, 392 393 .bmAttributes = cpu_to_le32(USB_LPM_SUPPORT), 394}; 395 396static __maybe_unused struct usb_ss_cap_descriptor fsg_ss_cap_desc = { 397 .bLength = USB_DT_USB_SS_CAP_SIZE, 398 .bDescriptorType = USB_DT_DEVICE_CAPABILITY, 399 .bDevCapabilityType = USB_SS_CAP_TYPE, 400 401 /* .bmAttributes = LTM is not supported yet */ 402 403 .wSpeedSupported = cpu_to_le16(USB_LOW_SPEED_OPERATION 404 | USB_FULL_SPEED_OPERATION 405 | USB_HIGH_SPEED_OPERATION 406 | USB_5GBPS_OPERATION), 407 .bFunctionalitySupport = USB_LOW_SPEED_OPERATION, 408 .bU1devExitLat = USB_DEFAULT_U1_DEV_EXIT_LAT, 409 .bU2DevExitLat = cpu_to_le16(USB_DEFAULT_U2_DEV_EXIT_LAT), 410}; 411 412static __maybe_unused struct usb_bos_descriptor fsg_bos_desc = { 413 .bLength = USB_DT_BOS_SIZE, 414 .bDescriptorType = USB_DT_BOS, 415 416 .wTotalLength = cpu_to_le16(USB_DT_BOS_SIZE 417 + USB_DT_USB_EXT_CAP_SIZE 418 + USB_DT_USB_SS_CAP_SIZE), 419 420 .bNumDeviceCaps = 2, 421}; 422 423static struct usb_descriptor_header *fsg_ss_function[] = { 424 (struct usb_descriptor_header *) &fsg_intf_desc, 425 (struct usb_descriptor_header *) &fsg_ss_bulk_in_desc, 426 (struct usb_descriptor_header *) &fsg_ss_bulk_in_comp_desc, 427 (struct usb_descriptor_header *) &fsg_ss_bulk_out_desc, 428 (struct usb_descriptor_header *) &fsg_ss_bulk_out_comp_desc, 429 NULL, 430}; 431 432/* Maxpacket and other transfer characteristics vary by speed. */ 433static __maybe_unused struct usb_endpoint_descriptor * 434fsg_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *fs, 435 struct usb_endpoint_descriptor *hs, 436 struct usb_endpoint_descriptor *ss) 437{ 438 if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER) 439 return ss; 440 else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH) 441 return hs; 442 return fs; 443} 444 445 446/* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */ 447static struct usb_string fsg_strings[] = { 448 {FSG_STRING_INTERFACE, fsg_string_interface}, 449 {} 450}; 451 452static struct usb_gadget_strings fsg_stringtab = { 453 .language = 0x0409, /* en-us */ 454 .strings = fsg_strings, 455}; 456 457 458 /*-------------------------------------------------------------------------*/ 459 460/* 461 * If the next two routines are called while the gadget is registered, 462 * the caller must own fsg->filesem for writing. 463 */ 464 465static void fsg_lun_close(struct fsg_lun *curlun) 466{ 467 if (curlun->filp) { 468 LDBG(curlun, "close backing file\n"); 469 fput(curlun->filp); 470 curlun->filp = NULL; 471 } 472} 473 474 475static int fsg_lun_open(struct fsg_lun *curlun, const char *filename) 476{ 477 int ro; 478 struct file *filp = NULL; 479 int rc = -EINVAL; 480 struct inode *inode = NULL; 481 loff_t size; 482 loff_t num_sectors; 483 loff_t min_sectors; 484 unsigned int blkbits; 485 unsigned int blksize; 486 487 /* R/W if we can, R/O if we must */ 488 ro = curlun->initially_ro; 489 if (!ro) { 490 filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0); 491 if (PTR_ERR(filp) == -EROFS || PTR_ERR(filp) == -EACCES) 492 ro = 1; 493 } 494 if (ro) 495 filp = filp_open(filename, O_RDONLY | O_LARGEFILE, 0); 496 if (IS_ERR(filp)) { 497 LINFO(curlun, "unable to open backing file: %s\n", filename); 498 return PTR_ERR(filp); 499 } 500 501 if (!(filp->f_mode & FMODE_WRITE)) 502 ro = 1; 503 504 inode = filp->f_path.dentry->d_inode; 505 if ((!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) { 506 LINFO(curlun, "invalid file type: %s\n", filename); 507 goto out; 508 } 509 510 /* 511 * If we can't read the file, it's no good. 512 * If we can't write the file, use it read-only. 513 */ 514 if (!(filp->f_op->read || filp->f_op->aio_read)) { 515 LINFO(curlun, "file not readable: %s\n", filename); 516 goto out; 517 } 518 if (!(filp->f_op->write || filp->f_op->aio_write)) 519 ro = 1; 520 521 size = i_size_read(inode->i_mapping->host); 522 if (size < 0) { 523 LINFO(curlun, "unable to find file size: %s\n", filename); 524 rc = (int) size; 525 goto out; 526 } 527 528 if (curlun->cdrom) { 529 blksize = 2048; 530 blkbits = 11; 531 } else if (inode->i_bdev) { 532 blksize = bdev_logical_block_size(inode->i_bdev); 533 blkbits = blksize_bits(blksize); 534 } else { 535 blksize = 512; 536 blkbits = 9; 537 } 538 539 num_sectors = size >> blkbits; /* File size in logic-block-size blocks */ 540 min_sectors = 1; 541 if (curlun->cdrom) { 542 min_sectors = 300; /* Smallest track is 300 frames */ 543 if (num_sectors >= 256*60*75) { 544 num_sectors = 256*60*75 - 1; 545 LINFO(curlun, "file too big: %s\n", filename); 546 LINFO(curlun, "using only first %d blocks\n", 547 (int) num_sectors); 548 } 549 } 550 if (num_sectors < min_sectors) { 551 LINFO(curlun, "file too small: %s\n", filename); 552 rc = -ETOOSMALL; 553 goto out; 554 } 555 556 if (fsg_lun_is_open(curlun)) 557 fsg_lun_close(curlun); 558 559 curlun->blksize = blksize; 560 curlun->blkbits = blkbits; 561 curlun->ro = ro; 562 curlun->filp = filp; 563 curlun->file_length = size; 564 curlun->num_sectors = num_sectors; 565 LDBG(curlun, "open backing file: %s\n", filename); 566 return 0; 567 568out: 569 fput(filp); 570 return rc; 571} 572 573 574/*-------------------------------------------------------------------------*/ 575 576/* 577 * Sync the file data, don't bother with the metadata. 578 * This code was copied from fs/buffer.c:sys_fdatasync(). 579 */ 580static int fsg_lun_fsync_sub(struct fsg_lun *curlun) 581{ 582 struct file *filp = curlun->filp; 583 584 if (curlun->ro || !filp) 585 return 0; 586 return vfs_fsync(filp, 1); 587} 588 589static void store_cdrom_address(u8 *dest, int msf, u32 addr) 590{ 591 if (msf) { 592 /* Convert to Minutes-Seconds-Frames */ 593 addr >>= 2; /* Convert to 2048-byte frames */ 594 addr += 2*75; /* Lead-in occupies 2 seconds */ 595 dest[3] = addr % 75; /* Frames */ 596 addr /= 75; 597 dest[2] = addr % 60; /* Seconds */ 598 addr /= 60; 599 dest[1] = addr; /* Minutes */ 600 dest[0] = 0; /* Reserved */ 601 } else { 602 /* Absolute sector */ 603 put_unaligned_be32(addr, dest); 604 } 605} 606 607 608/*-------------------------------------------------------------------------*/ 609 610 611static ssize_t fsg_show_ro(struct device *dev, struct device_attribute *attr, 612 char *buf) 613{ 614 struct fsg_lun *curlun = fsg_lun_from_dev(dev); 615 616 return sprintf(buf, "%d\n", fsg_lun_is_open(curlun) 617 ? curlun->ro 618 : curlun->initially_ro); 619} 620 621static ssize_t fsg_show_nofua(struct device *dev, struct device_attribute *attr, 622 char *buf) 623{ 624 struct fsg_lun *curlun = fsg_lun_from_dev(dev); 625 626 return sprintf(buf, "%u\n", curlun->nofua); 627} 628 629static ssize_t fsg_show_file(struct device *dev, struct device_attribute *attr, 630 char *buf) 631{ 632 struct fsg_lun *curlun = fsg_lun_from_dev(dev); 633 struct rw_semaphore *filesem = dev_get_drvdata(dev); 634 char *p; 635 ssize_t rc; 636 637 down_read(filesem); 638 if (fsg_lun_is_open(curlun)) { /* Get the complete pathname */ 639 p = d_path(&curlun->filp->f_path, buf, PAGE_SIZE - 1); 640 if (IS_ERR(p)) 641 rc = PTR_ERR(p); 642 else { 643 rc = strlen(p); 644 memmove(buf, p, rc); 645 buf[rc] = '\n'; /* Add a newline */ 646 buf[++rc] = 0; 647 } 648 } else { /* No file, return 0 bytes */ 649 *buf = 0; 650 rc = 0; 651 } 652 up_read(filesem); 653 return rc; 654} 655 656 657static ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr, 658 const char *buf, size_t count) 659{ 660 ssize_t rc; 661 struct fsg_lun *curlun = fsg_lun_from_dev(dev); 662 struct rw_semaphore *filesem = dev_get_drvdata(dev); 663 unsigned ro; 664 665 rc = kstrtouint(buf, 2, &ro); 666 if (rc) 667 return rc; 668 669 /* 670 * Allow the write-enable status to change only while the 671 * backing file is closed. 672 */ 673 down_read(filesem); 674 if (fsg_lun_is_open(curlun)) { 675 LDBG(curlun, "read-only status change prevented\n"); 676 rc = -EBUSY; 677 } else { 678 curlun->ro = ro; 679 curlun->initially_ro = ro; 680 LDBG(curlun, "read-only status set to %d\n", curlun->ro); 681 rc = count; 682 } 683 up_read(filesem); 684 return rc; 685} 686 687static ssize_t fsg_store_nofua(struct device *dev, 688 struct device_attribute *attr, 689 const char *buf, size_t count) 690{ 691 struct fsg_lun *curlun = fsg_lun_from_dev(dev); 692 unsigned nofua; 693 int ret; 694 695 ret = kstrtouint(buf, 2, &nofua); 696 if (ret) 697 return ret; 698 699 /* Sync data when switching from async mode to sync */ 700 if (!nofua && curlun->nofua) 701 fsg_lun_fsync_sub(curlun); 702 703 curlun->nofua = nofua; 704 705 return count; 706} 707 708static ssize_t fsg_store_file(struct device *dev, struct device_attribute *attr, 709 const char *buf, size_t count) 710{ 711 struct fsg_lun *curlun = fsg_lun_from_dev(dev); 712 struct rw_semaphore *filesem = dev_get_drvdata(dev); 713 int rc = 0; 714 715 if (curlun->prevent_medium_removal && fsg_lun_is_open(curlun)) { 716 LDBG(curlun, "eject attempt prevented\n"); 717 return -EBUSY; /* "Door is locked" */ 718 } 719 720 /* Remove a trailing newline */ 721 if (count > 0 && buf[count-1] == '\n') 722 ((char *) buf)[count-1] = 0; /* Ugh! */ 723 724 /* Load new medium */ 725 down_write(filesem); 726 if (count > 0 && buf[0]) { 727 /* fsg_lun_open() will close existing file if any. */ 728 rc = fsg_lun_open(curlun, buf); 729 if (rc == 0) 730 curlun->unit_attention_data = 731 SS_NOT_READY_TO_READY_TRANSITION; 732 } else if (fsg_lun_is_open(curlun)) { 733 fsg_lun_close(curlun); 734 curlun->unit_attention_data = SS_MEDIUM_NOT_PRESENT; 735 } 736 up_write(filesem); 737 return (rc < 0 ? rc : count); 738}