24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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 />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!