Subversion Repositories HelenOS

Rev

Rev 3602 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3602 Rev 3665
Line 180... Line 180...
180
    spc = bs->spc;
180
    spc = bs->spc;
181
   
181
   
182
    boundary = ROUND_UP(nodep->size, bps * spc);
182
    boundary = ROUND_UP(nodep->size, bps * spc);
183
 
183
 
184
    /* zero out already allocated space */
184
    /* zero out already allocated space */
185
    for (o = nodep->size - 1; o < pos && o < boundary;
185
    for (o = nodep->size; o < pos && o < boundary;
186
        o = ALIGN_DOWN(o + bps, bps)) {
186
        o = ALIGN_DOWN(o + bps, bps)) {
187
            int flags = (o % bps == 0) ?
187
            int flags = (o % bps == 0) ?
188
            BLOCK_FLAGS_NOREAD : BLOCK_FLAGS_NONE;
188
            BLOCK_FLAGS_NOREAD : BLOCK_FLAGS_NONE;
189
        b = fat_block_get(bs, nodep, o / bps, flags);
189
        b = fat_block_get(bs, nodep, o / bps, flags);
190
        memset(b->data + o % bps, 0, bps - o % bps);
190
        memset(b->data + o % bps, 0, bps - o % bps);
Line 283... Line 283...
283
                c == 0 ? FAT_CLST_LAST1 : lifo[c - 1]);
283
                c == 0 ? FAT_CLST_LAST1 : lifo[c - 1]);
284
        }
284
        }
285
    }
285
    }
286
}
286
}
287
 
287
 
288
/** Allocate clusters in FAT1.
288
/** Allocate clusters in all copies of FAT.
289
 *
289
 *
290
 * This function will attempt to allocate the requested number of clusters in
290
 * This function will attempt to allocate the requested number of clusters in
291
 * the first FAT instance.  The FAT will be altered so that the allocated
291
 * all instances of the FAT.  The FAT will be altered so that the allocated
292
 * clusters form an independent chain (i.e. a chain which does not belong to any
292
 * clusters form an independent chain (i.e. a chain which does not belong to any
293
 * file yet).
293
 * file yet).
294
 *
294
 *
295
 * @param bs        Buffer holding the boot sector of the file system.
295
 * @param bs        Buffer holding the boot sector of the file system.
296
 * @param dev_handle    Device handle of the file system.
296
 * @param dev_handle    Device handle of the file system.
Line 313... Line 313...
313
    fat_cluster_t *lifo;    /* stack for storing free cluster numbers */
313
    fat_cluster_t *lifo;    /* stack for storing free cluster numbers */
314
    unsigned found = 0; /* top of the free cluster number stack */
314
    unsigned found = 0; /* top of the free cluster number stack */
315
    unsigned b, c, cl;
315
    unsigned b, c, cl;
316
 
316
 
317
    lifo = (fat_cluster_t *) malloc(nclsts * sizeof(fat_cluster_t));
317
    lifo = (fat_cluster_t *) malloc(nclsts * sizeof(fat_cluster_t));
318
    if (lifo)
318
    if (!lifo)
319
        return ENOMEM;
319
        return ENOMEM;
320
   
320
   
321
    bps = uint16_t_le2host(bs->bps);
321
    bps = uint16_t_le2host(bs->bps);
322
    rscnt = uint16_t_le2host(bs->rscnt);
322
    rscnt = uint16_t_le2host(bs->rscnt);
323
    sf = uint16_t_le2host(bs->sec_per_fat);
323
    sf = uint16_t_le2host(bs->sec_per_fat);
324
   
324
   
325
    /*
325
    /*
326
     * Search FAT1 for unused clusters.
326
     * Search FAT1 for unused clusters.
327
     */
327
     */
328
    futex_down(&fat_alloc_lock);
328
    futex_down(&fat_alloc_lock);
329
    for (b = 0, cl = 0; b < sf; blk++) {
329
    for (b = 0, cl = 0; b < sf; b++) {
330
        blk = block_get(dev_handle, rscnt + b, BLOCK_FLAGS_NOREAD);
330
        blk = block_get(dev_handle, rscnt + b, BLOCK_FLAGS_NONE);
331
        for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) {
331
        for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) {
332
            fat_cluster_t *clst = (fat_cluster_t *)blk->data + c;
332
            fat_cluster_t *clst = (fat_cluster_t *)blk->data + c;
333
            if (uint16_t_le2host(*clst) == FAT_CLST_RES0) {
333
            if (uint16_t_le2host(*clst) == FAT_CLST_RES0) {
334
                /*
334
                /*
335
                 * The cluster is free. Put it into our stack
335
                 * The cluster is free. Put it into our stack
Line 383... Line 383...
383
    unsigned fatno;
383
    unsigned fatno;
384
    fat_cluster_t nextc;
384
    fat_cluster_t nextc;
385
 
385
 
386
    /* Mark all clusters in the chain as free in all copies of FAT. */
386
    /* Mark all clusters in the chain as free in all copies of FAT. */
387
    while (firstc < FAT_CLST_LAST1) {
387
    while (firstc < FAT_CLST_LAST1) {
-
 
388
        assert(firstc >= FAT_CLST_FIRST && firstc < FAT_CLST_BAD);
388
        nextc = fat_get_cluster(bs, dev_handle, firstc);
389
        nextc = fat_get_cluster(bs, dev_handle, firstc);
389
        assert(nextc >= FAT_CLST_FIRST && nextc < FAT_CLST_BAD);
-
 
390
        for (fatno = FAT1; fatno < bs->fatcnt; fatno++)
390
        for (fatno = FAT1; fatno < bs->fatcnt; fatno++)
391
            fat_set_cluster(bs, dev_handle, fatno, firstc,
391
            fat_set_cluster(bs, dev_handle, fatno, firstc,
392
                FAT_CLST_RES0);
392
                FAT_CLST_RES0);
393
        firstc = nextc;
393
        firstc = nextc;
394
    }
394
    }
Line 407... Line 407...
407
    uint8_t fatno;
407
    uint8_t fatno;
408
 
408
 
409
    if (fat_cluster_walk(bs, dev_handle, nodep->firstc, &lcl,
409
    if (fat_cluster_walk(bs, dev_handle, nodep->firstc, &lcl,
410
        (uint16_t) -1) == 0) {
410
        (uint16_t) -1) == 0) {
411
        /* No clusters allocated to the node yet. */
411
        /* No clusters allocated to the node yet. */
412
        nodep->firstc = host2uint16_t_le(mcl);
412
        nodep->firstc = mcl;
413
        nodep->dirty = true;        /* need to sync node */
413
        nodep->dirty = true;        /* need to sync node */
414
        return;
414
        return;
415
    }
415
    }
416
 
416
 
417
    for (fatno = FAT1; fatno < bs->fatcnt; fatno++)
417
    for (fatno = FAT1; fatno < bs->fatcnt; fatno++)