Changeset 97bc3ee in mainline for uspace/srv/fs/fat/fat_ops.c


Ignore:
Timestamp:
2011-04-09T19:23:12Z (14 years ago)
Author:
Oleg Romanenko <romanenko.oleg@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d260a95
Parents:
fc35e98
Message:

Full support for FAT12 file system. Correct creating directories and files. Fixing addressing issue.
Type of FAT (12,16,32) is determined only on the basis of the count of clusters(according to Microsoft FAT specification). I.e. FAT
with 4085 clusters or less will be determined as FAT12. FAT16 must contain more than 4085 clusters but less then 65525.

File:
1 edited

Legend:

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

    rfc35e98 r97bc3ee  
    2929/** @addtogroup fs
    3030 * @{
    31  */ 
     31 */
    3232
    3333/**
     
    116116        fat_dentry_t *d;
    117117        int rc;
    118        
     118
    119119        assert(node->dirty);
    120120
    121121        bs = block_bb_get(node->idx->devmap_handle);
    122        
     122
    123123        /* Read the block that contains the dentry of interest. */
    124124        rc = _fat_block_get(&b, bs, node->idx->devmap_handle, node->idx->pfc,
     
    136136                d->attr = FAT_ATTR_SUBDIR;
    137137        }
    138        
     138
    139139        /* TODO: update other fields? (e.g time fields) */
    140        
     140
    141141        b->dirty = true;                /* need to sync block */
    142142        rc = block_put(b);
     
    255255        fn->data = nodep;
    256256        nodep->bp = fn;
    257        
     257
    258258        *nodepp = nodep;
    259259        return EOK;
     
    291291         * We must instantiate the node from the file system.
    292292         */
    293        
     293
    294294        assert(idxp->pfc);
    295295
     
    310310        d = ((fat_dentry_t *)b->data) + (idxp->pdi % DPS(bs));
    311311        if (d->attr & FAT_ATTR_SUBDIR) {
    312                 /* 
     312                /*
    313313                 * The only directory which does not have this bit set is the
    314314                 * root directory itself. The root directory node is handled
     
    316316                 */
    317317                nodep->type = FAT_DIRECTORY;
    318                 /*
     318
     319                /*
    319320                 * Unfortunately, the 'size' field of the FAT dentry is not
    320321                 * defined for the directory entry type. We must determine the
     
    334335                nodep->size = uint32_t_le2host(d->size);
    335336        }
    336         nodep->firstc = uint16_t_le2host(d->firstc);
     337
     338        nodep->firstc = uint16_t_le2host(d->firstc);
    337339        nodep->lnkcnt = 1;
    338340        nodep->refcnt = 1;
     
    383385                if (rc != EOK)
    384386                        return rc;
    385                 for (j = 0; j < DPS(bs); j++) { 
     387                for (j = 0; j < DPS(bs); j++) {
    386388                        d = ((fat_dentry_t *)b->data) + j;
    387389                        switch (fat_classify_dentry(d)) {
     
    521523        rc = fat_idx_get_new(&idxp, devmap_handle);
    522524        if (rc != EOK) {
    523                 (void) fat_free_clusters(bs, devmap_handle, mcl);       
     525                (void) fat_free_clusters(bs, devmap_handle, mcl);
    524526                (void) fat_node_put(FS_NODE(nodep));
    525527                return rc;
     
    618620         * a new one.
    619621         */
    620        
     622
    621623        fibril_mutex_lock(&parentp->idx->lock);
    622624        bs = block_bb_get(parentp->idx->devmap_handle);
     
    650652        }
    651653        j = 0;
    652        
     654
    653655        /*
    654656         * We need to grow the parent in order to create a new unused dentry.
     
    697699        rc = block_put(b);
    698700        fibril_mutex_unlock(&parentp->idx->lock);
    699         if (rc != EOK) 
     701        if (rc != EOK)
    700702                return rc;
    701703
    702704        fibril_mutex_lock(&childp->idx->lock);
    703        
     705
    704706        if (childp->type == FAT_DIRECTORY) {
    705707                /*
     
    778780        if (!parentp)
    779781                return EBUSY;
    780        
     782
    781783        rc = fat_has_children(&has_children, cfn);
    782784        if (rc != EOK)
     
    794796            NULL, (childp->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs),
    795797            BLOCK_FLAGS_NONE);
    796         if (rc != EOK) 
     798        if (rc != EOK)
    797799                goto error;
    798800        d = (fat_dentry_t *)b->data +
     
    839841                return EOK;
    840842        }
    841        
     843
    842844        fibril_mutex_lock(&nodep->idx->lock);
    843845        bs = block_bb_get(nodep->idx->devmap_handle);
     
    847849        for (i = 0; i < blocks; i++) {
    848850                fat_dentry_t *d;
    849        
     851
    850852                rc = fat_block_get(&b, bs, nodep, i, BLOCK_FLAGS_NONE);
    851853                if (rc != EOK) {
     
    875877                if (rc != EOK) {
    876878                        fibril_mutex_unlock(&nodep->idx->lock);
    877                         return rc;     
     879                        return rc;
    878880                }
    879881        }
     
    945947 */
    946948
    947 
    948 #define RootDirSectors(bs)      (((RDE(bs)*32) + (BPS(bs)-1)) / BPS(bs))
    949 #define FATSz(bs)               SF(bs) != 0 ? SF(bs) : uint32_t_le2host((bs)->fat32.sectors_per_fat)
    950 #define DataSec(bs)             (TS(bs) - (RSCNT(bs) + (FATCNT(bs) * FATSz(bs)) + RootDirSectors(bs)))
    951 #define CountOfClusters(bs)     (DataSec(bs) / SPC(bs))
    952 
    953949void fat_mounted(ipc_callid_t rid, ipc_call_t *request)
    954950{
     
    956952        enum cache_mode cmode;
    957953        fat_bs_t *bs;
    958        
     954
    959955        /* Accept the mount options */
    960956        char *opts;
    961957        int rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL);
    962        
     958
    963959        if (rc != EOK) {
    964960                async_answer_0(rid, rc);
     
    991987        /* get the buffer with the boot sector */
    992988        bs = block_bb_get(devmap_handle);
    993        
     989
    994990        if (BPS(bs) != BS_SIZE) {
    995991                block_fini(devmap_handle);
     
    10071003
    10081004        /* Storing FAT type (12, 16, 32) in reserved field (bs->reserved) */
    1009         if (CountOfClusters(bs) < 4085) {
     1005        if (CC(bs) < 4085) {
    10101006        /* Volume is FAT12 */
    10111007            printf("Found FAT12 filesystem\n");
    10121008            (bs)->reserved = 12;
    1013         } else if (CountOfClusters(bs) < 65525) {
     1009        } else if (CC(bs) < 65525) {
    10141010        /* Volume is FAT16 */
    10151011            printf("Found FAT16 filesystem\n");
     
    10171013        } else {
    10181014        /* Volume is FAT32 */
    1019             printf("FAT32 is not supported by FAT driver. Sorry\n");
     1015            printf("FAT32 filesystem is not supported by FAT server. Sorry.\n");
    10201016            block_fini(devmap_handle);
    10211017            async_answer_0(rid, ENOTSUP);
     
    10851081        rootp->bp = rfn;
    10861082        rfn->data = rootp;
    1087        
     1083
    10881084        fibril_mutex_unlock(&ridxp->lock);
    10891085
     
    11191115                return;
    11201116        }
    1121        
     1117
    11221118        /*
    11231119         * Put the root node and force it to the FAT free node list.
     
    13001296        int flags = BLOCK_FLAGS_NONE;
    13011297        int rc;
    1302        
     1298
    13031299        rc = fat_node_get(&fn, devmap_handle, index);
    13041300        if (rc != EOK) {
     
    13111307        }
    13121308        nodep = FAT_NODE(fn);
    1313        
     1309
    13141310        ipc_callid_t callid;
    13151311        size_t len;
     
    13281324         * but this one greatly simplifies fat_write(). Note that we can afford
    13291325         * to do this because the client must be ready to handle the return
    1330          * value signalizing a smaller number of bytes written. 
    1331          */ 
     1326         * value signalizing a smaller number of bytes written.
     1327         */
    13321328        bytes = min(len, BPS(bs) - pos % BPS(bs));
    13331329        if (bytes == BPS(bs))
    13341330                flags |= BLOCK_FLAGS_NOREAD;
    1335        
     1331
    13361332        boundary = ROUND_UP(nodep->size, BPC(bs));
    13371333        if (pos < boundary) {
     
    13791375                 */
    13801376                unsigned nclsts;
    1381                 fat_cluster_t mcl, lcl; 
    1382  
     1377                fat_cluster_t mcl, lcl;
     1378
    13831379                nclsts = (ROUND_UP(pos + bytes, BPC(bs)) - boundary) / BPC(bs);
    13841380                /* create an independent chain of nclsts clusters in all FATs */
     
    14761472                nodep->size = size;
    14771473                nodep->dirty = true;            /* need to sync node */
    1478                 rc = EOK;       
     1474                rc = EOK;
    14791475        } else {
    14801476                /*
     
    14971493                nodep->size = size;
    14981494                nodep->dirty = true;            /* need to sync node */
    1499                 rc = EOK;       
     1495                rc = EOK;
    15001496        }
    15011497out:
     
    15531549        devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);
    15541550        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
    1555        
     1551
    15561552        fs_node_t *fn;
    15571553        int rc = fat_node_get(&fn, devmap_handle, index);
     
    15641560                return;
    15651561        }
    1566        
     1562
    15671563        fat_node_t *nodep = FAT_NODE(fn);
    1568        
     1564
    15691565        nodep->dirty = true;
    15701566        rc = fat_node_sync(nodep);
    1571        
     1567
    15721568        fat_node_put(fn);
    15731569        async_answer_0(rid, rc);
Note: See TracChangeset for help on using the changeset viewer.