Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 1 | =============================================================================== |
| 2 | WHAT IS EXOFS? |
| 3 | =============================================================================== |
| 4 | |
| 5 | exofs is a file system that uses an OSD and exports the API of a normal Linux |
| 6 | file system. Users access exofs like any other local file system, and exofs |
| 7 | will in turn issue commands to the local OSD initiator. |
| 8 | |
| 9 | OSD is a new T10 command set that views storage devices not as a large/flat |
| 10 | array of sectors but as a container of objects, each having a length, quota, |
| 11 | time attributes and more. Each object is addressed by a 64bit ID, and is |
| 12 | contained in a 64bit ID partition. Each object has associated attributes |
| 13 | attached to it, which are integral part of the object and provide metadata about |
| 14 | the object. The standard defines some common obligatory attributes, but user |
| 15 | attributes can be added as needed. |
| 16 | |
| 17 | =============================================================================== |
| 18 | ENVIRONMENT |
| 19 | =============================================================================== |
| 20 | |
| 21 | To use this file system, you need to have an object store to run it on. You |
| 22 | may download a target from: |
| 23 | http://open-osd.org |
| 24 | |
| 25 | See Documentation/scsi/osd.txt for how to setup a working osd environment. |
| 26 | |
| 27 | =============================================================================== |
| 28 | USAGE |
| 29 | =============================================================================== |
| 30 | |
| 31 | 1. Download and compile exofs and open-osd initiator: |
| 32 | You need an external Kernel source tree or kernel headers from your |
| 33 | distribution. (anything based on 2.6.26 or later). |
| 34 | |
| 35 | a. download open-osd including exofs source using: |
| 36 | [parent-directory]$ git clone git://git.open-osd.org/open-osd.git |
| 37 | |
| 38 | b. Build the library module like this: |
| 39 | [parent-directory]$ make -C KSRC=$(KER_DIR) open-osd |
| 40 | |
| 41 | This will build both the open-osd initiator as well as the exofs kernel |
| 42 | module. Use whatever parameters you compiled your Kernel with and |
| 43 | $(KER_DIR) above pointing to the Kernel you compile against. See the file |
| 44 | open-osd/top-level-Makefile for an example. |
| 45 | |
| 46 | 2. Get the OSD initiator and target set up properly, and login to the target. |
| 47 | See Documentation/scsi/osd.txt for farther instructions. Also see ./do-osd |
| 48 | for example script that does all these steps. |
| 49 | |
| 50 | 3. Insmod the exofs.ko module: |
| 51 | [exofs]$ insmod exofs.ko |
| 52 | |
| 53 | 4. Make sure the directory where you want to mount exists. If not, create it. |
| 54 | (For example, mkdir /mnt/exofs) |
| 55 | |
| 56 | 5. At first run you will need to invoke the mkfs.exofs application |
| 57 | |
| 58 | As an example, this will create the file system on: |
| 59 | /dev/osd0 partition ID 65536 |
| 60 | |
| 61 | mkfs.exofs --pid=65536 --format /dev/osd0 |
| 62 | |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 63 | The --format is optional. If not specified, no OSD_FORMAT will be |
| 64 | performed and a clean file system will be created in the specified pid, |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 65 | in the available space of the target. (Use --format=size_in_meg to limit |
| 66 | the total LUN space available) |
| 67 | |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 68 | If pid already exists, it will be deleted and a new one will be created in |
| 69 | its place. Be careful. |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 70 | |
| 71 | An exofs lives inside a single OSD partition. You can create multiple exofs |
| 72 | filesystems on the same device using multiple pids. |
| 73 | |
| 74 | (run mkfs.exofs without any parameters for usage help message) |
| 75 | |
| 76 | 6. Mount the file system. |
| 77 | |
| 78 | For example, to mount /dev/osd0, partition ID 0x10000 on /mnt/exofs: |
| 79 | |
| 80 | mount -t exofs -o pid=65536 /dev/osd0 /mnt/exofs/ |
| 81 | |
| 82 | 7. For reference (See do-exofs example script): |
| 83 | do-exofs start - an example of how to perform the above steps. |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 84 | do-exofs stop - an example of how to unmount the file system. |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 85 | do-exofs format - an example of how to format and mkfs a new exofs. |
| 86 | |
| 87 | 8. Extra compilation flags (uncomment in fs/exofs/Kbuild): |
| 88 | CONFIG_EXOFS_DEBUG - for debug messages and extra checks. |
| 89 | |
| 90 | =============================================================================== |
| 91 | exofs mount options |
| 92 | =============================================================================== |
| 93 | Similar to any mount command: |
| 94 | mount -t exofs -o exofs_options /dev/osdX mount_exofs_directory |
| 95 | |
| 96 | Where: |
| 97 | -t exofs: specifies the exofs file system |
| 98 | |
| 99 | /dev/osdX: X is a decimal number. /dev/osdX was created after a successful |
| 100 | login into an OSD target. |
| 101 | |
| 102 | mount_exofs_directory: The directory to mount the file system on |
| 103 | |
| 104 | exofs specific options: Options are separated by commas (,) |
| 105 | pid=<integer> - The partition number to mount/create as |
| 106 | container of the filesystem. |
Boaz Harrosh | 9ed9648 | 2011-01-31 14:32:14 +0200 | [diff] [blame] | 107 | This option is mandatory. integer can be |
| 108 | Hex by pre-pending an 0x to the number. |
| 109 | osdname=<id> - Mount by a device's osdname. |
| 110 | osdname is usually a 36 character uuid of the |
| 111 | form "d2683732-c906-4ee1-9dbd-c10c27bb40df". |
| 112 | It is one of the device's uuid specified in the |
| 113 | mkfs.exofs format command. |
| 114 | If this option is specified then the /dev/osdX |
| 115 | above can be empty and is ignored. |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 116 | to=<integer> - Timeout in ticks for a single command. |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 117 | default is (60 * HZ) [for debugging only] |
| 118 | |
| 119 | =============================================================================== |
| 120 | DESIGN |
| 121 | =============================================================================== |
| 122 | |
| 123 | * The file system control block (AKA on-disk superblock) resides in an object |
| 124 | with a special ID (defined in common.h). |
| 125 | Information included in the file system control block is used to fill the |
| 126 | in-memory superblock structure at mount time. This object is created before |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 127 | the file system is used by mkexofs.c. It contains information such as: |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 128 | - The file system's magic number |
| 129 | - The next inode number to be allocated |
| 130 | |
| 131 | * Each file resides in its own object and contains the data (and it will be |
| 132 | possible to extend the file over multiple objects, though this has not been |
| 133 | implemented yet). |
| 134 | |
| 135 | * A directory is treated as a file, and essentially contains a list of <file |
| 136 | name, inode #> pairs for files that are found in that directory. The object |
| 137 | IDs correspond to the files' inode numbers and will be allocated according to |
| 138 | a bitmap (stored in a separate object). Now they are allocated using a |
| 139 | counter. |
| 140 | |
| 141 | * Each file's control block (AKA on-disk inode) is stored in its object's |
| 142 | attributes. This applies to both regular files and other types (directories, |
| 143 | device files, symlinks, etc.). |
| 144 | |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 145 | * Credentials are generated per object (inode and superblock) when they are |
| 146 | created in memory (read from disk or created). The credential works for all |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 147 | operations and is used as long as the object remains in memory. |
| 148 | |
| 149 | * Async OSD operations are used whenever possible, but the target may execute |
| 150 | them out of order. The operations that concern us are create, delete, |
| 151 | readpage, writepage, update_inode, and truncate. The following pairs of |
| 152 | operations should execute in the order written, and we need to prevent them |
| 153 | from executing in reverse order: |
| 154 | - The following are handled with the OBJ_CREATED and OBJ_2BCREATED |
| 155 | flags. OBJ_CREATED is set when we know the object exists on the OSD - |
Thadeu Lima de Souza Cascardo | 9f24916 | 2009-07-27 13:26:32 -0300 | [diff] [blame] | 156 | in create's callback function, and when we successfully do a |
| 157 | read_inode. |
Boaz Harrosh | 214c8ad | 2008-10-28 17:22:01 +0200 | [diff] [blame] | 158 | OBJ_2BCREATED is set in the beginning of the create function, so we |
| 159 | know that we should wait. |
| 160 | - create/delete: delete should wait until the object is created |
| 161 | on the OSD. |
| 162 | - create/readpage: readpage should be able to return a page |
| 163 | full of zeroes in this case. If there was a write already |
| 164 | en-route (i.e. create, writepage, readpage) then the page |
| 165 | would be locked, and so it would really be the same as |
| 166 | create/writepage. |
| 167 | - create/writepage: if writepage is called for a sync write, it |
| 168 | should wait until the object is created on the OSD. |
| 169 | Otherwise, it should just return. |
| 170 | - create/truncate: truncate should wait until the object is |
| 171 | created on the OSD. |
| 172 | - create/update_inode: update_inode should wait until the |
| 173 | object is created on the OSD. |
| 174 | - Handled by VFS locks: |
| 175 | - readpage/delete: shouldn't happen because of page lock. |
| 176 | - writepage/delete: shouldn't happen because of page lock. |
| 177 | - readpage/writepage: shouldn't happen because of page lock. |
| 178 | |
| 179 | =============================================================================== |
| 180 | LICENSE/COPYRIGHT |
| 181 | =============================================================================== |
| 182 | The exofs file system is based on ext2 v0.5b (distributed with the Linux kernel |
| 183 | version 2.6.10). All files include the original copyrights, and the license |
| 184 | is GPL version 2 (only version 2, as is true for the Linux kernel). The |
| 185 | Linux kernel can be downloaded from www.kernel.org. |