Subversion Repositories HelenOS

Rev

Rev 3512 | Rev 3517 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3512 Rev 3513
Line 106... Line 106...
106
 
106
 
107
/** Return number of blocks allocated to a file.
107
/** Return number of blocks allocated to a file.
108
 *
108
 *
109
 * @param dev_handle    Device handle of the device with the file.
109
 * @param dev_handle    Device handle of the device with the file.
110
 * @param firstc    First cluster of the file.
110
 * @param firstc    First cluster of the file.
-
 
111
 * @param lastc     If non-NULL, output argument holding the
-
 
112
 *          last cluster.
111
 *
113
 *
112
 * @return      Number of blocks allocated to the file.
114
 * @return      Number of blocks allocated to the file.
113
 */
115
 */
114
uint16_t
116
uint16_t
115
_fat_blcks_get(dev_handle_t dev_handle, fat_cluster_t firstc)
117
_fat_blcks_get(dev_handle_t dev_handle, fat_cluster_t firstc,
-
 
118
    fat_cluster_t *lastc)
116
{
119
{
117
    block_t *bb;
120
    block_t *bb;
118
    block_t *b;
121
    block_t *b;
119
    unsigned bps;
122
    unsigned bps;
120
    unsigned spc;
123
    unsigned spc;
Line 128... Line 131...
128
    rscnt = uint16_t_le2host(FAT_BS(bb)->rscnt);
131
    rscnt = uint16_t_le2host(FAT_BS(bb)->rscnt);
129
    block_put(bb);
132
    block_put(bb);
130
 
133
 
131
    if (firstc == FAT_CLST_RES0) {
134
    if (firstc == FAT_CLST_RES0) {
132
        /* No space allocated to the file. */
135
        /* No space allocated to the file. */
-
 
136
        if (lastc)
-
 
137
            *lastc = firstc;
133
        return 0;
138
        return 0;
134
    }
139
    }
135
 
140
 
136
    while (clst < FAT_CLST_LAST1) {
141
    while (clst < FAT_CLST_LAST1) {
137
        unsigned fsec;  /* sector offset relative to FAT1 */
142
        unsigned fsec;  /* sector offset relative to FAT1 */
138
        unsigned fidx;  /* FAT1 entry index */
143
        unsigned fidx;  /* FAT1 entry index */
139
 
144
 
140
        assert(clst >= FAT_CLST_FIRST);
145
        assert(clst >= FAT_CLST_FIRST);
-
 
146
        if (lastc)
-
 
147
            *lastc = clst;      /* remember the last cluster */
141
        fsec = (clst * sizeof(fat_cluster_t)) / bps;
148
        fsec = (clst * sizeof(fat_cluster_t)) / bps;
142
        fidx = clst % (bps / sizeof(fat_cluster_t));
149
        fidx = clst % (bps / sizeof(fat_cluster_t));
143
        /* read FAT1 */
150
        /* read FAT1 */
144
        b = block_get(dev_handle, rscnt + fsec, bps);
151
        b = block_get(dev_handle, rscnt + fsec, bps);
145
        clst = uint16_t_le2host(((fat_cluster_t *)b->data)[fidx]);
152
        clst = uint16_t_le2host(((fat_cluster_t *)b->data)[fidx]);
146
        assert(clst != FAT_CLST_BAD);
153
        assert(clst != FAT_CLST_BAD);
147
        block_put(b);
154
        block_put(b);
148
        clusters++;
155
        clusters++;
149
    }
156
    }
150
 
157
 
-
 
158
    if (lastc)
-
 
159
        *lastc = clst;
151
    return clusters * spc;
160
    return clusters * spc;
152
}
161
}
153
 
162
 
154
uint16_t fat_bps_get(dev_handle_t dev_handle)
163
uint16_t fat_bps_get(dev_handle_t dev_handle)
155
{
164
{
Line 322... Line 331...
322
    return ENOSPC;
331
    return ENOSPC;
323
}
332
}
324
 
333
 
325
void fat_append_clusters(fat_node_t *nodep, fat_cluster_t mcl)
334
void fat_append_clusters(fat_node_t *nodep, fat_cluster_t mcl)
326
{
335
{
-
 
336
    block_t *bb;
-
 
337
    fat_cluster_t lcl;
-
 
338
    uint8_t fatcnt, fatno;
-
 
339
 
-
 
340
    if (_fat_blcks_get(nodep->idx->dev_handle, nodep->firstc, &lcl) == 0) {
-
 
341
        nodep->firstc = host2uint16_t_le(mcl);
-
 
342
        nodep->dirty = true;        /* need to sync node */
-
 
343
        return;
-
 
344
    }
-
 
345
 
-
 
346
    bb = block_get(nodep->idx->dev_handle, BS_BLOCK, BS_SIZE);
-
 
347
    fatcnt = FAT_BS(bb)->fatcnt;
-
 
348
    block_put(bb);
-
 
349
 
-
 
350
    for (fatno = FAT1; fatno < fatcnt; fatno++)
-
 
351
        fat_mark_cluster(nodep->idx->dev_handle, fatno, lcl, mcl);
327
}
352
}
328
 
353
 
329
/**
354
/**
330
 * @}
355
 * @}
331
 */
356
 */