日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

The Linux SG_IO ioctl in the 2.6 series

發布時間:2024/9/5 linux 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 The Linux SG_IO ioctl in the 2.6 series 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://gmd20.blog.163.com/blog/static/1684392320100227396270/


原文地址:http://sg.danny.cz/sg/sg_io.html

The? Linux SG_IO ioctl in the 2.6 series

  • The? Linux SG_IO ioctl in the 2.6 series
  • Introduction
  • SCSI and related command sets
  • SG_IO ioctl overview
  • SG_IO ioctl in the sg driver
  • SG_IO ioctl differences
  • open() considerations
  • SCSI command permissions
  • CAP_SYS_RAWIO from a user process
  • SG_IO and the st driver
  • Maximum transfer size per command
  • Conclusion
  • Introduction

    The? SG_IO ?ioctl permits user applications to send SCSI commands to a device. In the linux 2.4 series this ioctl was on ly available via the SCSI generic (sg) driver. In the linux 2.6 series the SG_IO ioctl is additionally available for block devices and SCSI tape (st) devices.? So there are multiple implementations of this ioctl within the kernel with slightly different characteristics and describing these is the purpose of this document.

    The information in this page is valid for linux kernel 2.6.16 .

    SCSI and related command sets

    All SCSI devices should respond to an INQUIRY command and part of their response is the so-called peripheral device type. This is used by the linux kernel to decide which upper level driver controls the device. There are also devices that belong to other (i.e. not considered SCSI) transports that use SCSI command sets, the primary examples of this are (S-)ATAPI CD and DVD drives. Not all peripheral device types map to upper level drivers and devices of these types are usually accessed via the SCSI generic (sg) driver.

    SCSI (draft) standards are found at? www.t10.org ?. SCSI commands common to all SCSI devices are found in SPC-4 while those specific to block devices are found in SBC-2, those for CD/DVD drives are found in MMC-5 and those for SCSI tape drives are found in SSC-3.

    The major non-SCSI command set in the storage area is for ATA? non-packet ?devices which are typically disks. ATA packet ?devices use ATAPI which in the vast majority of cases carry a SCSI command set. The most recent draft ATA command set standard is ATA8-ACS and can be found at? www.t13.org ?. To complicate things (non-packet) ATA devices may have their native command set translated into SCSI. This can happen in the kernel (e.g. libata in linux) or in an intermediate device (e.g. in a USB external disk enclosure). Yet another possibility are disks whose firmware can be changed to allow them to use either the SCSI or ATA command set, this may happen in the SAS/SATA area since the physical (cabling) and phy (electrical signalling) levels are so similar.

    SG_IO ioctl overview

    The third argument given to the SG_IO ioctl is a pointer to an instance of the sg_io_hdr structure which is defined in the <scsi/sg.h> header file. The execution of the SG_IO ioctl can viewed as going through three phases:
  • do sanity checks on the metadata in the sg_io_hdr instance; read the input fields and the data pointed to by some of those fields; build a SCSI command and issue it to the device
  • wait for either a response from the device, the command to timeout or the user to terminate the process (or thread) that invoked the SG_IO ioctl
  • write the output fields and in some cases write data to locations pointed to by some fields, then return
  • On ly phase 1 returns an ioctl error (i.e. a return value of -1 and a value set in errno). In phase 2, command timeouts should be used sparingly as the device (and some others on the same interconnect) may end up being reset. If the user terminates the process or thread that invoked the SG_IO ioctl then obviously phase 3 never occurs but the command execution runs to completion (or timeout) and the kernel "throws away" the results. If the command yields a SCSI status of CHECK CONDITION (in field "status") then sense da ta is written out in phase 3 .

    Now we will assume that the SCSI command involves user da ta being transferred to or from the device. The SCSI subsystem does not support true bidirectional da ta transfers to a device. All da ta DMA transfers (assuming the hardware supports DMA) occur in phase 2. However, if indirect IO is being used (i.e. neither direct IO nor mmap-ed transfers) then either:
    • data is read from the user space in phase 1 into kernel buffers and DMA-ed to the device in phase 2, or
    • data is read from the device into kernel buffers in phase 2 and written into the user space in phase 3
    When direct IO or mmap-ed transfers are being used then all user da ta is moved in phase 2 . If a process is terminated during such a da ta transfer then the kernel gracefully handles this (by pinning the associated memory pages until the transfer is complete).

    The sg_io_hdr structure has 22 fields (members) but typically on ly a small number of them need to be set. The following co de fragment shows the setup for a simple TEST UNIT READY SCSI command which has no associated da ta transfers:
    ????
    ??? unsigned char sense_b[32];
    ??? unsigned char turCmbBlk[] = {TUR_CMD, 0, 0, 0, 0, 0};
    ??? struct sg_io_hdr io_hdr;

    ??? memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
    ??? io_hdr.interface_id = 'S';
    ??? io_hdr.cmd_len = sizeof(turCmbBlk);
    ??? io_hdr.mx_sb_len = sizeof(sense_b);
    ??? io_hdr.dxfer_direction = SG_DXFER_NONE;
    ??? io_hdr.cmdp = turCmbBlk;
    ??? io_hdr.sbp = sense_b;
    ??? io_hdr.timeout = DEF_TIMEOUT;

    ??? if (ioctl(fd, SG_IO, &io_hdr) < 0) {

    The memset() call is pretty imp ortant, setting unused input fields to safe values. Setting the timeout field to zero is not a good idea; 30,000 (for 30 seconds) is a reasonable default for most SCSI commands. As always, good error processing consumes a lot more co de. This is especially the case with SCSI commands that yield "sense da ta" when something goes wrong. For example, if there is a medium error during a disk read, the sense da ta will contain the logical block address (lba) of the failure. Another error processing example is a SCSI command that the device considers an "illegal request", the sense da ta may show the byte and bit position of the field in the command block (usually referred to as a "cdb") that it objects to. For examples on error processing please refer to the sg3_utils package, its "examples" directory and its library components: sg_lib.c (SCSI error processing and tables) and sg_cmds.c (common SCSI commands).

    Below is a grouping of imp ortant sg_io_hdr structure fields with brief summaries:
    Command block (historically referred to as the "cdb"):
    • cmdp - pointer to cdb (the SCSI command block)
    • cmd_len - length (in bytes) of cdb
    Da ta transfer:
    • dxferp - pointer to user data to start reading from or start writing to
    • dxfer_len - number of bytes to transfer
    • dxfer_direction - whether to read from device (into user memory) or write to device (from user memory) or transfer no data: DXFER_FROM_DEV, DXFER_TO_DEV or DXFER_NONE respectively
    • resid - requested number of bytes to transfer (i.e. dxfer_len) less the actual number transferred
    Error indication:
    • status - SCSI status returned from the device
    • host_status - error from Host Bus Adapter including initiator (port)
    • driver_status - driver (mid level or low level driver) error and suggestion mask
    Sense da ta (on ly used when 'status' is CHECK CONDITION or (driver_status & DRIVER_SENSE) is true):
    • sbp - pointer to start writing sense data to
    • mx_sb_len - maximum number of bytes to write to sbp
    • sb_len_wr - actual number of bytes written to sbp
    The fields in the sg_io_hdr structure are defined in more detail in the? SCSI-Generic-HOWTO ?document.

    SG_IO ioctl in the sg driver

    Linux kernel 2.4.0 was the first production kernel in which the SG_IO ioctl appeared in the SCSI generic (sg) driver. The sg driver itself has been in linux since around 1993. An instance of the sg_io_hdr structure in the sg driver can either be:
    • pointed to by the third argument of the SG_IO ioctl
    • pointed to by the second argument of UNIX write() or read() system calls which have a file descriptor of a sg device node as their first argument
    The? SCSI-Generic-HOWTO ?document describes the sg driver in the lk 2.4 series including its use of the SG_IO ioctl. Prior to the lk 2.4 series the sg driver on ly had the sg_header structure. It was used as an asynchronous command interface in which command, metadata and optionally user da ta was sent via a Unix write() system call. The corresponding response which included error information (e.g. sense da ta) or optionally user da ta was received via a Unix read() system call. Two major additions were made to the sg driver at the beginning of the lk 2.4 series:
    • a new metadata structure (sg_io_hdr) as an alternative to the original mixed metadata and data structure (sg_header)
    • the SG_IO ioctl that used the new metadata structure and was synchronous: it sent a SCSI command and waited for its reply
    The sg_io_hdr on ly contains metadata in the sense that it contains pointers to locations of where da ta will come from (command or da ta in) or go to (sense da ta or da ta out). These pointers have caused problems in mixed 32/64 bit environments, especially when the user application (e.g. cdrecord) is built for 32 bits and the kernel is 64 bits. The lk 2.6 series has a compatibility layer to cope with this via co de specialized for the SG_IO ioctl. Unfortunately this problem was not foreseen when the sg_io_hdr structure was designed.

    A significant feature of the SG_IO ioctl in the sg driver is that it is user interruptible. This means between issuing a command (e.g. a long duration command like a disk format) and its response arriving a user could hit control-C on the associated application. The kernel would remain stable and resources would be cleared up at the appropriate time. The sg driver does not attempt to abort such a command that is "in flight", it simply throws away the response and cleans up. Naturally the user has no direct way of finding out whether an interrupted command succeeded or not, by there may be indirect ways.

    A warning may also be in order here: a long duration command such as format would typically be given a long timeout value. If the user interrupted the application that sent the format command then the device may remain busy doing the format (especially if the IMMED bit is not set). So if the user then sent a short duration command such as TEST UNIT READY or REQUEST SENSE to see what the device was doing, these commands may timeout. This would invoke the SCSI subsystem error handler which would most likely send a device reset, thus aborting the format, to get the device's attention. This is probably not what the user had in mind!

    SG_IO ioctl differences

    In the following table, sg_io_hdr structure fields are listed in the order they appear in that structure. Basically the "in" fields appear at the top of the structure and are read in phase 1. The latter fields are termed as "out" and are written by the SG_IO implementation in phase 3.
    ?
    Table 1. sg_io_hdr structure? summary and implementation differences
    sg_io_hdr fieldin or outtypedifferentbrief description including differences between implementations
    interface_idinint?guard field. Current implementations only accept " (int)'S' ". If not set, the sg driver sets errno to ENOSYS while the block layer sets it to EINVAL
    dxfer_directionin(-ve) intminordirection of data transfer. SG_DXFER_NONE and friends are defined as negative integers so the sg driver can discriminate between sg_io_hdr instances and those of sg_header. This nuance is irrelevant to non-sg driver usage of SG_IO. See below.
    cmd_leninunsigned char?limits command length to 255 bytes. No SCSI commands (even variable length ones in OSD) are this long (yet)
    max_sb_leninunsigned char?maximum number of bytes of sense data that the driver can output via the sbp pointer
    iovec_countinunsigned shortyesif not sg driver and greater than zero then the SG_IO ioctl fails with errno set to EOPNOTSUPP; sg driver treats dxferp as a pointer to an array struct sg_iovec when this field is greater than zero
    dxfer_lenin
    unsigned intminornumber of bytes of data to transfer to or from the device. Upper limit for block devices related to/sys/block/<device>/queue/max_sectors_kb
    dxferpin [*in or *out]void *minorpointer to (user space) data to transfer to (if reading from device) or transfer from (if writing to device). Further level of indirection in the sg driver when iovec_count is greater than 0 .
    cmdpin [*in]unsigned char *?pointer to SCSI command. The SG_IO ioctl in the sg drive fails with errno set to? EMSGSIZE if cmdp is NULL and EFAULT if it is invalid; the block layer sets errno to EFAULT? in both cases.
    sbpin [*out]unsigned char *?pointer to user data area where no more than max_sb_len bytes of sense data from the device will be written if the SCSI status is CHECK CONDITION.?
    timeoutinunsigned intyes?
    (if = 0)
    time in milliseconds that the SCSI mid-level will wait for a response. If that timer expires before the command finishes, then the command may be aborted, the device (and maybe others on the same interconnect) may be reset depending on error handler settings. Dangerous stuff, the SG_IO ioctl has no control (through this interface) of exactly what happens. In the sg driver a timeout value of 0 means 0 milliseconds, in the block layer (currently) it means 60 seconds.
    flagsinunsigned intyesBlock layer SG_IO ioctl ignores this field; the sg driver uses it to request special services like direct IO or mmap-ed transfers. It is a bit mask.
    pack_idin -> outint?unused (for user space program tag)
    usr_ptrin -> outvoid *?unused (for user space pointer tag)
    statusoutunsigned char?SCSI command status, zero implies GOOD
    masked_statusoutunsigned char?Logically: masked_status == ((status & 0x3e) >> 1). Old linux SCSI subsystem usage, deprecated.
    msg_statusoutunsigned char?SCSI parallel interface (SPI) message status (very old, deprecated)
    sb_len_wroutunsigned char?actual length of sense data (in bytes) output via sbp pointer.
    host_statusoutunsigned short?error reported by the initiator (port). These are the "DID_*" error codes in scsi.h
    driver_statusoutunsigned short?bit mask: error and suggestion reported by the low level driver (LLD). These are the "DRIVER_*" error codes in scsi.h
    residoutint?(dxfer_len - number_of_bytes_actually_transferred). Typically only set when there is a shortened DMA transfer from the device.? Not necessarily an error. Older LLDs always yield zero.
    durationoutunsigned int?number of milliseconds that elapsed between when the command was injected into the SCSI mid level and the corresponding "done" callback was invoked. Roughly the duration of the SCSI command in milliseconds.
    infooutunsigned intminorbit mask indicating what was done (or not) and whether any error was detected. Block layer SG_IO ioctl only sets SG_INFO_CHECK if an error was detected

    The DID_* and DRIVER_* error and suggestion codes (associated with host_status and driver_status) are discussed in more detail in the? SCSI-Generic-HOWTO ?document.

    open() considerations

    Various drivers have different characteristics when a device node is opened. On e problem with the ioctl system call is that a user on ly needs read permissions to execute it but may, with the ioctls like SG_IO, write to a device (e.g. format it).? Command (operation co de) sniffing logic is used to overcome this security problem. Also users of the SG_IO ioctl need to be aware when they "share" a device with sd, st or a cdrom driver that state machines within those drivers may be tricked. This may be unavoidable but the users of the SG_IO ioctl should take appropriate care.

    Opening a file in linux with flags of zero implies the O_RDONLY flag and hence read on ly access. All open() system calls can yield ENOENT (no such file or directory); ENODEV (no such device) if the file exists but there is no attached device and EACCES (permission denied) if the user doesn't have appropriate permissions.

    A user with CAP_SYS_RAWIO capability (normally associated with the "root" user) bypasses all command sniffing and other access controls that would otherwise lead to EACCES or EPERM errors. With the sg driver such a user may still need to open() a device node with O_RDWR (rather than O_RDONLY) to use all SCSI commands.

    Table 2. open() flags for SG_IO ioctl usage
    open() flagssg
    notes
    sd
    notes
    st
    notes
    cdrom
    notes
    Comments
    <none> or
    O_RDONLY
    1, 23,43,53,6best to add O_NONBLOCK. For a device with removable media (e.g. tape drive) that depends on whether the drive or its media is being accessed.
    O_RDONLY | O_NONBLOCK1,733,133recommended when SCSI commands are recognized as reading information from the device
    O_RDWR24,8,95,8,96,8,9again, could be better to add O_NONBLOCK
    O_RDWR | O_NONBLOCK78,98,9,138,9recommended when arbitrary (including vendor specific) SCSI commands are to be sent
    << interaction with O_EXCL>>10111211only use when sure that no other application may want to access the device (or partition). A surprising number of applications do "poke around" devices.
    << interaction with O_DIRECT>>--->--->requires sector alignment on data transfers (ignored by sg and st)

    Notes :
  • on subsequent SG_IO ioctl calls, the sg driver will only allow SCSI commands in its allow_ops array, others result in EPERM (operation not permitted) in errno. See?below?.
  • if previous open() of this sg device node still holds O_EXCL then this open() waits until it clears.
  • on subsequent SG_IO ioctl calls, the block layer will only allow SCSI commands listed as "safe_for_read" in the verify_command() function in the drivers/block/scsi_ioctl.c file; others result in EPERM (operation not permitted) in errno. See?below?.
  • if removable media and it is not present then yields ENOMEDIUM (no medium found)
  • if a tape is not present in drive then yields EIO (input/output error), if tape is "in use" then yields EBUSY (resource busy). Only one open file descriptor is allowed per st device node at a time (although dup() can be used).
  • if tray closed and media is not present then yields ENOMEDIUM (no medium found); if tray open then tries to close it and if no media present then yields ENOMEDIUM
  • if previous open() of this sg device node still holds O_EXCL then yields EBUSY (resource busy).
  • on subsequent SG_IO ioctl calls, the block layer will allow SCSI commands listed as either "safe_for_read" or "safe_for_write". For other SCSI commands the user requires the CAP_SYS_RAWIO capability (usually associated with the "root" user); if not yields EPERM (operation not permitted). The first instance of other SCSI commands since boot, sends an annoying "scsi: unknown opcode" message to the log.
  • if the media or drive is marked as not writable then yields EROFS (read-only file system).
  • if sg device node already has exclusive lock then a subsequent attempt to open(O_EXCL) will wait unless O_NONBLOCK is given in which case it yields EBUSY (resource busy)
  • implemented at block device level (which knows about partitions within devices). If a previous open(O_EXCL) is active then a subsequent open(O_EXCL) yields EBUSY (resource busy). Mounted file systems typically open a device/partition with O_EXCL; as long as an application using the SG_IO ioctl does not also try and use the O_EXCL flag then it will be allowed access to the device.
  • the st driver does not support (i.e. ignores) the O_EXCL flag. However the fact that it only permits one active open() per tape device is similar functionality.
  • if tape is "in use" then yields EBUSY (resource busy). Only one open file descriptor is allowed per st device node at a time.
  • The O_EXCL flag has a different effect in the sg driver and the block layer. In the sg driver, on ce O_EXCL is held on a device, all subsequent open() attempts will either wait or yield EBUSY (irrespective of whether they attempt to use the O_EXCL flag). On ce a partition/device is opened successfully in the block layer (with the sd or cdrom driver) on ly subsequent open() attempts that also use the O_EXCL flag are rejected (with EBUSY). A O_EXCL lock held on a device in the block layer has no effect on accessing the same device via the sg driver (and vice versa).

    The first successful open on a sd or a cdrom device node that has removable media will send a PREVENT ALLOW MEDIUM REMOVAL (prevent) SCSI command to the device. If successful, this will inhibit a subsequent START STOP UNIT (eject) SCSI command and de-activate the eject button on the drive. In emergencies, the SG_IO ioctl can be used to defeat this act ion, an example of this is the? sdparm ?utility, specifically "sdparm --command=unlock".

    The open() flag O_NDELAY has the same value and meaning as O_NONBLOCK. Other flags such as O_DIRECT, O_TRUNC and O_APPEND have no effect on the SG_IO ioctl.

    SCSI command permissions

    In linux a user on ly needs read permissions on a file descriptor to execute an ioctl() system command. In the case of the SG_IO ioctl, a SCSI command could be sent that obviously changes the state of a device (e.g. WRITE to a disk). So both implementations of the SG_IO ioctl require more than read permissions for some commands, especially those that are known to change the state of a device or those that have some unknown act ion (e.g. vendor specific commands).

    Here is a table of SCSI commands that don't need the user to have write permissions (or in some cases CAP_SYS_RAWIO capability which usually equates to "root" user):
    Table 3. SCSI command minimum permission requirements
    SCSI command(draft) standardsg driver requiresblock layer SG_IO
    requires (except st)
    Comments
    BLANKMMC-4O_RDWRO_RDWR?
    CLOSE TRACK/SESSIONMMC-4O_RDWRO_RDWR?
    ERASEMMC-4O_RDWRO_RDWR?
    FLUSH CACHESBC-3, MMC-4O_RDWRO_RDWRReally SYNCHRONIZE CACHE command
    FORMAT UNITSBC-3, MMC-4O_RDWRO_RDWRdefault command timeout may not be long enough
    GET CONFIGURATIONMMC-4O_RDWRO_RDONLYreads CD/DVD metadata
    GET EVENT STATUS NOTIFICATIONMMC-4O_RDWRO_RDONLY?
    GET PERFORMANCEMMC-4O_RDWRO_RDONLY?
    INQUIRYSPC-4O_RDONLYO_RDONLYAll SCSI devices should respond to this command
    LOAD UNLOAD MEDIUMMMC-4O_RDWRO_RDWRMEDIUM may be replaced by CD, DVD or nothing
    LOG SELECTSPC-4O_RDWRO_RDWRused to change logging or clear logged data
    LOG SENSESPC-4O_RDONLYO_RDONLYused to fetch logged data
    MAINTENANCE COMMAND INSPC-4O_RDONLYCAP_SYS_RAWIO
    various "REPORT ..." commands such as REPORT SUPPORTED OPERATION CODES in here
    MODE SELECT (6+10)SPC-4O_RDWRO_RDWRUsed to change SCSI device metadata
    MODE SENSE (6+10)SPC-4O_RDONLYO_RDONLYUsed to read SCSI device metadata
    PAUSE RESUMEMMC-4O_RDWRO_RDONLY?
    PLAY AUDIO (10)MMC-4O_RDWRO_RDONLY?
    PLAY AUDIO MSFMMC-4O_RDWRO_RDONLY?
    PLAY AUDIO TI??O_RDWRO_RDONLYopcode 0x48, unassigned to? any spec in SPC-4
    PLAY CDMMC-2O_RDWRO_RDONLYold, now SPARE IN in SPC-4
    PREVENT ALLOW MEDIUM REMOVALSPC-4, MMC-4O_RDWRO_RDWRsd, st and cdrom drivers use this internally
    READ (6+10+12+16)SBC-3O_RDONLYO_RDONLYREAD(16) requires O_RDWR with the sg driver before lk2.6.11
    READ BUFFERSPC-4O_RDONLYO_RDONLY?
    READ BUFFER CAPACITYMMC-4O_RDWRO_RDONLY?
    READ CAPACITY(10)SBC-3, MMC-4O_RDONLYO_RDONLY?
    READ CAPACITY(16)SBC-3,
    MMC-4
    O_RDONLYCAP_SYS_RAWIOwithin SERVICE ACTION IN command. Needed for RAIDs larger than 2 TB
    READ CDMMC-4O_RDWRO_RDONLY?
    READ CD MSFMMC-4O_RDWRO_RDONLY?
    READ CDVD CAPACITYSBC-3, MMC-4O_RDONLYO_RDONLYStrange (old ?) name from cdrom.h . Actually is READ CAPACITY.
    READ DEFECT (10)SBC-3O_RDWRO_RDONLY?
    READ DISC INFOMMC-4O_RDWRO_RDONLY?
    READ DVD STRUCTUREMMC-4O_RDWRO_RDONLY?
    READ FORMAT CAPACITIESMMC-4O_RDWRO_RDONLY?
    READ HEADERMMC-2O_RDWRO_RDONLY?
    READ LONG (10)SBC-3O_RDONLYO_RDONLYbut not READ LONG (16)
    READ SUB-CHANNELMMC-4O_RDWRO_RDONLY?
    READ TOC/PMA/ATIPMMC-4O_RDWRO_RDONLY?
    READ TRACK (RZONE) INFOMMC-4O_RDWRO_RDONLYIn MMC-4 called READ TRACK INFO
    RECEIVE DIAGNOSTICSPC-4O_RDONLYCAP_SYS_RAWIOthe SES command set uses this command a lot. An SES device is only accessible via an sg device node
    REPAIR (RZONE) TRACKMMC-4O_RDWRO_RDWR?
    REPORT KEYMMC-4O_RDWRO_RDONLY?
    REPORT LUNSSPC-4O_RDONLYCAP_SYS_RAWIOmandatory since SPC-3
    REQUEST SENSESPC-4O_RDONLYO_RDONLYhas uses other than those displaced by autosense
    RESERVE (RZONE) TRACKMMC-4O_RDWRO_RDWR?
    SCANMMC-4O_RDWRO_RDONLY?
    SEEKMMC-4O_RDWRO_RDONLY?
    SEND CUE SHEETMMC-4O_RDWRO_RDWR?
    SEND DVD STRUCTUREMMC-4O_RDWRO_RDWR?
    [SEND EVENT]MMC-2?O_RDWRcdrom.h associates opcode 0xa2 but MMC-2 uses opcode 0x5d ??
    SEND KEYMMC-4O_RDWRO_RDWR?
    SEND OPC INFORMATIONMMC-4O_RDWRO_RDWR?
    SERVICE ACTION INSPC-4, SBC-3O_RDONLYCAP_SYS_RAWIOREAD CAPACITY (16) service action in here
    SET CD SPEEDMMC-4O_RDWRO_RDWRcdrom.h calls this SET SPEED
    SET STREAMINGMMC-4O_RDWRO_RDWR?
    START STOP UNITSBC-3, MMC-4O_RDWRO_RDONLYhmm
    STOP PLAY/SCANMMC-4O_RDWRO_RDONLY?
    SYNCHRONIZE CACHESBC-3, MMC-4O_RDWRO_RDWRcdrom.h calls this FLUSH CACHE
    TEST UNIT READYSPC-4O_RDONLYO_RDONLYAll SCSI devices should respond to this command
    VERIFY (10+16)SBC-3, MMC-4O_RDWRO_RDONLY?
    WRITE (6+10+12+16)SBC-3O_RDWRO_RDWR?
    WRITE LONG (10+16)SBC-3O_RDWRO_RDWR?
    WRITE VERIFY (10+16)SBC-3, MMC-4O_RDWRO_RDWRonly WRITE VERIFY(10) is in MMC-4

    Any other SCSI command (opcode) not mentioned for the sg driver needs O_RDWR. Any other SCSI command (opcode) not mentioned for the block layer SG_IO ioctl needs a user with CAP_SYS_RAWIO capability. All "block" SG_IO ioctl calls on st device nodes need a user with CAP_SYS_RAWIO capability. If a user does not have sufficient permissions to execute a SCSI command via the SG_IO ioctl then the system calls fails (i.e. no SCSI command is sent) and errno is set to EPERM (operation not permitted).

    Both the sg driver and the block layer SG_IO co de use internal tables to enforce the permissions shown in the above table (allow_ops and cmd_type [safe_for_read and safe_for_write] respectively). This technique doesn't scale well, since more advanced command sets (e.g. OSD) use service actions (and on e opcode: 0x7f in the case of OSD). There may also be overlap in opcode usage between command sets, for example between SBC, MMC and SSC.

    CAP_SYS_RAWIO from a user process

    While root processes usually have CAP_SYS_RAWIO, processes running under a user's ID (i.e. non-root) typically don't. Hence non-root processes may not be able to use SG_IO to send SCSI commands that require CAP_SYS_RAWIO. This may occur even if the permission bits of the device node file allow for read or write access, user processes will receive EPERM when using SG_IO.?

    By default the capability to assign capabilities to other processes (CAP_SETPCAP) is limited to very few processes, such as certain kernel threads. Changing this default would require to change and recompile the kernel.

    Processes which are forked by a root process and call setuid later will lose the CAP_SYS_RAWIO capability the parent root process (and the child before the setuid) had. However, the child can preserve the capabilities of the root process in the permitted set and raise it after the call of setuid:

    /* ... in child after fork(), still running as root ... */
    prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
    setuid(...);
    cap_set_proc(cap_from_text("cap_sys_rawio+ep"));

    This way a user process with a parent root process can 'get back' the required capabilities to directly send SCSI commands to a device via SG_IO.

    The above technique may be of use to daemons that are started with root permissions (most are) and then changes to another user after a fork(). It is not obvious to the author how utilities that use the SG_IO ioctl on device nodes that require CAP_SYS_RAWIO for some or all SCSI commands (e.g. nodes associated with the sd and st drivers) can use the above technique.

    SG_IO and the st driver

    In order to implement its user space API, the st driver has to maintain information about where the read head is with respect to the structural elements of the tape (filemarks, beginning of tape, end of da ta). Because the streaming device SCSI commands don't have addresses, the st driver has to know what commands have been sent. When reading, the filemarks are noticed when a read fails and sense da ta is fethed. If SG_IO is mixed with tape commands, the st driver may lose information (it does not look at the SG_IO commands and results). Because of this, the st driver may not implement the semantics the user expects. If the user accepts this or knows when using? SG_IO does not cause information loss, then using SG_IO is OK.

    So mixing st driver read, write and ioctl commands with SCSI commands sent via SG_IO that change the state of the tape is not recommended. This applies whether the SG_IO SCSI commands are sent via st or sg device nodes.

    Maximum transfer size per command

    The largest amount of da ta that can be transferred by a single SCSI command is often a concern. Various SCSI command sets (e.g. SBC-3 for disk READs and WRITEs, SSC-3 for tape READs and WRITEs, and SPC-4 for READ+WRITE BUFFER) allow very large da ta transfer sizes but Linux is not so accommodating. The Host Bus Adapter (HBA) could have transfer size limits as could the transport and finally the SCSI device itself. In the latter case SBC-3 defines a "Block Limits" Vital Product Da ta (VPD) while SSC has the READ BLOCK LIMITS SCSI command. SBC-3's optional Block Limits VPD page contains both maximum and optimal counts. In the author's opinion that latter distinction is very imp ortant: the block susbsystem should try and use optimal sizes while pass through users should on ly be constrained by maximum sizes. Also if a pass through user exceeds a maximum transfer size imposed by a SCSI device, then the device can report an error. There is an underlying assumption that the applications using a pass through interface know what they are doing, or at least know more than the various kernel susbsystems. On the other hand, the kernel has the responsibility to allocate critical shared resources such as memory.

    In the past, Linux used a single, "big-enough", block of memory for the source or destination of large da ta transfers. Then scatter-gather lists where added to break transfers up into smaller (often "page" size (4 KB on i386 architecture)) chunks which made memory management easier for the kernel. Now, in the lk 2.6 series, the single block of memory option is being phased out.?

    The Linux SCSI subsystem imposes a 128 element limit on scatter gather lists via its SCSI_MAX_PHYS_SEGMENTS define. The way various memory pools are allocated by the linux SCSI subsystem, SCSI_MAX_PHYS_SEGMENTS could be increased to 256. Associated with each type of HBA there is normally a low level driver (LLD). Each LLD can further limit the maximum number of elements with the scsi_host_template::sg_tablesize field. Prior to lk 2.6.16 the sg and st drivers used the .sg_tablesize field on ly, since lk 2.6.16 those drivers are also constrained by SCSI_MAX_PHYS_SEGMENTS. This leads to a potential halving of the maximum transfer size. Many LLDs set the .sg_tablesize field to SG_ALL (which is 255) but they may as well set that field to 256 unless the HBA hardware has a constraint.

    User space memory may be allocated as the source and/or destination for DMA transfers from the HBA (i.e. direct IO). Even if the user space allocated a large amount of memory with a single malloc(), the HBA DMA element typically has a different view of memory. This view may well contain many "page" size discontinuous pieces. This has the effect of using up, or perhaps exhausting, scatter-gather elements.

    The sg driver attempts to build scatter gather lists with each element up to SG_SCATTER_SZ bytes large. This define is found in include/scsi/sg.h and has been set to 32 KB for some years. That is 8 times the page size (of 4 KB) on the i386 architecture. Some users who need really large transfers increase this define (and it is best to keep it a power of 2). However since lk 2.6.16 another limit comes into play: the MAX_SEGMENT_SIZE define which is set to 64 KB. MAX_SEGMENT_SIZE is a default and can be overridden by the LLD calling blk_queue_max_segment_size().

    In lk 2.6.16 two further LLD parameters come into play even when the sg (and st) driver is used. These are scsi_host_template::max_sectors and scsi_host_template::use_clustering .??

    The .max_sectors setting in the LLD is the maximum number of 512 byte sectors allowed in a single SCSI command's scatter gather lists (for da ta transfers). Yes, that is a strange limit when trying to send a SCSI WRITE BUFFER command to upload firmware. Sysfs makes the LLD's .max_sectors setting visible (converted to kilobytes) in /sys/block/sd<x>/queue/max_hw_sectors_kb . The maximum allowable value in a LLD's .max_sector seems to be 65535 (0xffff in hexadecimal). This limits the maximum transfer size to (32*1024*1024 - 512) bytes, assuming other limitations have been overcome. [The 65535 sector limit is because Scsi_Host::max_sectors has type "unsigned short". Hopefully this type is expanded to "int" in the future (or removed).]

    The .use_clustering field should be set to ENABLE_CLUSTERING . If not, the block subsystem rebuilds the scatter gather list it gets from the sg driver with page size (e.g. 4 KB) elements. [Actually is does that anyway, but when ENABLE_CLUSTERING is set, it coalesces them again!]

    Conclusion

    In some situations, sending commands via the SG_IO ioctl may interfere with a higher level driver's use of a device. Users of the SG_IO ioctl should be aware that they are using a powerful, but low level facility, and write co de accordingly. An example of this would be a utility to perform self tests on a disk: "background" self tests should be preferred over "foreground" self tests if there is a chance the computer may be using a file system on that disk at the time. Even a short foreground self test may take up to two minutes which is a long time to lock out a file system.

    Return to?main?page.

    Last updated: 26th July 2008



    總結

    以上是生活随笔為你收集整理的The Linux SG_IO ioctl in the 2.6 series的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久青草影院 | 国产精品久久久久久久久久妇女 | 国产综合视频在线观看 | 国产一线二线三线性视频 | 日韩综合第一页 | 超级碰99| 久久这里有精品 | av理论电影 | 69中文字幕 | 国内精品免费 | 天天干天天干 | 成人免费视频视频在线观看 免费 | av在线色 | 国产精品99久久久久久人免费 | 丁香综合激情 | 精品国产自在精品国产精野外直播 | 免费观看久久 | 97国产情侣爱久久免费观看 | 91九色蝌蚪视频网站 | 日本中文字幕电影在线免费观看 | 国产精品久久一区二区三区, | 美女网站视频免费黄 | 国产日韩精品一区二区三区 | 国产探花在线看 | 最新日韩视频 | 天天干天天操av | 日韩在线免费高清视频 | 国产麻豆剧果冻传媒视频播放量 | 永久免费的啪啪网站免费观看浪潮 | 国产精品综合久久久久久 | 日韩色一区二区三区 | 国产三级在线播放 | 久草在线中文视频 | 黄色毛片电影 | 国产精品永久久久久久久久久 | 日本三级吹潮在线 | 97在线成人 | 中文字幕免费国产精品 | 欧美成人久久 | 欧美在线aa | 国产高清在线看 | 亚洲精品国产精品国自 | 国语自产偷拍精品视频偷 | 性色av免费观看 | 久久免费精品视频 | 国产激情电影综合在线看 | www.久久色 | 在线观看爱爱视频 | 字幕网在线观看 | 91综合色| 国产精品v欧美精品 | 麻花传媒mv免费观看 | 在线99热 | 日韩免费电影 | 欧美成年黄网站色视频 | 久草在线视频国产 | 天堂av最新网址 | 色综合a| 亚洲一区精品二人人爽久久 | 久久久亚洲精华液 | 欧美精品少妇xxxxx喷水 | 亚洲欧美视频一区二区三区 | 中日韩欧美精彩视频 | 日韩在线高清 | 国产夫妻性生活自拍 | 玖玖精品视频 | 久艹在线观看视频 | 精品福利片 | 久久综合五月 | 天天射天天干天天插 | 久草在线视频免费资源观看 | 亚洲在线观看av | 亚洲电影av在线 | 久久午夜电影网 | 国产精品99免费看 | 亚洲国产精品电影 | 国产在线精品视频 | 中文字幕免费国产精品 | 免费观看不卡av | 四虎视频 | 中文字幕高清av | 色视频国产直接看 | 欧美精品久久久久a | a午夜在线 | 91免费看片黄 | 国产高清在线精品 | 久久国产亚洲 | 香蕉视频最新网址 | 国产91精品久久久久久 | 国产精品久久久久四虎 | a黄色影院| 久久8| 国产视频精品免费播放 | 色婷婷视频在线观看 | 亚洲天堂网在线视频 | 日韩伦理片hd | 热re99久久精品国产66热 | 24小时日本在线www免费的 | 国产精品美女久久久久久2018 | 精品久久久影院 | 国产精品入口久久 | 亚洲精品综合在线 | 在线免费高清一区二区三区 | 天天色天天爱天天射综合 | 欧美色图亚洲图片 | 国产一区二区三区在线免费观看 | 久久99精品久久久久久三级 | 中文在线免费一区三区 | 999在线视频 | av千婊在线免费观看 | 六月婷婷久香在线视频 | 午夜视频在线观看一区二区三区 | 开心婷婷色 | 国产在线国偷精品产拍免费yy | 欧美日韩大片在线观看 | 日本久久高清视频 | 国产精品福利一区 | 日韩在线电影一区 | 中文伊人| 91精品免费视频 | 国产成人一区二区三区久久精品 | 五月天激情电影 | 中文字幕在线资源 | 日韩欧美一区二区三区视频 | 麻豆精品91 | 久久亚洲欧美 | 麻豆国产精品一区二区三区 | av中文字幕在线免费观看 | 黄污视频网站 | 激情视频在线观看网址 | 91成人亚洲 | 91在线免费看片 | 午夜精品久久久久久久99无限制 | 亚洲成人资源在线 | 久久伦理电影网 | 日本久久精| 免费观看黄 | 五月综合网站 | 亚洲精品在线视频 | 午夜影院日本 | 一区二区三区四区五区六区 | 99视频国产精品 | 精品国产aⅴ麻豆 | 黄色一级在线视频 | 九九热精品视频在线观看 | 国产男女爽爽爽免费视频 | 免费在线观看日韩欧美 | 波多野结衣电影久久 | 超级碰碰免费视频 | 免费男女羞羞的视频网站中文字幕 | 一级片在线 | 国产精品理论视频 | 亚洲欧美日韩一二三区 | 欧美日韩高清 | 国产欧美日韩精品一区二区免费 | 亚洲三级黄色 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 久久综合加勒比 | 天堂在线一区二区 | 91亚洲精品在线观看 | 日日爽视频 | 美女国产精品 | av888.com| 亚洲精品国偷拍自产在线观看蜜桃 | 久久精品视频国产 | 区一区二区三区中文字幕 | 久久亚洲欧美日韩精品专区 | 国产精品久久久久久久av大片 | 日韩精品久久一区二区三区 | av在观看 | 99草在线视频 | 高清不卡毛片 | 一区二区三区在线免费观看 | 国产群p视频 | 亚洲最大成人免费网站 | 国产一区二区三区网站 | 一区二区欧美在线观看 | 成人a视频在线观看 | 国产精品视频全国免费观看 | 国产经典三级 | 激情伊人五月天久久综合 | 手机在线永久免费观看av片 | 色综合久久综合 | 久草综合在线观看 | 国产视频精选 | 亚洲人片在线观看 | 色噜噜在线观看 | 91精品国产99久久久久久久 | 国产专区视频在线观看 | 精品亚洲视频在线 | 国产香蕉在线 | 麻豆视频网址 | 麻花豆传媒mv在线观看网站 | 国产综合久久 | 黄色免费网 | 99精品一区二区三区 | 中文字幕色在线 | 日本动漫做毛片一区二区 | 国产精品欧美久久久久久 | av在线播放一区二区三区 | 开心激情综合网 | 午夜精品久久久久99热app | 久久精品高清视频 | 永久免费在线 | 国产网站av| 中文字幕久久精品 | 一区二区理论片 | 成人精品视频 | 国产精品一区二区62 | 国产高清永久免费 | 国产成人精品a | 在线电影播放 | 国产区久久 | 三级av在线 | 欧美日韩三区二区 | 日韩高清精品一区二区 | 国产区精品视频 | 99riav1国产精品视频 | 亚洲综合视频在线 | 在线免费视频你懂的 | 免费视频二区 | 99麻豆久久久国产精品免费 | 成人黄色在线观看视频 | 叶爱av在线 | 日韩网 | 久久艹艹| 手机av看片 | 久久五月情影视 | 国产一区二区在线免费播放 | 久久九九视频 | 91精品免费看 | 国产麻豆精品传媒av国产下载 | 国产乱码精品一区二区三区介绍 | 国产伦精品一区二区三区高清 | 激情视频免费在线 | 欧美久久久久久久 | 精品免费在线视频 | 日韩在线电影一区 | 99久久久久国产精品免费 | 久久精品视频免费观看 | 黄色福利视频网站 | 久艹在线播放 | 亚洲韩国一区二区三区 | 日韩sese | 成人一区二区在线观看 | 亚洲色综合| 高清视频一区 | 日韩欧美在线高清 | 99久久精品无码一区二区毛片 | 91av视频在线播放 | 久爱精品在线 | 综合久久网 | 久久社区视频 | av在线收看 | 国产在线a| 精品国产aⅴ一区二区三区 在线直播av | 日本大尺码专区mv | 色婷婷狠狠| 992tv在线成人免费观看 | 精品成人国产 | 免费观看一级 | 色.www| 91九色在线观看视频 | 蜜桃麻豆www久久囤产精品 | 精品不卡av | 久草在线视频网 | 久久久久电影网站 | 欧美性猛片, | 丁香激情五月 | 99色 | 黄色大全在线观看 | 日韩网站中文字幕 | 91一区啪爱嗯打偷拍欧美 | 91视频久久久久久 | 久久超碰网 | 美女福利视频 | 一区二区三区四区在线免费观看 | 美女一二三区 | 在线观av | 999久久久免费精品国产 | 国产午夜一区二区 | 99视频播放 | 天天爱天天操天天射 | 人人揉人人揉人人揉人人揉97 | 97在线视频免费看 | 久久综合亚洲鲁鲁五月久久 | 一区二区成人国产精品 | 国产精品久久99精品毛片三a | 日韩久久久久久久久 | 国产亚洲在线观看 | a国产精品 | 99精品视频网 | 国产精品免费大片视频 | 岛国一区在线 | 91精品国产成人 | 人人舔人人干 | 国产成人免费在线 | h文在线观看免费 | 一级黄色片在线 | 国产精品久久在线观看 | 中文在线a在线 | 久久99精品久久久久久清纯直播 | 亚洲一级性 | 国色天香在线观看 | 亚洲日本激情 | 国产又黄又爽又猛视频日本 | 99精品国产福利在线观看免费 | 精品久久久国产 | 特级西西人体444是什么意思 | www.精选视频.com | 9999国产| 久久99爱视频 | 狠狠插天天干 | 欧美日韩高清 | 91精品视频免费 | 黄色免费网战 | 亚洲综合一区二区精品导航 | 国产精品va在线观看入 | 国产亚洲精品成人av久久ww | 国产一区二区网址 | 在线观看一级视频 | 久久av观看| 中文字幕在线播出 | 国产视频精品在线 | 在线婷婷| 亚洲精品字幕在线 | 国产+日韩欧美 | 天天草天天干天天射 | av免费在线观看网站 | 九9热这里真品2 | 日韩欧美69 | 国产亚洲成人网 | 玖草影院 | 911久久香蕉国产线看观看 | 玖玖爱在线观看 | 成人三级黄色 | 在线观看久久久久久 | 超碰97免费| 亚洲精品影院在线观看 | 狠狠综合 | 日日日干 | 天天摸日日操 | 色wwww| 婷婷五月在线视频 | 亚洲精品在线免费 | 91亚洲精品乱码久久久久久蜜桃 | 人人澡人人舔 | 久久97超碰 | 色中射 | 日韩伦理一区二区三区av在线 | 久久超碰97 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 中文字幕在线久一本久 | 国产精品久久久视频 | 国产成人一区二区三区影院在线 | 久久伊人国产精品 | 日韩av有码在线 | 在线观看中文字幕第一页 | 999久久久久久久久久久 | 精品视频免费看 | 精油按摩av | 午夜精品久久久久久久久久久久久久 | 在线视频免费观看 | 日韩网站在线免费观看 | 国产99精品在线观看 | 国产艹b视频| 欧美精品在线观看免费 | 日日爱999| 日韩午夜大片 | 亚洲男男gaygay无套 | 日韩在线视频一区二区三区 | 久久高清免费 | 在线 欧美 日韩 | 亚洲日本va在线观看 | av在线网站大全 | 夜夜躁天天躁很躁波 | 国产精品久久99综合免费观看尤物 | 高清在线一区 | 免费看黄在线网站 | 97狠狠干| av片免费播放 | 日韩网站中文字幕 | 毛片一区二区 | 国产一级一级国产 | 91丨九色丨勾搭 | 国产盗摄精品一区二区 | 欧美日韩不卡在线 | 国产成人精品国内自产拍免费看 | 亚洲精品国产精品乱码在线观看 | 在线激情影院一区 | 亚洲另类视频在线观看 | 亚洲视频免费在线看 | a色视频| 日韩免费福利 | 亚洲精品日韩一区二区电影 | 97在线视频观看 | 久草在线最新视频 | 欧美日本国产在线观看 | av网站免费线看精品 | 精精国产xxxx视频在线播放 | 五月婷婷久草 | 一区二区三区四区五区在线 | 国产视频2021 | 波多野结衣一区二区三区中文字幕 | 免费性网站 | 成人免费视频观看 | 激情五月网站 | 亚洲精品资源在线观看 | 久久看片网 | 日日碰夜夜爽 | 一级黄色电影网站 | 综合久久一本 | 日本精品久久久久影院 | 久操视频在线播放 | 国产精品99视频 | 91在线免费观看国产 | 激情 亚洲 | 午夜视频在线瓜伦 | 国产亚洲va综合人人澡精品 | 在线天堂视频 | 97超碰人人澡人人爱学生 | 国产精品久久久久久久久久久免费看 | 婷婷综合网 | 久久午夜精品 | 中文字幕在线视频精品 | 人人玩人人添人人 | 精品在线一区二区三区 | 日韩在线观看你懂的 | 亚洲精品久久久久999中文字幕 | 国产精品色婷婷 | 亚洲男男gaygay无套同网址 | 亚洲一级黄色 | 在线蜜桃视频 | 精品一区二区免费在线观看 | 免费午夜在线视频 | 999电影免费在线观看2020 | 国产精品毛片久久久久久久 | 在线影视 一区 二区 三区 | 日韩欧美在线观看一区 | 日韩av美女 | 九色在线视频 | 又黄又爽又无遮挡的视频 | 国内精品久久久久影院日本资源 | 91麻豆精品国产91久久久使用方法 | 狠狠干免费 | av在线一 | 日韩三级中文字幕 | 在线观看你懂的网址 | 久久国产精品小视频 | 亚洲国产精品免费 | 久草在线最新视频 | 国产精品亚洲视频 | 国产一级高清 | 99在线观看视频网站 | 综合网伊人 | 亚洲精品中文在线资源 | 国产成人亚洲精品自产在线 | 久久久久人人 | 久久国产精品免费一区 | 18做爰免费视频网站 | 免费在线看成人av | 91成年人网站| 亚洲国产精品视频在线观看 | 亚洲女人av| 狠狠色综合网站久久久久久久 | 一区二区三区福利 | avcom在线 | 久久优 | 久久96 | 夜色资源站wwwcom | 97免费公开视频 | 88av网站 | 国产精品久久电影观看 | 国产精品久久久久一区二区三区共 | 中文一区二区三区在线观看 | 色综合久久综合 | 成人资源网 | 欧美精品久久久久久久久久白贞 | 操老逼免费视频 | 欧美在线视频日韩 | 福利一区二区在线 | 欧美精选一区二区三区 | 国产视频导航 | 国产视频一区二区在线播放 | 久久久久成人精品 | 黄网站免费大全入口 | 国产精品a成v人在线播放 | 精品字幕在线 | 亚洲精品一区二区久 | 夜色资源站wwwcom | 日本成人中文字幕在线观看 | 成年人免费观看国产 | 日韩一三区 | 免费亚洲婷婷 | 国产精品女同一区二区三区久久夜 | 国产精品理论在线观看 | 久久免费视频一区 | 亚洲成人一二三 | 日本黄色免费大片 | 91最新网址 | 国产香蕉视频 | 久久久久国产视频 | 91av在线国产 | 日本久久久久 | 婷婷丁香在线观看 | 色综合咪咪久久网 | 欧美日韩国产一区二区在线观看 | 精品久久一区二区 | 美女黄频免费 | 亚洲精品女人 | 中文字幕日本在线 | 99国产精品视频免费观看一公开 | 在线视频观看亚洲 | av午夜电影 | 日韩在线播放视频 | 日日操天天操夜夜操 | 久久国产精品免费视频 | 婷婷网在线 | 成人少妇影院yyyy | 麻豆视频一区二区 | 精品在线你懂的 | 中文字幕在线播放日韩 | 99精品国产在热久久下载 | 五月天av在线 | 中文字幕在线国产 | 亚洲香蕉在线观看 | 99精品免费久久久久久日本 | 激情久久久久久久久久久久久久久久 | 少妇精69xxtheporn | 欧美孕妇与黑人孕交 | 久久综合精品国产一区二区三区 | 五月情婷婷 | 久草视频免费在线播放 | 国产色妞影院wwwxxx | 一区二区三区中文字幕在线观看 | 国产高清在线免费观看 | 国产午夜亚洲精品 | 国产一区国产二区在线观看 | 日日操日日插 | 激情网站网址 | 日韩一区二区三区高清在线观看 | 97超碰人人澡人人爱学生 | 国产精品一区二区三区免费视频 | 亚洲精品在线观看中文字幕 | 中文字幕中文字幕在线一区 | 久草在线最新视频 | 丁香花在线视频观看免费 | 国产精品原创av片国产免费 | 日韩精品一区二区三区在线视频 | 欧美一级久久久久 | 97国产精品一区二区 | 黄色com| 日韩精品中字 | 婷婷综合网 | 午夜在线资源 | 黄色99视频 | 91精品视频播放 | 99久久精品国产欧美主题曲 | 国产99在线播放 | 欧美日韩国产页 | 日韩视频专区 | 伊人首页 | 国产成人三级三级三级97 | 欧美在线视频一区二区 | 国产四虎影院 | 美女网站色 | www.色午夜.com | 黄色三级网站在线观看 | 美女黄濒 | 日本久久免费电影 | 午夜久久久久久久久久久 | 亚洲天堂va | 999成人精品 | 爱情影院aqdy鲁丝片二区 | 久久综合免费视频影院 | 成人免费精品 | 91最新网址在线观看 | 91精品在线免费 | 久草网视频在线观看 | 国产在线观看一 | 91人人揉日日捏人人看 | 久久婷婷开心 | 久久男人中文字幕资源站 | 成人免费看片网址 | 在线观看一区 | 成人在线小视频 | 国产黄 | 人人干天天射 | 成人亚洲网 | 国产精品美女久久久久久2018 | 激情五月综合 | av在线最新| 亚洲涩涩涩| 欧美成年网站 | 亚洲国产成人在线播放 | 波多野结衣视频一区 | 香蕉视频最新网址 | av黄色免费网站 | 亚洲综合狠狠干 | 久久爱导航 | 韩国av一区二区 | 国内丰满少妇猛烈精品播放 | 色永久免费视频 | 亚洲va综合va国产va中文 | 欧美精品二| 久久综合欧美精品亚洲一区 | avwww在线| av电影中文字幕在线观看 | 人人要人人澡人人爽人人dvd | 一区二区三区免费在线观看视频 | 91在线国产观看 | 18岁免费看片| 精品久久久一区二区 | 天天插一插 | 黄色软件网站在线观看 | 久久久久一区二区三区四区 | 欧美一区二区在线 | 国产小视频在线播放 | 久久综合色一综合色88 | 亚洲综合网 | 丁香五月亚洲综合在线 | 亚洲精品久久视频 | 欧美黄污视频 | av在线永久免费观看 | 最新av在线播放 | 久草在线免费资源 | 日本黄色黄网站 | 天天夜夜操 | 国产精品18久久久久久不卡孕妇 | 深爱激情婷婷网 | 亚洲黄色av| 麻豆 91 在线 | a级黄色片视频 | 九九热在线观看视频 | 麻豆视频国产 | 国产美女主播精品一区二区三区 | 热久久精品在线 | 国产精品自产拍在线观看桃花 | 亚洲 欧洲 国产 日本 综合 | 三级黄色欧美 | 2021久久| 黄色毛片视频免费观看中文 | 色婷婷综合五月 | www.com.黄 | 日韩专区一区二区 | 天天射综合网视频 | 亚洲欧美日本一区二区三区 | 17videosex性欧美 | 免费精品国产va自在自线 | 国产成年免费视频 | 久久久网址| 午夜资源站 | 欧美嫩草影院 | v片在线播放 | 日韩一级黄色大片 | 精品一区二区日韩 | 色婷婷国产 | 五月天中文字幕mv在线 | 国产精品正在播放 | 亚洲激情在线视频 | 日日碰狠狠添天天爽超碰97久久 | .国产精品成人自产拍在线观看6 | 免费男女网站 | 久久深夜 | 成人在线视 | 六月丁香综合 | 久久人人爽人人片av | 99国产精品一区 | 亚洲免费公开视频 | 啪一啪在线| 久久成人综合视频 | 欧美老少交 | 国产精品中文字幕av | av中文字幕在线观看网站 | 综合久久网 | 亚洲综合视频在线 | 91麻豆高清视频 | 午夜视频导航 | 成年人免费看片 | 久久久久久久网站 | 久久视频在线免费观看 | 国产一区二区精品 | 四虎国产精品成人免费影视 | www.久久久久| 国产美女黄网站免费 | 国产精品国产三级国产专区53 | av资源网在线播放 | 亚洲午夜小视频 | 精品九九久久 | 亚洲艳情 | av理论电影 | 久草视频一区 | 国产一级黄色电影 | a成人v在线 | 国产一级片免费观看 | 久久精品欧美 | 亚洲视频久久久 | 欧洲精品久久久久毛片完整版 | 国产精品久久嫩一区二区免费 | 国产成人精品一区二区三区免费 | 免费在线观看中文字幕 | 久草在线视频在线 | 黄色网大全 | 丁香六月综合网 | 日韩av不卡在线播放 | 天天天天天天天操 | 69精品久久| 婷婷伊人五月天 | 亚洲va综合va国产va中文 | 免费影视大全推荐 | 91九色国产蝌蚪 | 日韩羞羞| 色婷婷av一区 | 亚洲区色 | 最新中文字幕在线播放 | 人人爽人人爽人人片av | 免费在线激情电影 | 五月婷婷色综合 | 久色婷婷 | 人人插人人射 | 成人在线免费av | 欧美激情视频一二区 | 久草在线观 | 美女视频黄在线观看 | 91大神精品视频在线观看 | 久久久天天操 | 日韩午夜精品 | 一级久久精品 | 九九九九九精品 | 中文字幕亚洲国产 | 久久视频精品在线观看 | 日韩剧情 | 97超视频免费观看 | 蜜臀aⅴ国产精品久久久国产 | 操操操夜夜操 | 在线欧美a| 国产精品人成电影在线观看 | 婷婷精品进入 | 国产免费又爽又刺激在线观看 | 色综合天天综合网国产成人网 | 国产精品v欧美精品 | 久久黄色a级片 | 日韩在线激情 | 日产乱码一二三区别在线 | 麻豆视频免费版 | 久久99热这里只有精品国产 | 九九久久久久久久久激情 | 亚洲日韩中文字幕 | 在线精品视频免费观看 | 手机色站| 国产成人资源 | 国产精品成人一区二区三区吃奶 | 少妇啪啪av入口 | 一区二区视频在线观看免费 | 亚洲国产精品久久久久 | 久久er99热精品一区二区 | 久久av中文字幕片 | 99热精品久久 | 国产精品一区免费看8c0m | 婷婷5月色| 黄色av在| 国产中文字幕一区二区三区 | 最新av免费在线 | 精品成人在线 | 亚州精品在线视频 | 99久久精品国产一区二区三区 | 亚洲区另类春色综合小说校园片 | 欧美最猛性xxxxx亚洲精品 | 日韩一区二区三免费高清在线观看 | 日本aaa在线观看 | 看av免费 | 亚洲伊人第一页 | 99精品国产兔费观看久久99 | 中文字幕最新精品 | 欧美性色综合网站 | 92国产精品久久久久首页 | 91精品国产高清自在线观看 | 天天操天天干天天操天天干 | 九草在线视频 | 9免费视频 | 亚州精品在线视频 | 久久免费视频3 | 国产高清视频在线观看 | 青青河边草免费直播 | 免费在线观看不卡av | 国产成人三级在线 | 中文字幕久久久精品 | 99久免费精品视频在线观看 | 欧美日韩在线免费观看 | 国产精品h在线观看 | 97在线观看 | 国产一区自拍视频 | 欧美二区三区91 | 日韩欧美视频免费观看 | 99视频精品 | 99精品乱码国产在线观看 | 国产视频在线免费 | 亚洲美女精品视频 | 国产一区在线视频 | 99久久日韩精品免费热麻豆美女 | 欧洲一区二区在线观看 | 日韩免费电影网 | 在线视频a| 久草视频在线免费播放 | 精品一区二区久久久久久久网站 | 97成人精品区在线播放 | 精品成人a区在线观看 | 久久精品7| 色中色综合 | 婷婷精品国产一区二区三区日韩 | 国产日韩视频在线 | 久久成年人网站 | 亚洲最新av网址 | av黄色成人 | 91香蕉亚洲精品 | 蜜臀久久99静品久久久久久 | 一级c片 | 免费欧美 | 99热超碰在线 | 在线免费观看涩涩 | 欧美一二三四在线 | 五月天久久婷婷 | 国产国产人免费人成免费视频 | 国产精品久久久久久超碰 | 最新av在线网站 | 久国产在线播放 | 国产精品综合在线 | 中文字幕成人 | 在线视频99| 久久人操 | 人人dvd| a在线免费 | 国产呻吟在线 | 午夜12点 | av成人动漫在线观看 | 国产精品一区二区精品视频免费看 | 久久久国内精品 | 狠狠色狠狠色综合日日小说 | 国产精品中文字幕av | 福利视频入口 | 九九激情视频 | 日日日干 | 日韩欧美xxx | 天天拍天天色 | 综合色综合 | 久久视频在线视频 | 亚洲精品日韩在线观看 | 狠狠狠色丁香综合久久天下网 | 丰满少妇在线观看 | 精品久久一区二区 | 黄色一级免费电影 | 亚洲三级影院 | 日本韩国精品一区二区在线观看 | 欧美成人在线网站 | 草久久久久久久 | 黄色毛片大全 | 992tv在线成人免费观看 | 91在线免费公开视频 | 黄网站色视频 | 九九热免费视频在线观看 | 亚洲午夜精品福利 | 91视频国产高清 | 97国产在线播放 | 欧美福利网址 | 婷婷五月色综合 | 日韩免费三区 | 黄色亚洲 | 色偷偷88888欧美精品久久久 | 国产 精品 资源 | 国产一卡二卡在线 | 91在线视频 | 国产精品久久久久久吹潮天美传媒 | 国产亚洲视频中文字幕视频 | 精品黄色视 | 91九色成人 | 亚洲三级视频 | 国产又粗又硬又爽的视频 | 国际精品久久久久 | 免费的黄色av | 91精品国产高清 | 毛片网站免费在线观看 | 自拍超碰在线 | 午夜黄色一级片 | 91精彩视频| 特级西西www44高清大胆图片 | 91传媒免费观看 | 日韩中文字幕视频在线观看 | 日本少妇高清做爰视频 | www.狠狠干 | 亚洲五月激情 | 免费在线观看成人av | a黄色大片 | 国产精品s色| a色视频| 天天干,天天干 | 国产色视频一区 | 香蕉网站在线观看 | 久久久久国产成人精品亚洲午夜 | 婷婷久久一区二区三区 | 精品电影一区 | 一区二区日韩av | 亚洲国产中文在线 | www.少妇 | 九九一级片 | 亚洲乱亚洲乱妇 | 97视频免费在线看 | 欧美性生活一级片 | 国产精品亚洲片在线播放 | 亚洲精品在线观看免费 | 西西444www | 永久精品视频 | 69成人在线 | 国产一区免费看 | 99国产情侣在线播放 | 国产高清在线免费 | 玖玖视频网 | 欧美男同视频网站 | www欧美色| 日韩a免费| 中文字幕在线观看第一页 | 国产五月婷| 久久综合免费视频影院 | 欧美黄色成人 | 日日夜夜干 | 91喷水 | 麻豆精品传媒视频 | 一区 二区电影免费在线观看 | 欧美日本啪啪无遮挡网站 | 成年一级片 | 中文字幕在线观 | 天天干天天操人体 | 视频在线观看亚洲 | 日本激情视频中文字幕 | 夜夜爽夜夜操 | 成人动图 | 久久综合久久久久88 | 婷婷激情5月天 | 免费视频资源 | 久久天天拍| 日韩免费b | 五月婷婷综合在线观看 | 成人永久免费 | 9幺看片 | 51久久成人国产精品麻豆 | 国产精品美女久久久久久免费 | 精品免费国产一区二区三区四区 | 中日韩在线视频 | 久久久久女人精品毛片九一 | 国产美女在线观看 | 国产视频首页 | 国产综合在线视频 | 色婷婷激情网 | 成人免费中文字幕 | 国产精品成人a免费观看 | 日韩激情在线 | 久草网站在线观看 | 久草在线最新视频 | 欧美另类美少妇69xxxx | 国产明星视频三级a三级点| 国产精品二区在线观看 | 99热手机在线 | 国产精品日韩久久久久 | a国产精品 | 久久久免费高清视频 | 看片一区二区三区 | 免费看片成年人 | 97超碰国产精品女人人人爽 | 日韩欧美在线一区二区 | 最近中文国产在线视频 | 久久99精品久久久久久久久久久久 | 久草久热 | 日本高清中文字幕有码在线 | 亚洲最新视频在线播放 | av免费线看| 国产午夜精品理论片在线 | 操操操夜夜操 | 日韩中文在线电影 | 99精品视频免费在线观看 | 久久99精品国产麻豆宅宅 | 激情在线五月天 | av黄色国产 | 久操视频在线播放 | 啪啪免费试看 | 狠狠狠狠狠狠狠 | www中文在线 | a午夜电影 | 在线视频91| 一区二区三区在线播放 | 懂色av一区二区三区蜜臀 | 操处女逼 | 国产成人精品区 | 国内精品久久久久久久久久久 | 在线黄色观看 | 91麻豆精品国产91久久久久久久久 | 欧美最猛性xxx | 国产免费看 | 国产免费视频在线 | 精品国产诱惑 |