Changeset 24df3834 in mainline
- Timestamp:
- 2011-12-08T11:09:49Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 190c943
- Parents:
- 2f016df (diff), e895352 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/minix/minix.h
r2f016df r24df3834 39 39 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 40 40 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 41 #define S_IFDIR 0040000 /* Directory*/42 #define S_IFREG 0100000 /* Regular file*/41 #define S_IFDIR 0040000 /* Directory */ 42 #define S_IFREG 0100000 /* Regular file */ 43 43 #define S_IFMT 00170000 44 44 45 /* The following block sizes are valid only on V3 filesystem*/45 /* The following block sizes are valid only on V3 filesystem */ 46 46 #define MFS_MIN_BLOCKSIZE 1024 47 47 #define MFS_MAX_BLOCKSIZE 4096 … … 88 88 #define MFS_ERROR_FS 0x0002 89 89 90 /* MFS V1/V2 superblock data on disk*/90 /* MFS V1/V2 superblock data on disk */ 91 91 struct mfs_superblock { 92 /* Total number of inodes on the device*/92 /* Total number of inodes on the device */ 93 93 uint16_t s_ninodes; 94 /* Total number of zones on the device*/94 /* Total number of zones on the device */ 95 95 uint16_t s_nzones; 96 /* Number of inode bitmap blocks*/96 /* Number of inode bitmap blocks */ 97 97 uint16_t s_ibmap_blocks; 98 /* Number of zone bitmap blocks*/98 /* Number of zone bitmap blocks */ 99 99 uint16_t s_zbmap_blocks; 100 /* First data zone on device*/100 /* First data zone on device */ 101 101 uint16_t s_first_data_zone; 102 /* Base 2 logarithm of the zone to block ratio*/102 /* Base 2 logarithm of the zone to block ratio */ 103 103 uint16_t s_log2_zone_size; 104 /* Maximum file size expressed in bytes*/104 /* Maximum file size expressed in bytes */ 105 105 uint32_t s_max_file_size; 106 106 /* … … 109 109 */ 110 110 uint16_t s_magic; 111 /* Flag used to detect FS errors*/111 /* Flag used to detect FS errors*/ 112 112 uint16_t s_state; 113 /* Total number of zones on the device (V2 only)*/113 /* Total number of zones on the device (V2 only) */ 114 114 uint32_t s_nzones2; 115 115 } __attribute__ ((packed)); 116 116 117 117 118 /* MFS V3 superblock data on disk*/118 /* MFS V3 superblock data on disk */ 119 119 struct mfs3_superblock { 120 /* Total number of inodes on the device*/120 /* Total number of inodes on the device */ 121 121 uint32_t s_ninodes; 122 122 uint16_t s_pad0; 123 /* Number of inode bitmap blocks*/123 /* Number of inode bitmap blocks */ 124 124 int16_t s_ibmap_blocks; 125 /* Number of zone bitmap blocks*/125 /* Number of zone bitmap blocks */ 126 126 int16_t s_zbmap_blocks; 127 /* First data zone on device*/127 /* First data zone on device */ 128 128 uint16_t s_first_data_zone; 129 /* Base 2 logarithm of the zone to block ratio*/129 /* Base 2 logarithm of the zone to block ratio */ 130 130 int16_t s_log2_zone_size; 131 131 int16_t s_pad1; 132 /* Maximum file size expressed in bytes*/132 /* Maximum file size expressed in bytes */ 133 133 uint32_t s_max_file_size; 134 /* Total number of zones on the device*/134 /* Total number of zones on the device */ 135 135 uint32_t s_nzones; 136 136 /* … … 140 140 int16_t s_magic; 141 141 int16_t s_pad2; 142 /* Filesystem block size expressed in bytes*/142 /* Filesystem block size expressed in bytes */ 143 143 uint16_t s_block_size; 144 /* Filesystem disk format version*/144 /* Filesystem disk format version */ 145 145 int8_t s_disk_version; 146 146 } __attribute__ ((packed)); 147 147 148 /* MinixFS V1 inode structure as it is on disk*/148 /* MinixFS V1 inode structure as it is on disk */ 149 149 struct mfs_inode { 150 150 uint16_t i_mode; … … 154 154 uint8_t i_gid; 155 155 uint8_t i_nlinks; 156 /* Block numbers for direct zones*/156 /* Block numbers for direct zones */ 157 157 uint16_t i_dzone[V1_NR_DIRECT_ZONES]; 158 /* Block numbers for indirect zones*/158 /* Block numbers for indirect zones */ 159 159 uint16_t i_izone[V1_NR_INDIRECT_ZONES]; 160 160 } __attribute__ ((packed)); 161 161 162 /* MinixFS V2 inode structure as it is on disk (also valid for V3).*/162 /* MinixFS V2 inode structure as it is on disk (also valid for V3). */ 163 163 struct mfs2_inode { 164 164 uint16_t i_mode; … … 170 170 int32_t i_mtime; 171 171 int32_t i_ctime; 172 /* Block numbers for direct zones*/172 /* Block numbers for direct zones */ 173 173 uint32_t i_dzone[V2_NR_DIRECT_ZONES]; 174 /* Block numbers for indirect zones*/174 /* Block numbers for indirect zones */ 175 175 uint32_t i_izone[V2_NR_INDIRECT_ZONES]; 176 176 } __attribute__ ((packed)); 177 177 178 /* MinixFS V1/V2 directory entry on-disk structure*/178 /* MinixFS V1/V2 directory entry on-disk structure */ 179 179 struct mfs_dentry { 180 180 uint16_t d_inum; … … 182 182 }; 183 183 184 /* MinixFS V3 directory entry on-disk structure*/184 /* MinixFS V3 directory entry on-disk structure */ 185 185 struct mfs3_dentry { 186 186 uint32_t d_inum; -
uspace/srv/fs/mfs/mfs.h
r2f016df r24df3834 48 48 #define NAME "mfs" 49 49 50 / /#define DEBUG_MODE50 /* #define DEBUG_MODE */ 51 51 52 52 #define min(a, b) ((a) < (b) ? (a) : (b)) … … 71 71 } mfs_version_t; 72 72 73 /* Generic MinixFS superblock*/73 /* Generic MinixFS superblock */ 74 74 struct mfs_sb_info { 75 75 uint32_t ninodes; … … 84 84 uint16_t state; 85 85 86 /* The following fields do not exist on disk but only in memory*/86 /* The following fields do not exist on disk but only in memory */ 87 87 unsigned long itable_size; 88 88 mfs_version_t fs_version; … … 97 97 }; 98 98 99 /* Generic MinixFS inode*/99 /* Generic MinixFS inode */ 100 100 struct mfs_ino_info { 101 101 uint16_t i_mode; … … 107 107 int32_t i_mtime; 108 108 int32_t i_ctime; 109 /* Block numbers for direct zones*/109 /* Block numbers for direct zones */ 110 110 uint32_t i_dzone[V2_NR_DIRECT_ZONES]; 111 /* Block numbers for indirect zones*/111 /* Block numbers for indirect zones */ 112 112 uint32_t i_izone[V2_NR_INDIRECT_ZONES]; 113 113 114 /* The following fields do not exist on disk but only in memory*/114 /* The following fields do not exist on disk but only in memory */ 115 115 bool dirty; 116 116 fs_index_t index; 117 117 }; 118 118 119 /* Generic MFS directory entry*/119 /* Generic MFS directory entry */ 120 120 struct mfs_dentry_info { 121 121 uint32_t d_inum; 122 122 char d_name[MFS3_MAX_NAME_LEN + 1]; 123 123 124 /* The following fields do not exist on disk but only in memory*/125 126 /* Index of the dentry in the list*/124 /* The following fields do not exist on disk but only in memory */ 125 126 /* Index of the dentry in the list */ 127 127 unsigned index; 128 /* Pointer to the node at witch the dentry belongs*/128 /* Pointer to the node at witch the dentry belongs */ 129 129 struct mfs_node *node; 130 130 }; … … 136 136 }; 137 137 138 /* MinixFS node in core*/138 /* MinixFS node in core */ 139 139 struct mfs_node { 140 140 struct mfs_ino_info *ino_i; … … 145 145 }; 146 146 147 /* mfs_ops.c*/147 /* mfs_ops.c */ 148 148 extern vfs_out_ops_t mfs_ops; 149 149 extern libfs_ops_t mfs_libfs_ops; … … 152 152 mfs_global_init(void); 153 153 154 /* mfs_inode.c*/154 /* mfs_inode.c */ 155 155 extern int 156 156 mfs_get_inode(struct mfs_instance *inst, struct mfs_ino_info **ino_i, 157 157 fs_index_t index); 158 158 159 159 extern int … … 163 163 mfs_inode_shrink(struct mfs_node *mnode, size_t size_shrink); 164 164 165 /* mfs_rw.c*/165 /* mfs_rw.c */ 166 166 extern int 167 167 mfs_read_map(uint32_t *b, const struct mfs_node *mnode, const uint32_t pos); … … 169 169 extern int 170 170 mfs_write_map(struct mfs_node *mnode, uint32_t pos, uint32_t new_zone, 171 171 uint32_t *old_zone); 172 172 173 173 extern int 174 174 mfs_prune_ind_zones(struct mfs_node *mnode, size_t new_size); 175 175 176 /* mfs_dentry.c*/176 /* mfs_dentry.c */ 177 177 extern int 178 178 mfs_read_dentry(struct mfs_node *mnode, 179 179 struct mfs_dentry_info *d_info, unsigned index); 180 180 181 181 extern int … … 188 188 mfs_insert_dentry(struct mfs_node *mnode, const char *d_name, fs_index_t d_inum); 189 189 190 /* mfs_balloc.c*/190 /* mfs_balloc.c */ 191 191 extern int 192 192 mfs_alloc_inode(struct mfs_instance *inst, uint32_t *inum); … … 201 201 mfs_free_zone(struct mfs_instance *inst, uint32_t zone); 202 202 203 /* mfs_utils.c*/203 /* mfs_utils.c */ 204 204 extern uint16_t 205 205 conv16(bool native, uint16_t n); -
uspace/srv/fs/mfs/mfs_balloc.c
r2f016df r24df3834 198 198 limit = sbi->nzones - sbi->firstdatazone - 1; 199 199 } else { 200 /* bid == BMAP_INODE*/200 /* bid == BMAP_INODE */ 201 201 search = &sbi->isearch; 202 202 start_block = 2; … … 212 212 for (i = *search / bits_per_block; i < nblocks; ++i) { 213 213 r = block_get(&b, inst->service_id, i + start_block, 214 214 BLOCK_FLAGS_NONE); 215 215 216 216 if (r != EOK) -
uspace/srv/fs/mfs/mfs_dentry.c
r2f016df r24df3834 168 168 return ENAMETOOLONG; 169 169 170 /* Search the directory entry to be removed*/170 /* Search the directory entry to be removed */ 171 171 unsigned i; 172 172 for (i = 0; i < mnode->ino_i->i_size / sbi->dirsize ; ++i) { -
uspace/srv/fs/mfs/mfs_inode.c
r2f016df r24df3834 235 235 236 236 r = block_get(&b, mnode->instance->service_id, 237 238 237 itable_off + inum / sbi->ino_per_block, 238 BLOCK_FLAGS_NONE); 239 239 240 240 if (r != EOK) … … 278 278 279 279 r = block_get(&b, mnode->instance->service_id, 280 281 280 itable_off + inum / sbi->ino_per_block, 281 BLOCK_FLAGS_NONE); 282 282 283 283 if (r != EOK) -
uspace/srv/fs/mfs/mfs_ops.c
r2f016df r24df3834 664 664 struct mfs_node *child = cfn->data; 665 665 struct mfs_sb_info *sbi = parent->instance->sbi; 666 bool destroy_dentry = false; 666 667 667 668 mfsdebug("%s()\n", __FUNCTION__); … … 672 673 int r = mfs_insert_dentry(parent, name, child->ino_i->index); 673 674 if (r != EOK) 674 goto exit_error; 675 676 child->ino_i->i_nlinks++; 677 child->ino_i->dirty = true; 675 return r; 678 676 679 677 if (S_ISDIR(child->ino_i->i_mode)) { 678 if (child->ino_i->i_nlinks != 1) { 679 /* It's not possible to hardlink directories in MFS */ 680 destroy_dentry = true; 681 r = EMLINK; 682 goto exit; 683 } 680 684 r = mfs_insert_dentry(child, ".", child->ino_i->index); 681 if (r != EOK) 682 goto exit_error; 685 if (r != EOK) { 686 destroy_dentry = true; 687 goto exit; 688 } 683 689 684 690 r = mfs_insert_dentry(child, "..", parent->ino_i->index); 685 if (r != EOK) 686 goto exit_error; 691 if (r != EOK) { 692 destroy_dentry = true; 693 goto exit; 694 } 687 695 688 696 parent->ino_i->i_nlinks++; … … 690 698 } 691 699 692 exit_error: 700 exit: 701 if (destroy_dentry) { 702 int r2 = mfs_remove_dentry(parent, name); 703 if (r2 != EOK) 704 r = r2; 705 } else { 706 child->ino_i->i_nlinks++; 707 child->ino_i->dirty = true; 708 } 693 709 return r; 694 710 } … … 821 837 found: 822 838 async_data_read_finalize(callid, d_info.d_name, 823 839 str_size(d_info.d_name) + 1); 824 840 bytes = ((pos - spos) + 1); 825 841 } else { -
uspace/srv/fs/mfs/mfs_rw.c
r2f016df r24df3834 147 147 ino_i->dirty = true; 148 148 } else { 149 /* Sparse block*/149 /* Sparse block */ 150 150 *b = 0; 151 151 return EOK; … … 233 233 } 234 234 235 /**Free unused indirect zones from a MINIX inode according to it 's new size.235 /**Free unused indirect zones from a MINIX inode according to its new size. 236 236 * 237 237 * @param mnode Pointer to a generic MINIX inode in memory.
Note:
See TracChangeset
for help on using the changeset viewer.