Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
238 volume VI os16<br />
Script e sorgenti del kernel 239<br />
«<br />
890106 | name_unlink = basename (path_unlink);<br />
890107 | //<br />
890108 | // Read the directory content and try to locate the item to unlink.<br />
890109 | //<br />
890110 | for (start = 0;<br />
890111 | start < inode_directory->size;<br />
890112 | start += inode_directory->sb->blksize)<br />
890113 | {<br />
890114 | size_read = inode_file_read (inode_directory, start, buffer,<br />
890115 | inode_directory->sb->blksize,<br />
890116 | NULL);<br />
890117 | if (size_read < sizeof (directory_t))<br />
890118 | {<br />
890119 | break;<br />
890120 | }<br />
890121 | //<br />
890122 | // Scan the directory portion just read, for the item to unlink.<br />
890123 | //<br />
890124 | dir = (directory_t *) buffer;<br />
890125 | //<br />
890126 | for (d = 0; d < size_read; d += (sizeof (directory_t)), dir++)<br />
890127 | {<br />
890128 | if (dir->ino != 0 &&<br />
890129 | strncmp (dir->name, name_unlink, NAME_MAX) == 0)<br />
890130 | {<br />
890131 | //<br />
890132 | // Found the corresponding item: unlink the inode.<br />
890133 | //<br />
890134 | dir->ino = 0;<br />
890135 | //<br />
890136 | // Update the directory inside the file system.<br />
890137 | //<br />
890138 | size_written = inode_file_write (inode_directory, start,<br />
890139 | buffer, size_read);<br />
890140 | if (size_written != size_read)<br />
890141 | {<br />
890142 | //<br />
890143 | // Write problem: just tell.<br />
890144 | //<br />
890145 | k_printf ("kernel alert: directory write error!\n");<br />
890146 | }<br />
890147 | //<br />
890148 | // Update directory inode and put inode. If the unlinked<br />
890149 | // inode was a directory, the parent directory inode<br />
890150 | // must reduce the file system link count.<br />
890151 | //<br />
890152 | if (S_ISDIR (inode_unlink->mode))<br />
890153 | {<br />
890154 | inode_directory->links--;<br />
890155 | }<br />
890156 | inode_directory->time = k_time (NULL);<br />
890157 | inode_directory->changed = 1;<br />
890158 | inode_put (inode_directory);<br />
890159 | //<br />
890160 | // Reduce link inside unlinked inode and put inode.<br />
890161 | //<br />
890162 | inode_unlink->links--;<br />
890163 | inode_unlink->changed = 1;<br />
890164 | inode_unlink->time = k_time (NULL);<br />
890165 | inode_put (inode_unlink);<br />
890166 | //<br />
890167 | // Just return, as the work is done.<br />
890168 | //<br />
890169 | return (0);<br />
890170 | }<br />
890171 | }<br />
890172 | }<br />
890173 | //<br />
890174 | // At this point, it was not possible to unlink the file.<br />
890175 | //<br />
890176 | inode_put (inode_unlink);<br />
890177 | inode_put (inode_directory);<br />
890178 | errset (EUNKNOWN); // Unknown error.<br />
890179 | return (-1);<br />
890180 |}<br />
104.4.47 kernel/fs/sb_inode_status.c<br />
Si veda la sezione 103.3.45.<br />
900001 |#include <br />
900002 |#include <br />
900003 |//----------------------------------------------------------------------<br />
900004 |int<br />
900005 |sb_inode_status (sb_t *sb, ino_t ino)<br />
900006 |{<br />
900007 | int map_element;<br />
900008 | int map_bit;<br />
900009 | int map_mask;<br />
900010 | //<br />
900011 | // Check arguments.<br />
900012 | //<br />
900013 | if (ino == 0 || sb == NULL)<br />
900014 | {<br />
900015 | errset (EINVAL); // Invalid argument.<br />
900016 | return (-1);<br />
900017 | }<br />
900018 | //<br />
900019 | // Calculate the map element, the map bit and the map mask.<br />
900020 | //<br />
900021 | map_element = ino / 16;<br />
900022 | map_bit = ino % 16;<br />
900023 | map_mask = 1 map_inode[map_element] & map_mask)<br />
900028 | {<br />
900029 | return (1); // True.<br />
900030 | }<br />
900031 | else<br />
900032 | {<br />
900033 | return (0); // False.<br />
900034 | }<br />
900035 |}<br />
104.4.48 kernel/fs/sb_mount.c<br />
Si veda la sezione 103.3.46.<br />
910001 |#include <br />
910002 |#include <br />
910003 |#include <br />
910004 |//----------------------------------------------------------------------<br />
910005 |sb_t *<br />
910006 |sb_mount (dev_t device, inode_t **inode_mnt, int options)<br />
910007 |{<br />
910008 | sb_t *sb;<br />
910009 | ssize_t size_read;<br />
910010 | addr_t start;<br />
910011 | int m;<br />
910012 | size_t size_sb;<br />
910013 | size_t size_map;<br />
910014 | //<br />
910015 | // Find if it is already mounted.<br />
910016 | //<br />
910017 | sb = sb_reference (device);<br />
910018 | if (sb != NULL)<br />
910019 | {<br />
910020 | errset (EBUSY); // Device or resource busy: device<br />
910021 | return (NULL); // already mounted.<br />
910022 | }<br />
910023 | //<br />
910024 | // Find if ‘*inode_mnt’ is already mounting something.<br />
910025 | //<br />
910026 | if (*inode_mnt != NULL && (*inode_mnt)->sb_attached != NULL)<br />
910027 | {<br />
910028 | errset (EBUSY); // Device or resource busy: mount point<br />
910029 | return (NULL); // already used.<br />
910030 | }<br />
910031 | //<br />
910032 | // The inode is not yet mounting anything, or it is new: find a free<br />
910033 | // slot inside the super block table.<br />
910034 | //<br />
910035 | sb = sb_reference ((dev_t) -1);<br />
910036 | if (sb == NULL)<br />
910037 | {<br />
910038 | errset (EBUSY); // Device or resource busy:<br />
910039 | return (NULL); // no free slots.<br />
910040 | }<br />
910041 | //<br />
910042 | // A free slot was found: the super block header must be loaded, but<br />
910043 | // before it is necessary to calculate the header size to be read.<br />
910044 | //<br />
910045 | size_sb = offsetof (sb_t, device);<br />
910046 | //<br />
910047 | // Then fix the starting point.<br />
910048 | //<br />
910049 | start = 1024; // After boot block.<br />
910050 | //<br />
910051 | // Read the file system super block header.<br />
910052 | //<br />
910053 | size_read = dev_io ((pid_t) -1, device, DEV_READ, start, sb,<br />
910054 | size_sb, NULL);<br />
910055 | if (size_read != size_sb)<br />
910056 | {<br />
910057 | errset (EIO); // I/O error.<br />
910058 | return (NULL);<br />
910059 | }<br />
910060 | //<br />
910061 | // Save some more data.<br />
910062 | //<br />
910063 | sb->device = device;<br />
910064 | sb->options = options;<br />
910065 | sb->inode_mounted_on = *inode_mnt;<br />
910066 | sb->blksize = (1024 log2_size_zone);<br />
910067 | //<br />
910068 | // Check if the super block data is valid.<br />
910069 | //<br />
910070 | if (sb->magic_number != 0x137F)<br />
910071 | {<br />
910072 | errset (ENODEV); // No such device: unsupported<br />
910073 | sb->device = 0; // file system type.<br />
910074 | return (NULL);<br />
910075 | }<br />
910076 | if (sb->map_inode_blocks > SB_MAX_INODE_BLOCKS)<br />
910077 | {<br />
910078 | errset (E_MAP_INODE_TOO_BIG);<br />
910079 | return (NULL);<br />
910080 | }<br />
910081 | if (sb->map_zone_blocks > SB_MAX_ZONE_BLOCKS)<br />
910082 | {<br />
910083 | errset (E_MAP_ZONE_TOO_BIG);<br />
910084 | return (NULL);<br />
910085 | }<br />
910086 | if (sb->blksize > SB_MAX_ZONE_SIZE)<br />
910087 | {<br />
910088 | errset (E_DATA_ZONE_TOO_BIG);<br />
910089 | return (NULL);<br />
910090 | }<br />
910091 | //<br />
910092 | // A right super block header was loaded from disk, now load the<br />
910093 | // super block inode bit map.<br />
910094 | //<br />
910095 | start = 1024; // After boot block.<br />
910096 | start += 1024; // After super block.<br />
910097 | for (m = 0; m < SB_MAP_INODE_SIZE; m++) //<br />
910098 | { // Reset map in memory,<br />
910099 | sb->map_inode[m] = 0xFFFF; // before loading.<br />
910100 | } //<br />
910101 | size_map = sb->map_inode_blocks * 1024;<br />
910102 | size_read = dev_io ((pid_t) -1, sb->device, DEV_READ, start,<br />
910103 | sb->map_inode, size_map, NULL);<br />
910104 | if (size_read != size_map)<br />
910105 | {<br />
910106 | errset (EIO); // I/O error.<br />
910107 | return (NULL);<br />
910108 | }<br />
910109 | //<br />
910110 | // Load the super block zone bit map.<br />
910111 | //<br />
910112 | start = 1024; // After boot block.<br />
910113 | start += 1024; // After super block.<br />
910114 | start += (sb->map_inode_blocks * 1024); // After inode bit map.<br />
«