Subversion Repositories HelenOS

Rev

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

Rev 3665 Rev 3742
Line 387... Line 387...
387
    block_t *b;
387
    block_t *b;
388
    int i, j;
388
    int i, j;
389
    uint16_t bps;
389
    uint16_t bps;
390
    unsigned dps;
390
    unsigned dps;
391
    unsigned blocks;
391
    unsigned blocks;
-
 
392
    fat_cluster_t mcl, lcl;
-
 
393
    int rc;
392
 
394
 
393
    futex_down(&childp->lock);
395
    futex_down(&childp->lock);
394
    if (childp->lnkcnt == 1) {
396
    if (childp->lnkcnt == 1) {
395
        /*
397
        /*
396
         * On FAT, we don't support multiple hard links.
398
         * On FAT, we don't support multiple hard links.
Line 435... Line 437...
435
                goto hit;
437
                goto hit;
436
            }
438
            }
437
        }
439
        }
438
        block_put(b);
440
        block_put(b);
439
    }
441
    }
-
 
442
    j = 0;
440
   
443
   
441
    /*
444
    /*
442
     * We need to grow the parent in order to create a new unused dentry.
445
     * We need to grow the parent in order to create a new unused dentry.
443
     */
446
     */
-
 
447
    if (parentp->idx->pfc == FAT_CLST_ROOT) {
-
 
448
        /* Can't grow the root directory. */
444
    futex_up(&parentp->idx->lock);
449
        futex_up(&parentp->idx->lock);
445
    return ENOTSUP; /* XXX */
450
        return ENOSPC;
-
 
451
    }
-
 
452
    rc = fat_alloc_clusters(bs, parentp->idx->dev_handle, 1, &mcl, &lcl);
-
 
453
    if (rc != EOK) {
-
 
454
        futex_up(&parentp->idx->lock);
-
 
455
        return rc;
-
 
456
    }
-
 
457
    fat_append_clusters(bs, parentp, mcl);
-
 
458
    b = fat_block_get(bs, parentp, i, BLOCK_FLAGS_NOREAD);
-
 
459
    d = (fat_dentry_t *)b->data;
-
 
460
    /*
-
 
461
     * Clear all dentries in the block except for the first one (the first
-
 
462
     * dentry will be cleared in the next step).
-
 
463
     */
-
 
464
    memset(d + 1, 0, bps - sizeof(fat_dentry_t));
446
 
465
 
447
hit:
466
hit:
448
    /*
467
    /*
449
     * At this point we only establish the link between the parent and the
468
     * At this point we only establish the link between the parent and the
450
     * child.  The dentry, except of the name and the extension, will remain
469
     * child.  The dentry, except of the name and the extension, will remain
451
     * uninitialized until the the corresponding node is synced. Thus the
470
     * uninitialized until the corresponding node is synced. Thus the valid
452
     * valid dentry data is kept in the child node structure.
471
     * dentry data is kept in the child node structure.
453
     */
472
     */
454
    memset(d, 0, sizeof(fat_dentry_t));
473
    memset(d, 0, sizeof(fat_dentry_t));
455
    fat_dentry_name_set(d, name);
474
    fat_dentry_name_set(d, name);
456
    b->dirty = true;        /* need to sync block */
475
    b->dirty = true;        /* need to sync block */
457
    block_put(b);
476
    block_put(b);