View Javadoc

1   /**
2    * 
3    */
4   package org.jscsi.target.storage;
5   
6   
7   import java.io.IOException;
8   
9   import org.jscsi.target.scsi.cdb.CommandDescriptorBlock;
10  
11  
12  /**
13   * This is an abstract super class offering methods for storage and retrieval of data, as well as emulating some
14   * properties of block storage devices.
15   * <p>
16   * All index and length parameters used by the read and write methods are referring to bytes, unlike the values sent in
17   * {@link CommandDescriptorBlock} s.
18   * 
19   * @author Andreas Ergenzinger
20   */
21  public interface IStorageModule {
22  
23      /**
24       * A fictitious block size.
25       */
26      public static final int VIRTUAL_BLOCK_SIZE = 512;
27  
28      /**
29       * This method can be used for checking if a (series of) I/O operations will result in an {@link IOException} due to
30       * trying to access blocks outside the medium's boundaries.
31       * <p>
32       * The SCSI standard requires checking for these boundary violations right after receiving a read or write command,
33       * so that an appropriate error message can be returned to the initiator. Therefore this method must be called prior
34       * to each read or write sequence.
35       * <p>
36       * The values returned by this method and their meaning with regard to the interval [0, {@link #getSizeInBlocks()} -
37       * 1] are shown in the following table:
38       * <p>
39       * <table border="1">
40       * <tr>
41       * <th>Return Value</th>
42       * <th>Meaning</th>
43       * </tr>
44       * <tr>
45       * <td>0</td>
46       * <td>no boundaries are violated</td>
47       * </tr>
48       * <tr>
49       * <td>1</td>
50       * <td>the <i>logicalBlockAddress</i> parameter lies outside of the interval</td>
51       * </tr>
52       * <tr>
53       * <td>2</td>
54       * <td>the interval [<i>logicalBlockAddress</i>, <i>logicalBlockAddress</i> + <i>transferLengthInBlocks</i>]<br/>
55       * lies outside of the interval, or <i>transferLengthInBlocks</i> is negative</td>
56       * </tr>
57       * </table>
58       * <p>
59       * Note that the parameters of this method are referring to blocks, not to byte indices.
60       * 
61       * @param logicalBlockAddress the index of the first block of data to be read or written
62       * @param transferLengthInBlocks the total number of consecutive blocks about to be read or written
63       * @return see table in description
64       */
65      int checkBounds (final long logicalBlockAddress, final int transferLengthInBlocks);
66  
67      /**
68       * Returns the storage space size in bytes divided by the block size in bytes (rounded down).
69       * 
70       * @return the virtual amount of storage blocks available
71       */
72      long getSizeInBlocks ();
73  
74      /**
75       * Copies bytes from storage to the passed byte array.
76       * 
77       * @param bytes the array into which the data will be copied will be filled with data from storage
78       * @param storageIndex the position of the first byte to be copied
79       * @throws IOException
80       */
81      void read (byte[] bytes, long storageIndex) throws IOException;
82  
83      /**
84       * Saves part of the passed byte array's content.
85       * 
86       * @param bytes the source of the data to be stored
87       * @param storageIndex byte offset in the storage area
88       * @throws IOException
89       */
90      void write (byte[] bytes, long storageIndex) throws IOException;
91  
92      /**
93       * Closing the storage.
94       * 
95       * @throws IOException to be closed
96       */
97      void close () throws IOException;
98  
99  }