Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 89ee7ff in mainline


Ignore:
Timestamp:
2010-01-30T18:52:22Z (10 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
ab4bace
Parents:
c713aa56 (diff), 7efc517 (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.
Message:

Merge VFS and FAT fixes.

Location:
uspace/srv
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat_fat.c

    rc713aa56 r89ee7ff  
    608608}
    609609
     610/** Perform basic sanity checks on the file system.
     611 *
     612 * Verify if values of boot sector fields are sane. Also verify media
     613 * descriptor. This is used to rule out cases when a device obviously
     614 * does not contain a fat file system.
     615 */
     616int fat_sanity_check(fat_bs_t *bs, dev_handle_t dev_handle)
     617{
     618        fat_cluster_t e0, e1;
     619        unsigned fat_no;
     620        int rc;
     621
     622        /* Check number of FATs. */
     623        if (bs->fatcnt == 0)
     624                return ENOTSUP;
     625
     626        /* Check total number of sectors. */
     627
     628        if (bs->totsec16 == 0 && bs->totsec32 == 0)
     629                return ENOTSUP;
     630
     631        if (bs->totsec16 != 0 && bs->totsec32 != 0 &&
     632            bs->totsec16 != bs->totsec32)
     633                return ENOTSUP;
     634
     635        /* Check media descriptor. Must be between 0xf0 and 0xff. */
     636        if ((bs->mdesc & 0xf0) != 0xf0)
     637                return ENOTSUP;
     638
     639        /* Check number of sectors per FAT. */
     640        if (bs->sec_per_fat == 0)
     641                return ENOTSUP;
     642
     643        /*
     644         * Check that the root directory entries take up whole blocks.
     645         * This check is rather strict, but it allows us to treat the root
     646         * directory and non-root directories uniformly in some places.
     647         * It can be removed provided that functions such as fat_read() are
     648         * sanitized to support file systems with this property.
     649         */
     650        if ((uint16_t_le2host(bs->root_ent_max) * sizeof(fat_dentry_t)) %
     651            uint16_t_le2host(bs->bps) != 0)
     652                return ENOTSUP;
     653
     654        /* Check signature of each FAT. */
     655
     656        for (fat_no = 0; fat_no < bs->fatcnt; fat_no++) {
     657                rc = fat_get_cluster(bs, dev_handle, fat_no, 0, &e0);
     658                if (rc != EOK)
     659                        return EIO;
     660
     661                rc = fat_get_cluster(bs, dev_handle, fat_no, 1, &e1);
     662                if (rc != EOK)
     663                        return EIO;
     664
     665                /* Check that first byte of FAT contains the media descriptor. */
     666                if ((e0 & 0xff) != bs->mdesc)
     667                        return ENOTSUP;
     668
     669                /*
     670                 * Check that remaining bits of the first two entries are
     671                 * set to one.
     672                 */
     673                if ((e0 >> 8) != 0xff || e1 != 0xffff)
     674                        return ENOTSUP;
     675        }
     676
     677        return EOK;
     678}
     679
    610680/**
    611681 * @}
  • uspace/srv/fs/fat/fat_fat.h

    rc713aa56 r89ee7ff  
    8787    off_t);
    8888extern int fat_zero_cluster(struct fat_bs *, dev_handle_t, fat_cluster_t);
     89extern int fat_sanity_check(struct fat_bs *, dev_handle_t);
    8990
    9091#endif
  • uspace/srv/fs/fat/fat_idx.c

    rc713aa56 r89ee7ff  
    531531        unused_initialize(u, dev_handle);
    532532        fibril_mutex_lock(&unused_lock);
    533         if (!unused_find(dev_handle, false))
     533        if (!unused_find(dev_handle, false)) {
    534534                list_append(&u->link, &unused_head);
    535         else
     535        } else {
     536                free(u);
    536537                rc = EEXIST;
     538        }
    537539        fibril_mutex_unlock(&unused_lock);
    538540        return rc;
  • uspace/srv/fs/fat/fat_ops.c

    rc713aa56 r89ee7ff  
    290290
    291291        *nodepp = nodep;
    292         return EOK;
    293 }
    294 
    295 /** Perform basic sanity checks on the file system.
    296  *
    297  * Verify if values of boot sector fields are sane. Also verify media
    298  * descriptor. This is used to rule out cases when a device obviously
    299  * does not contain a fat file system.
    300  */
    301 static int fat_sanity_check(fat_bs_t *bs, dev_handle_t dev_handle)
    302 {
    303         fat_cluster_t e0, e1;
    304         unsigned fat_no;
    305         int rc;
    306 
    307         /* Check number of FATs. */
    308         if (bs->fatcnt == 0)
    309                 return ENOTSUP;
    310 
    311         /* Check total number of sectors. */
    312 
    313         if (bs->totsec16 == 0 && bs->totsec32 == 0)
    314                 return ENOTSUP;
    315 
    316         if (bs->totsec16 != 0 && bs->totsec32 != 0 &&
    317             bs->totsec16 != bs->totsec32)
    318                 return ENOTSUP;
    319 
    320         /* Check media descriptor. Must be between 0xf0 and 0xff. */
    321         if ((bs->mdesc & 0xf0) != 0xf0)
    322                 return ENOTSUP;
    323 
    324         /* Check number of sectors per FAT. */
    325         if (bs->sec_per_fat == 0)
    326                 return ENOTSUP;
    327 
    328         /*
    329          * Check that the root directory entries take up whole blocks.
    330          * This check is rather strict, but it allows us to treat the root
    331          * directory and non-root directories uniformly in some places.
    332          * It can be removed provided that functions such as fat_read() are
    333          * sanitized to support file systems with this property.
    334          */
    335         if ((uint16_t_le2host(bs->root_ent_max) * sizeof(fat_dentry_t)) %
    336             uint16_t_le2host(bs->bps) != 0)
    337                 return ENOTSUP;
    338 
    339         /* Check signature of each FAT. */
    340 
    341         for (fat_no = 0; fat_no < bs->fatcnt; fat_no++) {
    342                 rc = fat_get_cluster(bs, dev_handle, fat_no, 0, &e0);
    343                 if (rc != EOK)
    344                         return EIO;
    345 
    346                 rc = fat_get_cluster(bs, dev_handle, fat_no, 1, &e1);
    347                 if (rc != EOK)
    348                         return EIO;
    349 
    350                 /* Check that first byte of FAT contains the media descriptor. */
    351                 if ((e0 & 0xff) != bs->mdesc)
    352                         return ENOTSUP;
    353 
    354                 /*
    355                  * Check that remaining bits of the first two entries are
    356                  * set to one.
    357                  */
    358                 if ((e0 >> 8) != 0xff || e1 != 0xffff)
    359                         return ENOTSUP;
    360         }
    361 
    362292        return EOK;
    363293}
     
    1015945                cmode = CACHE_MODE_WB;
    1016946
     947        free(opts);
     948
    1017949        /* initialize libblock */
    1018950        rc = block_init(dev_handle, BS_SIZE);
  • uspace/srv/vfs/vfs.c

    rc713aa56 r89ee7ff  
    137137        }
    138138       
    139         /* TODO: cleanup after the client */
     139        vfs_files_done();
    140140}
    141141
  • uspace/srv/vfs/vfs.h

    rc713aa56 r89ee7ff  
    177177    vfs_pair_t *, ...);
    178178extern int vfs_open_node_internal(vfs_lookup_res_t *);
     179extern int vfs_close_internal(vfs_file_t *);
    179180
    180181extern bool vfs_nodes_init(void);
     
    188189
    189190extern bool vfs_files_init(void);
     191extern void vfs_files_done(void);
    190192extern vfs_file_t *vfs_file_get(int);
    191193extern int vfs_fd_assign(vfs_file_t *file, int fd);
  • uspace/srv/vfs/vfs_file.c

    rc713aa56 r89ee7ff  
    7272        }
    7373        return true;
     74}
     75
     76/** Cleanup the table of open files. */
     77void vfs_files_done(void)
     78{
     79        int i;
     80
     81        if (!files)
     82                return;
     83
     84        for (i = 0; i < MAX_OPEN_FILES; i++) {
     85                if (files[i]) {
     86                        (void) vfs_close_internal(files[i]);
     87                        (void) vfs_fd_free(i);
     88                }
     89        }
     90       
     91        free(files);
    7492}
    7593
  • uspace/srv/vfs/vfs_ops.c

    rc713aa56 r89ee7ff  
    817817}
    818818
    819 static int vfs_close_internal(vfs_file_t *file)
     819int vfs_close_internal(vfs_file_t *file)
    820820{
    821821        /*
Note: See TracChangeset for help on using the changeset viewer.