Changes in / [9a1d8ab:14f2100] in mainline


Ignore:
Location:
uspace/srv/fs/fat
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat.h

    r9a1d8ab r14f2100  
    4848
    4949#define min(a, b)               ((a) < (b) ? (a) : (b))
    50 
    51 /*
    52  * Convenience macros for accessing some frequently used boot sector members.
    53  */
    54 #define BPS(bs)         uint16_t_le2host((bs)->bps)
    55 #define SPC(bs)         (bs)->spc
    56 #define RSCNT(bs)       uint16_t_le2host((bs)->rscnt)
    57 #define FATCNT(bs)      (bs)->fatcnt
    58 #define SF(bs)          uint16_t_le2host((bs)->sec_per_fat)
    59 #define RDE(bs)         uint16_t_le2host((bs)->root_ent_max)
    60 #define TS(bs)          (uint16_t_le2host((bs)->totsec16) != 0 ? \
    61                         uint16_t_le2host((bs)->totsec16) : \
    62                         uint32_t_le2host(bs->totsec32))
    6350
    6451#define BS_BLOCK                0
     
    211198        unsigned                refcnt;
    212199        bool                    dirty;
    213 
    214         /*
    215          * Cache of the node's last and "current" cluster to avoid some
    216          * unnecessary FAT walks.
    217          */
    218         /* Node's last cluster in FAT. */
    219         bool            lastc_cached_valid;
    220         fat_cluster_t   lastc_cached_value;
    221         /* Node's "current" cluster, i.e. where the last I/O took place. */
    222         bool            currc_cached_valid;
    223         aoff64_t        currc_cached_bn;
    224         fat_cluster_t   currc_cached_value;
    225200} fat_node_t;
    226201
  • uspace/srv/fs/fat/fat_fat.c

    r9a1d8ab r14f2100  
    4949#include <mem.h>
    5050
    51 /*
    52  * Convenience macros for computing some frequently used values from the
    53  * primitive boot sector members.
    54  */
    55 #define RDS(bs)         ((sizeof(fat_dentry_t) * RDE((bs))) / BPS((bs))) + \
    56                         (((sizeof(fat_dentry_t) * RDE((bs))) % BPS((bs))) != 0)
    57 #define SSA(bs)         (RSCNT((bs)) + FATCNT((bs)) * SF((bs)) + RDS(bs))
    58 
    59 #define CLBN2PBN(bs, cl, bn) \
    60         (SSA((bs)) + ((cl) - FAT_CLST_FIRST) * SPC((bs)) + (bn) % SPC((bs)))
    61 
    6251/**
    6352 * The fat_alloc_lock mutex protects all copies of the File Allocation Table
     
    8574{
    8675        block_t *b;
     76        unsigned bps;
     77        unsigned rscnt;         /* block address of the first FAT */
    8778        uint16_t clusters = 0;
    8879        fat_cluster_t clst = firstc;
    8980        int rc;
     81
     82        bps = uint16_t_le2host(bs->bps);
     83        rscnt = uint16_t_le2host(bs->rscnt);
    9084
    9185        if (firstc == FAT_CLST_RES0) {
     
    10599                if (lastc)
    106100                        *lastc = clst;  /* remember the last cluster number */
    107                 fsec = (clst * sizeof(fat_cluster_t)) / BPS(bs);
    108                 fidx = clst % (BPS(bs) / sizeof(fat_cluster_t));
     101                fsec = (clst * sizeof(fat_cluster_t)) / bps;
     102                fidx = clst % (bps / sizeof(fat_cluster_t));
    109103                /* read FAT1 */
    110                 rc = block_get(&b, dev_handle, RSCNT(bs) + fsec,
    111                     BLOCK_FLAGS_NONE);
     104                rc = block_get(&b, dev_handle, rscnt + fsec, BLOCK_FLAGS_NONE);
    112105                if (rc != EOK)
    113106                        return rc;
     
    132125 * @param block         Pointer to a block pointer for storing result.
    133126 * @param bs            Buffer holding the boot sector of the file system.
    134  * @param nodep         FAT node.
     127 * @param dev_handle    Device handle of the file system.
     128 * @param firstc        First cluster used by the file. Can be zero if the file
     129 *                      is empty.
    135130 * @param bn            Block number.
    136131 * @param flags         Flags passed to libblock.
     
    139134 */
    140135int
    141 fat_block_get(block_t **block, struct fat_bs *bs, fat_node_t *nodep,
    142     aoff64_t bn, int flags)
    143 {
    144         fat_cluster_t firstc = nodep->firstc;
    145         fat_cluster_t currc;
    146         aoff64_t relbn = bn;
    147         int rc;
    148 
    149         if (!nodep->size)
    150                 return ELIMIT;
    151 
    152         if (nodep->firstc == FAT_CLST_ROOT)
    153                 goto fall_through;
    154 
    155         if (((((nodep->size - 1) / BPS(bs)) / SPC(bs)) == bn / SPC(bs)) &&
    156             nodep->lastc_cached_valid) {
    157                 /*
    158                  * This is a request to read a block within the last cluster
    159                  * when fortunately we have the last cluster number cached.
    160                  */
    161                 return block_get(block, nodep->idx->dev_handle,
    162                     CLBN2PBN(bs, nodep->lastc_cached_value, bn), flags);
    163         }
    164 
    165         if (nodep->currc_cached_valid && bn >= nodep->currc_cached_bn) {
    166                 /*
    167                  * We can start with the cluster cached by the previous call to
    168                  * fat_block_get().
    169                  */
    170                 firstc = nodep->currc_cached_value;
    171                 relbn -= (nodep->currc_cached_bn / SPC(bs)) * SPC(bs);
    172         }
    173 
    174 fall_through:
    175         rc = _fat_block_get(block, bs, nodep->idx->dev_handle, firstc,
    176             &currc, relbn, flags);
    177         if (rc != EOK)
    178                 return rc;
    179        
    180         /*
    181          * Update the "current" cluster cache.
    182          */
    183         nodep->currc_cached_valid = true;
    184         nodep->currc_cached_bn = bn;
    185         nodep->currc_cached_value = currc;
    186 
    187         return rc;
    188 }
    189 
    190 /** Read block from file located on a FAT file system.
    191  *
    192  * @param block         Pointer to a block pointer for storing result.
    193  * @param bs            Buffer holding the boot sector of the file system.
    194  * @param dev_handle    Device handle of the file system.
    195  * @param fcl           First cluster used by the file. Can be zero if the file
    196  *                      is empty.
    197  * @param clp           If not NULL, address where the cluster containing bn
    198  *                      will be stored.
    199  *                      stored
    200  * @param bn            Block number.
    201  * @param flags         Flags passed to libblock.
    202  *
    203  * @return              EOK on success or a negative error code.
    204  */
    205 int
    206136_fat_block_get(block_t **block, fat_bs_t *bs, dev_handle_t dev_handle,
    207     fat_cluster_t fcl, fat_cluster_t *clp, aoff64_t bn, int flags)
    208 {
     137    fat_cluster_t firstc, aoff64_t bn, int flags)
     138{
     139        unsigned bps;
     140        unsigned rscnt;         /* block address of the first FAT */
     141        unsigned rde;
     142        unsigned rds;           /* root directory size */
     143        unsigned sf;
     144        unsigned ssa;           /* size of the system area */
    209145        uint16_t clusters;
    210146        unsigned max_clusters;
    211         fat_cluster_t c;
     147        fat_cluster_t lastc;
    212148        int rc;
    213149
     
    215151         * This function can only operate on non-zero length files.
    216152         */
    217         if (fcl == FAT_CLST_RES0)
     153        if (firstc == FAT_CLST_RES0)
    218154                return ELIMIT;
    219155
    220         if (fcl == FAT_CLST_ROOT) {
     156        bps = uint16_t_le2host(bs->bps);
     157        rscnt = uint16_t_le2host(bs->rscnt);
     158        rde = uint16_t_le2host(bs->root_ent_max);
     159        sf = uint16_t_le2host(bs->sec_per_fat);
     160
     161        rds = (sizeof(fat_dentry_t) * rde) / bps;
     162        rds += ((sizeof(fat_dentry_t) * rde) % bps != 0);
     163        ssa = rscnt + bs->fatcnt * sf + rds;
     164
     165        if (firstc == FAT_CLST_ROOT) {
    221166                /* root directory special case */
    222                 assert(bn < RDS(bs));
    223                 rc = block_get(block, dev_handle,
    224                     RSCNT(bs) + FATCNT(bs) * SF(bs) + bn, flags);
     167                assert(bn < rds);
     168                rc = block_get(block, dev_handle, rscnt + bs->fatcnt * sf + bn,
     169                    flags);
    225170                return rc;
    226171        }
    227172
    228         max_clusters = bn / SPC(bs);
    229         rc = fat_cluster_walk(bs, dev_handle, fcl, &c, &clusters, max_clusters);
     173        max_clusters = bn / bs->spc;
     174        rc = fat_cluster_walk(bs, dev_handle, firstc, &lastc, &clusters,
     175            max_clusters);
    230176        if (rc != EOK)
    231177                return rc;
    232178        assert(clusters == max_clusters);
    233179
    234         rc = block_get(block, dev_handle, CLBN2PBN(bs, c, bn), flags);
    235 
    236         if (clp)
    237                 *clp = c;
     180        rc = block_get(block, dev_handle,
     181            ssa + (lastc - FAT_CLST_FIRST) * bs->spc + bn % bs->spc, flags);
    238182
    239183        return rc;
     
    254198int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, aoff64_t pos)
    255199{
     200        uint16_t bps;
     201        unsigned spc;
    256202        block_t *b;
    257203        aoff64_t o, boundary;
    258204        int rc;
    259205
    260         boundary = ROUND_UP(nodep->size, BPS(bs) * SPC(bs));
     206        bps = uint16_t_le2host(bs->bps);
     207        spc = bs->spc;
     208       
     209        boundary = ROUND_UP(nodep->size, bps * spc);
    261210
    262211        /* zero out already allocated space */
    263212        for (o = nodep->size; o < pos && o < boundary;
    264             o = ALIGN_DOWN(o + BPS(bs), BPS(bs))) {
    265                 int flags = (o % BPS(bs) == 0) ?
     213            o = ALIGN_DOWN(o + bps, bps)) {
     214                int flags = (o % bps == 0) ?
    266215                    BLOCK_FLAGS_NOREAD : BLOCK_FLAGS_NONE;
    267                 rc = fat_block_get(&b, bs, nodep, o / BPS(bs), flags);
    268                 if (rc != EOK)
    269                         return rc;
    270                 memset(b->data + o % BPS(bs), 0, BPS(bs) - o % BPS(bs));
     216                rc = fat_block_get(&b, bs, nodep, o / bps, flags);
     217                if (rc != EOK)
     218                        return rc;
     219                memset(b->data + o % bps, 0, bps - o % bps);
    271220                b->dirty = true;                /* need to sync node */
    272221                rc = block_put(b);
     
    279228       
    280229        /* zero out the initial part of the new cluster chain */
    281         for (o = boundary; o < pos; o += BPS(bs)) {
     230        for (o = boundary; o < pos; o += bps) {
    282231                rc = _fat_block_get(&b, bs, nodep->idx->dev_handle, mcl,
    283                     NULL, (o - boundary) / BPS(bs), BLOCK_FLAGS_NOREAD);
    284                 if (rc != EOK)
    285                         return rc;
    286                 memset(b->data, 0, min(BPS(bs), pos - o));
     232                    (o - boundary) / bps, BLOCK_FLAGS_NOREAD);
     233                if (rc != EOK)
     234                        return rc;
     235                memset(b->data, 0, min(bps, pos - o));
    287236                b->dirty = true;                /* need to sync node */
    288237                rc = block_put(b);
     
    308257{
    309258        block_t *b;
     259        uint16_t bps;
     260        uint16_t rscnt;
     261        uint16_t sf;
    310262        fat_cluster_t *cp;
    311263        int rc;
    312264
    313         rc = block_get(&b, dev_handle, RSCNT(bs) + SF(bs) * fatno +
    314             (clst * sizeof(fat_cluster_t)) / BPS(bs), BLOCK_FLAGS_NONE);
     265        bps = uint16_t_le2host(bs->bps);
     266        rscnt = uint16_t_le2host(bs->rscnt);
     267        sf = uint16_t_le2host(bs->sec_per_fat);
     268
     269        rc = block_get(&b, dev_handle, rscnt + sf * fatno +
     270            (clst * sizeof(fat_cluster_t)) / bps, BLOCK_FLAGS_NONE);
    315271        if (rc != EOK)
    316272                return rc;
    317         cp = (fat_cluster_t *)b->data +
    318             clst % (BPS(bs) / sizeof(fat_cluster_t));
     273        cp = (fat_cluster_t *)b->data + clst % (bps / sizeof(fat_cluster_t));
    319274        *value = uint16_t_le2host(*cp);
    320275        rc = block_put(b);
     
    338293{
    339294        block_t *b;
     295        uint16_t bps;
     296        uint16_t rscnt;
     297        uint16_t sf;
    340298        fat_cluster_t *cp;
    341299        int rc;
    342300
    343         assert(fatno < FATCNT(bs));
    344         rc = block_get(&b, dev_handle, RSCNT(bs) + SF(bs) * fatno +
    345             (clst * sizeof(fat_cluster_t)) / BPS(bs), BLOCK_FLAGS_NONE);
     301        bps = uint16_t_le2host(bs->bps);
     302        rscnt = uint16_t_le2host(bs->rscnt);
     303        sf = uint16_t_le2host(bs->sec_per_fat);
     304
     305        assert(fatno < bs->fatcnt);
     306        rc = block_get(&b, dev_handle, rscnt + sf * fatno +
     307            (clst * sizeof(fat_cluster_t)) / bps, BLOCK_FLAGS_NONE);
    346308        if (rc != EOK)
    347309                return rc;
    348         cp = (fat_cluster_t *)b->data +
    349             clst % (BPS(bs) / sizeof(fat_cluster_t));
     310        cp = (fat_cluster_t *)b->data + clst % (bps / sizeof(fat_cluster_t));
    350311        *cp = host2uint16_t_le(value);
    351312        b->dirty = true;                /* need to sync block */
     
    403364    fat_cluster_t *mcl, fat_cluster_t *lcl)
    404365{
     366        uint16_t bps;
     367        uint16_t rscnt;
     368        uint16_t sf;
     369        uint32_t ts;
     370        unsigned rde;
     371        unsigned rds;
     372        unsigned ssa;
    405373        block_t *blk;
    406374        fat_cluster_t *lifo;    /* stack for storing free cluster numbers */
     
    413381                return ENOMEM;
    414382       
     383        bps = uint16_t_le2host(bs->bps);
     384        rscnt = uint16_t_le2host(bs->rscnt);
     385        sf = uint16_t_le2host(bs->sec_per_fat);
     386        rde = uint16_t_le2host(bs->root_ent_max);
     387        ts = (uint32_t) uint16_t_le2host(bs->totsec16);
     388        if (ts == 0)
     389                ts = uint32_t_le2host(bs->totsec32);
     390
     391        rds = (sizeof(fat_dentry_t) * rde) / bps;
     392        rds += ((sizeof(fat_dentry_t) * rde) % bps != 0);
     393        ssa = rscnt + bs->fatcnt * sf + rds;
     394       
    415395        /*
    416396         * Search FAT1 for unused clusters.
    417397         */
    418398        fibril_mutex_lock(&fat_alloc_lock);
    419         for (b = 0, cl = 0; b < SF(bs); b++) {
    420                 rc = block_get(&blk, dev_handle, RSCNT(bs) + b,
    421                     BLOCK_FLAGS_NONE);
     399        for (b = 0, cl = 0; b < sf; b++) {
     400                rc = block_get(&blk, dev_handle, rscnt + b, BLOCK_FLAGS_NONE);
    422401                if (rc != EOK)
    423402                        goto error;
    424                 for (c = 0; c < BPS(bs) / sizeof(fat_cluster_t); c++, cl++) {
     403                for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) {
    425404                        /*
    426405                         * Check if the cluster is physically there. This check
     
    429408                         * from the size of the file allocation table.
    430409                         */
    431                         if ((cl >= 2) &&
    432                             ((cl - 2) * SPC(bs) + SSA(bs) >= TS(bs))) {
     410                        if ((cl >= 2) && ((cl - 2) * bs->spc + ssa >= ts)) {
    433411                                rc = block_put(blk);
    434412                                if (rc != EOK)
     
    533511 * @param nodep         Node representing the file.
    534512 * @param mcl           First cluster of the cluster chain to append.
    535  * @param lcl           Last cluster of the cluster chain to append.
    536513 *
    537514 * @return              EOK on success or a negative error code.
    538515 */
    539 int
    540 fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl,
    541     fat_cluster_t lcl)
     516int fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl)
    542517{
    543518        dev_handle_t dev_handle = nodep->idx->dev_handle;
    544         fat_cluster_t lastc;
     519        fat_cluster_t lcl;
    545520        uint16_t numc;
    546521        uint8_t fatno;
    547522        int rc;
    548523
    549         if (nodep->lastc_cached_valid) {
    550                 lastc = nodep->lastc_cached_value;
    551                 nodep->lastc_cached_valid = false;
    552         } else {
    553                 rc = fat_cluster_walk(bs, dev_handle, nodep->firstc, &lastc,
    554                     &numc, (uint16_t) -1);
    555                 if (rc != EOK)
    556                         return rc;
    557 
    558                 if (numc == 0) {
    559                         /* No clusters allocated to the node yet. */
    560                         nodep->firstc = mcl;
    561                         nodep->dirty = true;    /* need to sync node */
    562                         return EOK;
    563                 }
     524        rc = fat_cluster_walk(bs, dev_handle, nodep->firstc, &lcl, &numc,
     525            (uint16_t) -1);
     526        if (rc != EOK)
     527                return rc;
     528
     529        if (numc == 0) {
     530                /* No clusters allocated to the node yet. */
     531                nodep->firstc = mcl;
     532                nodep->dirty = true;            /* need to sync node */
     533                return EOK;
    564534        }
    565535
    566536        for (fatno = FAT1; fatno < bs->fatcnt; fatno++) {
    567                 rc = fat_set_cluster(bs, nodep->idx->dev_handle, fatno, lastc,
     537                rc = fat_set_cluster(bs, nodep->idx->dev_handle, fatno, lcl,
    568538                    mcl);
    569539                if (rc != EOK)
    570540                        return rc;
    571541        }
    572 
    573         nodep->lastc_cached_valid = true;
    574         nodep->lastc_cached_value = lcl;
    575542
    576543        return EOK;
     
    581548 * @param bs            Buffer holding the boot sector of the file system.
    582549 * @param nodep         FAT node where the chopping will take place.
    583  * @param lcl           Last cluster which will remain in the node. If this
     550 * @param lastc         Last cluster which will remain in the node. If this
    584551 *                      argument is FAT_CLST_RES0, then all clusters will
    585552 *                      be chopped off.
     
    587554 * @return              EOK on success or a negative return code.
    588555 */
    589 int fat_chop_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t lcl)
    590 {
    591         int rc;
     556int fat_chop_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t lastc)
     557{
     558        int rc;
     559
    592560        dev_handle_t dev_handle = nodep->idx->dev_handle;
    593 
    594         /*
    595          * Invalidate cached cluster numbers.
    596          */
    597         nodep->lastc_cached_valid = false;
    598         if (nodep->currc_cached_value != lcl)
    599                 nodep->currc_cached_valid = false;
    600 
    601         if (lcl == FAT_CLST_RES0) {
     561        if (lastc == FAT_CLST_RES0) {
    602562                /* The node will have zero size and no clusters allocated. */
    603563                rc = fat_free_clusters(bs, dev_handle, nodep->firstc);
     
    610570                unsigned fatno;
    611571
    612                 rc = fat_get_cluster(bs, dev_handle, FAT1, lcl, &nextc);
     572                rc = fat_get_cluster(bs, dev_handle, FAT1, lastc, &nextc);
    613573                if (rc != EOK)
    614574                        return rc;
     
    616576                /* Terminate the cluster chain in all copies of FAT. */
    617577                for (fatno = FAT1; fatno < bs->fatcnt; fatno++) {
    618                         rc = fat_set_cluster(bs, dev_handle, fatno, lcl,
     578                        rc = fat_set_cluster(bs, dev_handle, fatno, lastc,
    619579                            FAT_CLST_LAST1);
    620580                        if (rc != EOK)
     
    628588        }
    629589
    630         /*
    631          * Update and re-enable the last cluster cache.
    632          */
    633         nodep->lastc_cached_valid = true;
    634         nodep->lastc_cached_value = lcl;
    635 
    636590        return EOK;
    637591}
     
    642596        int i;
    643597        block_t *b;
    644         int rc;
    645 
    646         for (i = 0; i < SPC(bs); i++) {
    647                 rc = _fat_block_get(&b, bs, dev_handle, c, NULL, i,
     598        unsigned bps;
     599        int rc;
     600
     601        bps = uint16_t_le2host(bs->bps);
     602       
     603        for (i = 0; i < bs->spc; i++) {
     604                rc = _fat_block_get(&b, bs, dev_handle, c, i,
    648605                    BLOCK_FLAGS_NOREAD);
    649606                if (rc != EOK)
    650607                        return rc;
    651                 memset(b->data, 0, BPS(bs));
     608                memset(b->data, 0, bps);
    652609                b->dirty = true;
    653610                rc = block_put(b);
  • uspace/srv/fs/fat/fat_fat.h

    r9a1d8ab r14f2100  
    6464    fat_cluster_t *, uint16_t *, uint16_t);
    6565
    66 extern int fat_block_get(block_t **, struct fat_bs *, struct fat_node *,
    67     aoff64_t, int);
     66#define fat_block_get(b, bs, np, bn, flags) \
     67    _fat_block_get((b), (bs), (np)->idx->dev_handle, (np)->firstc, (bn), \
     68    (flags))
     69
    6870extern int _fat_block_get(block_t **, struct fat_bs *, dev_handle_t,
    69     fat_cluster_t, fat_cluster_t *, aoff64_t, int);
     71    fat_cluster_t, aoff64_t, int);
    7072
    7173extern int fat_append_clusters(struct fat_bs *, struct fat_node *,
    72     fat_cluster_t, fat_cluster_t);
     74    fat_cluster_t);
    7375extern int fat_chop_clusters(struct fat_bs *, struct fat_node *,
    7476    fat_cluster_t);
  • uspace/srv/fs/fat/fat_ops.c

    r9a1d8ab r14f2100  
    6060#define FS_NODE(node)   ((node) ? (node)->bp : NULL)
    6161
    62 #define DPS(bs)         (BPS((bs)) / sizeof(fat_dentry_t))
    63 #define BPC(bs)         (BPS((bs)) * SPC((bs)))
    64 
    6562/** Mutex protecting the list of cached free FAT nodes. */
    6663static FIBRIL_MUTEX_INITIALIZE(ffn_mutex);
     
    104101        node->refcnt = 0;
    105102        node->dirty = false;
    106         node->lastc_cached_valid = false;
    107         node->lastc_cached_value = FAT_CLST_LAST1;
    108         node->currc_cached_valid = false;
    109         node->currc_cached_bn = 0;
    110         node->currc_cached_value = FAT_CLST_LAST1;
    111103}
    112104
     
    116108        fat_bs_t *bs;
    117109        fat_dentry_t *d;
     110        uint16_t bps;
     111        unsigned dps;
    118112        int rc;
    119113       
     
    121115
    122116        bs = block_bb_get(node->idx->dev_handle);
     117        bps = uint16_t_le2host(bs->bps);
     118        dps = bps / sizeof(fat_dentry_t);
    123119       
    124120        /* Read the block that contains the dentry of interest. */
    125121        rc = _fat_block_get(&b, bs, node->idx->dev_handle, node->idx->pfc,
    126             NULL, (node->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs),
    127             BLOCK_FLAGS_NONE);
     122            (node->idx->pdi * sizeof(fat_dentry_t)) / bps, BLOCK_FLAGS_NONE);
    128123        if (rc != EOK)
    129124                return rc;
    130125
    131         d = ((fat_dentry_t *)b->data) + (node->idx->pdi % DPS(bs));
     126        d = ((fat_dentry_t *)b->data) + (node->idx->pdi % dps);
    132127
    133128        d->firstc = host2uint16_t_le(node->firstc);
     
    271266        fat_dentry_t *d;
    272267        fat_node_t *nodep = NULL;
     268        unsigned bps;
     269        unsigned spc;
     270        unsigned dps;
    273271        int rc;
    274272
     
    300298
    301299        bs = block_bb_get(idxp->dev_handle);
     300        bps = uint16_t_le2host(bs->bps);
     301        spc = bs->spc;
     302        dps = bps / sizeof(fat_dentry_t);
    302303
    303304        /* Read the block that contains the dentry of interest. */
    304         rc = _fat_block_get(&b, bs, idxp->dev_handle, idxp->pfc, NULL,
    305             (idxp->pdi * sizeof(fat_dentry_t)) / BPS(bs), BLOCK_FLAGS_NONE);
     305        rc = _fat_block_get(&b, bs, idxp->dev_handle, idxp->pfc,
     306            (idxp->pdi * sizeof(fat_dentry_t)) / bps, BLOCK_FLAGS_NONE);
    306307        if (rc != EOK) {
    307308                (void) fat_node_put(FS_NODE(nodep));
     
    309310        }
    310311
    311         d = ((fat_dentry_t *)b->data) + (idxp->pdi % DPS(bs));
     312        d = ((fat_dentry_t *)b->data) + (idxp->pdi % dps);
    312313        if (d->attr & FAT_ATTR_SUBDIR) {
    313314                /*
     
    329330                        return rc;
    330331                }
    331                 nodep->size = BPS(bs) * SPC(bs) * clusters;
     332                nodep->size = bps * spc * clusters;
    332333        } else {
    333334                nodep->type = FAT_FILE;
     
    367368        char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1];
    368369        unsigned i, j;
     370        unsigned bps;           /* bytes per sector */
     371        unsigned dps;           /* dentries per sector */
    369372        unsigned blocks;
    370373        fat_dentry_t *d;
     
    374377        fibril_mutex_lock(&parentp->idx->lock);
    375378        bs = block_bb_get(parentp->idx->dev_handle);
    376         blocks = parentp->size / BPS(bs);
     379        bps = uint16_t_le2host(bs->bps);
     380        dps = bps / sizeof(fat_dentry_t);
     381        blocks = parentp->size / bps;
    377382        for (i = 0; i < blocks; i++) {
    378383                rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE);
     
    381386                        return rc;
    382387                }
    383                 for (j = 0; j < DPS(bs); j++) {
     388                for (j = 0; j < dps; j++) {
    384389                        d = ((fat_dentry_t *)b->data) + j;
    385390                        switch (fat_classify_dentry(d)) {
     
    409414                                fat_idx_t *idx = fat_idx_get_by_pos(
    410415                                    parentp->idx->dev_handle, parentp->firstc,
    411                                     i * DPS(bs) + j);
     416                                    i * dps + j);
    412417                                fibril_mutex_unlock(&parentp->idx->lock);
    413418                                if (!idx) {
     
    508513        fat_bs_t *bs;
    509514        fat_cluster_t mcl, lcl;
     515        uint16_t bps;
    510516        int rc;
    511517
    512518        bs = block_bb_get(dev_handle);
     519        bps = uint16_t_le2host(bs->bps);
    513520        if (flags & L_DIRECTORY) {
    514521                /* allocate a cluster */
     
    539546                nodep->type = FAT_DIRECTORY;
    540547                nodep->firstc = mcl;
    541                 nodep->size = BPS(bs) * SPC(bs);
     548                nodep->size = bps * bs->spc;
    542549        } else {
    543550                nodep->type = FAT_FILE;
     
    602609        block_t *b;
    603610        unsigned i, j;
     611        uint16_t bps;
     612        unsigned dps;
    604613        unsigned blocks;
    605614        fat_cluster_t mcl, lcl;
     
    631640        fibril_mutex_lock(&parentp->idx->lock);
    632641        bs = block_bb_get(parentp->idx->dev_handle);
    633 
    634         blocks = parentp->size / BPS(bs);
     642        bps = uint16_t_le2host(bs->bps);
     643        dps = bps / sizeof(fat_dentry_t);
     644
     645        blocks = parentp->size / bps;
    635646
    636647        for (i = 0; i < blocks; i++) {
     
    640651                        return rc;
    641652                }
    642                 for (j = 0; j < DPS(bs); j++) {
     653                for (j = 0; j < dps; j++) {
    643654                        d = ((fat_dentry_t *)b->data) + j;
    644655                        switch (fat_classify_dentry(d)) {
     
    680691                return rc;
    681692        }
    682         rc = fat_append_clusters(bs, parentp, mcl, lcl);
     693        rc = fat_append_clusters(bs, parentp, mcl);
    683694        if (rc != EOK) {
    684695                (void) fat_free_clusters(bs, parentp->idx->dev_handle, mcl);
     
    686697                return rc;
    687698        }
    688         parentp->size += BPS(bs) * SPC(bs);
     699        parentp->size += bps * bs->spc;
    689700        parentp->dirty = true;          /* need to sync node */
    690701        rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE);
     
    760771
    761772        childp->idx->pfc = parentp->firstc;
    762         childp->idx->pdi = i * DPS(bs) + j;
     773        childp->idx->pdi = i * dps + j;
    763774        fibril_mutex_unlock(&childp->idx->lock);
    764775
     
    782793        fat_bs_t *bs;
    783794        fat_dentry_t *d;
     795        uint16_t bps;
    784796        block_t *b;
    785797        bool has_children;
     
    800812        fibril_mutex_lock(&childp->idx->lock);
    801813        bs = block_bb_get(childp->idx->dev_handle);
     814        bps = uint16_t_le2host(bs->bps);
    802815
    803816        rc = _fat_block_get(&b, bs, childp->idx->dev_handle, childp->idx->pfc,
    804             NULL, (childp->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs),
     817            (childp->idx->pdi * sizeof(fat_dentry_t)) / bps,
    805818            BLOCK_FLAGS_NONE);
    806819        if (rc != EOK)
    807820                goto error;
    808821        d = (fat_dentry_t *)b->data +
    809             (childp->idx->pdi % (BPS(bs) / sizeof(fat_dentry_t)));
     822            (childp->idx->pdi % (bps / sizeof(fat_dentry_t)));
    810823        /* mark the dentry as not-currently-used */
    811824        d->name[0] = FAT_DENTRY_ERASED;
     
    839852        fat_bs_t *bs;
    840853        fat_node_t *nodep = FAT_NODE(fn);
     854        unsigned bps;
     855        unsigned dps;
    841856        unsigned blocks;
    842857        block_t *b;
     
    851866        fibril_mutex_lock(&nodep->idx->lock);
    852867        bs = block_bb_get(nodep->idx->dev_handle);
    853 
    854         blocks = nodep->size / BPS(bs);
     868        bps = uint16_t_le2host(bs->bps);
     869        dps = bps / sizeof(fat_dentry_t);
     870
     871        blocks = nodep->size / bps;
    855872
    856873        for (i = 0; i < blocks; i++) {
     
    862879                        return rc;
    863880                }
    864                 for (j = 0; j < DPS(bs); j++) {
     881                for (j = 0; j < dps; j++) {
    865882                        d = ((fat_dentry_t *)b->data) + j;
    866883                        switch (fat_classify_dentry(d)) {
     
    959976        enum cache_mode cmode;
    960977        fat_bs_t *bs;
     978        uint16_t bps;
     979        uint16_t rde;
    961980       
    962981        /* Accept the mount options */
     
    9951014        bs = block_bb_get(dev_handle);
    9961015       
    997         if (BPS(bs) != BS_SIZE) {
     1016        /* Read the number of root directory entries. */
     1017        bps = uint16_t_le2host(bs->bps);
     1018        rde = uint16_t_le2host(bs->root_ent_max);
     1019
     1020        if (bps != BS_SIZE) {
    9981021                block_fini(dev_handle);
    9991022                ipc_answer_0(rid, ENOTSUP);
     
    10021025
    10031026        /* Initialize the block cache */
    1004         rc = block_cache_init(dev_handle, BPS(bs), 0 /* XXX */, cmode);
     1027        rc = block_cache_init(dev_handle, bps, 0 /* XXX */, cmode);
    10051028        if (rc != EOK) {
    10061029                block_fini(dev_handle);
     
    10641087        rootp->refcnt = 1;
    10651088        rootp->lnkcnt = 0;      /* FS root is not linked */
    1066         rootp->size = RDE(bs) * sizeof(fat_dentry_t);
     1089        rootp->size = rde * sizeof(fat_dentry_t);
    10671090        rootp->idx = ridxp;
    10681091        ridxp->nodep = rootp;
     
    11421165        fat_node_t *nodep;
    11431166        fat_bs_t *bs;
     1167        uint16_t bps;
    11441168        size_t bytes;
    11451169        block_t *b;
     
    11671191
    11681192        bs = block_bb_get(dev_handle);
     1193        bps = uint16_t_le2host(bs->bps);
    11691194
    11701195        if (nodep->type == FAT_FILE) {
     
    11791204                        (void) async_data_read_finalize(callid, NULL, 0);
    11801205                } else {
    1181                         bytes = min(len, BPS(bs) - pos % BPS(bs));
     1206                        bytes = min(len, bps - pos % bps);
    11821207                        bytes = min(bytes, nodep->size - pos);
    1183                         rc = fat_block_get(&b, bs, nodep, pos / BPS(bs),
     1208                        rc = fat_block_get(&b, bs, nodep, pos / bps,
    11841209                            BLOCK_FLAGS_NONE);
    11851210                        if (rc != EOK) {
     
    11891214                                return;
    11901215                        }
    1191                         (void) async_data_read_finalize(callid,
    1192                             b->data + pos % BPS(bs), bytes);
     1216                        (void) async_data_read_finalize(callid, b->data + pos % bps,
     1217                            bytes);
    11931218                        rc = block_put(b);
    11941219                        if (rc != EOK) {
     
    12051230
    12061231                assert(nodep->type == FAT_DIRECTORY);
    1207                 assert(nodep->size % BPS(bs) == 0);
    1208                 assert(BPS(bs) % sizeof(fat_dentry_t) == 0);
     1232                assert(nodep->size % bps == 0);
     1233                assert(bps % sizeof(fat_dentry_t) == 0);
    12091234
    12101235                /*
     
    12141239                 * the position pointer accordingly.
    12151240                 */
    1216                 bnum = (pos * sizeof(fat_dentry_t)) / BPS(bs);
    1217                 while (bnum < nodep->size / BPS(bs)) {
     1241                bnum = (pos * sizeof(fat_dentry_t)) / bps;
     1242                while (bnum < nodep->size / bps) {
    12181243                        aoff64_t o;
    12191244
     
    12221247                        if (rc != EOK)
    12231248                                goto err;
    1224                         for (o = pos % (BPS(bs) / sizeof(fat_dentry_t));
    1225                             o < BPS(bs) / sizeof(fat_dentry_t);
     1249                        for (o = pos % (bps / sizeof(fat_dentry_t));
     1250                            o < bps / sizeof(fat_dentry_t);
    12261251                            o++, pos++) {
    12271252                                d = ((fat_dentry_t *)b->data) + o;
     
    12811306        size_t bytes, size;
    12821307        block_t *b;
     1308        uint16_t bps;
     1309        unsigned spc;
     1310        unsigned bpc;           /* bytes per cluster */
    12831311        aoff64_t boundary;
    12841312        int flags = BLOCK_FLAGS_NONE;
     
    13061334
    13071335        bs = block_bb_get(dev_handle);
     1336        bps = uint16_t_le2host(bs->bps);
     1337        spc = bs->spc;
     1338        bpc = bps * spc;
    13081339
    13091340        /*
     
    13141345         * value signalizing a smaller number of bytes written.
    13151346         */
    1316         bytes = min(len, BPS(bs) - pos % BPS(bs));
    1317         if (bytes == BPS(bs))
     1347        bytes = min(len, bps - pos % bps);
     1348        if (bytes == bps)
    13181349                flags |= BLOCK_FLAGS_NOREAD;
    13191350       
    1320         boundary = ROUND_UP(nodep->size, BPC(bs));
     1351        boundary = ROUND_UP(nodep->size, bpc);
    13211352        if (pos < boundary) {
    13221353                /*
     
    13331364                        return;
    13341365                }
    1335                 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), flags);
     1366                rc = fat_block_get(&b, bs, nodep, pos / bps, flags);
    13361367                if (rc != EOK) {
    13371368                        (void) fat_node_put(fn);
     
    13401371                        return;
    13411372                }
    1342                 (void) async_data_write_finalize(callid,
    1343                     b->data + pos % BPS(bs), bytes);
     1373                (void) async_data_write_finalize(callid, b->data + pos % bps,
     1374                    bytes);
    13441375                b->dirty = true;                /* need to sync block */
    13451376                rc = block_put(b);
     
    13651396                fat_cluster_t mcl, lcl;
    13661397 
    1367                 nclsts = (ROUND_UP(pos + bytes, BPC(bs)) - boundary) / BPC(bs);
     1398                nclsts = (ROUND_UP(pos + bytes, bpc) - boundary) / bpc;
    13681399                /* create an independent chain of nclsts clusters in all FATs */
    13691400                rc = fat_alloc_clusters(bs, dev_handle, nclsts, &mcl, &lcl);
     
    13841415                        return;
    13851416                }
    1386                 rc = _fat_block_get(&b, bs, dev_handle, lcl, NULL,
    1387                     (pos / BPS(bs)) % SPC(bs), flags);
     1417                rc = _fat_block_get(&b, bs, dev_handle, lcl, (pos / bps) % spc,
     1418                    flags);
    13881419                if (rc != EOK) {
    13891420                        (void) fat_free_clusters(bs, dev_handle, mcl);
     
    13931424                        return;
    13941425                }
    1395                 (void) async_data_write_finalize(callid,
    1396                     b->data + pos % BPS(bs), bytes);
     1426                (void) async_data_write_finalize(callid, b->data + pos % bps,
     1427                    bytes);
    13971428                b->dirty = true;                /* need to sync block */
    13981429                rc = block_put(b);
     
    14071438                 * node's cluster chain.
    14081439                 */
    1409                 rc = fat_append_clusters(bs, nodep, mcl, lcl);
     1440                rc = fat_append_clusters(bs, nodep, mcl);
    14101441                if (rc != EOK) {
    14111442                        (void) fat_free_clusters(bs, dev_handle, mcl);
     
    14311462        fat_node_t *nodep;
    14321463        fat_bs_t *bs;
     1464        uint16_t bps;
     1465        uint8_t spc;
     1466        unsigned bpc;   /* bytes per cluster */
    14331467        int rc;
    14341468
     
    14451479
    14461480        bs = block_bb_get(dev_handle);
     1481        bps = uint16_t_le2host(bs->bps);
     1482        spc = bs->spc;
     1483        bpc = bps * spc;
    14471484
    14481485        if (nodep->size == size) {
     
    14541491                 */
    14551492                rc = EINVAL;
    1456         } else if (ROUND_UP(nodep->size, BPC(bs)) == ROUND_UP(size, BPC(bs))) {
     1493        } else if (ROUND_UP(nodep->size, bpc) == ROUND_UP(size, bpc)) {
    14571494                /*
    14581495                 * The node will be shrunk, but no clusters will be deallocated.
     
    14721509                        fat_cluster_t lastc;
    14731510                        rc = fat_cluster_walk(bs, dev_handle, nodep->firstc,
    1474                             &lastc, NULL, (size - 1) / BPC(bs));
     1511                            &lastc, NULL, (size - 1) / bpc);
    14751512                        if (rc != EOK)
    14761513                                goto out;
Note: See TracChangeset for help on using the changeset viewer.