Subversion Repositories HelenOS

Rev

Rev 3009 | Rev 3403 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3009 Rev 3153
Line 110... Line 110...
110
}
110
}
111
 
111
 
112
#define FAT_BS(b)       ((fat_bs_t *)((b)->data))
112
#define FAT_BS(b)       ((fat_bs_t *)((b)->data))
113
 
113
 
114
#define FAT_CLST_RES0   0x0000
114
#define FAT_CLST_RES0   0x0000
115
#define FAT_CLST_RES1   0x0001  /* internally used to mark root directory */
115
#define FAT_CLST_RES1   0x0001
116
#define FAT_CLST_FIRST  0x0002
116
#define FAT_CLST_FIRST  0x0002
117
#define FAT_CLST_BAD    0xfff7
117
#define FAT_CLST_BAD    0xfff7
118
#define FAT_CLST_LAST1  0xfff8
118
#define FAT_CLST_LAST1  0xfff8
119
#define FAT_CLST_LAST8  0xffff
119
#define FAT_CLST_LAST8  0xffff
120
 
120
 
-
 
121
/* internally used to mark root directory's parent */
-
 
122
#define FAT_CLST_ROOTPAR    FAT_CLST_RES0
-
 
123
/* internally used to mark root directory */
-
 
124
#define FAT_CLST_ROOT       FAT_CLST_RES1
-
 
125
 
121
#define fat_block_get(np, off) \
126
#define fat_block_get(np, off) \
122
    _fat_block_get((np)->idx->dev_handle, (np)->firstc, (off))
127
    _fat_block_get((np)->idx->dev_handle, (np)->firstc, (off))
123
 
128
 
124
static block_t *
129
static block_t *
125
_fat_block_get(dev_handle_t dev_handle, fat_cluster_t firstc, off_t offset)
130
_fat_block_get(dev_handle_t dev_handle, fat_cluster_t firstc, off_t offset)
Line 149... Line 154...
149
 
154
 
150
    rds = (sizeof(fat_dentry_t) * rde) / bps;
155
    rds = (sizeof(fat_dentry_t) * rde) / bps;
151
    rds += ((sizeof(fat_dentry_t) * rde) % bps != 0);
156
    rds += ((sizeof(fat_dentry_t) * rde) % bps != 0);
152
    ssa = rscnt + fatcnt * sf + rds;
157
    ssa = rscnt + fatcnt * sf + rds;
153
 
158
 
154
    if (firstc == FAT_CLST_RES1) {
159
    if (firstc == FAT_CLST_ROOT) {
155
        /* root directory special case */
160
        /* root directory special case */
156
        assert(offset < rds);
161
        assert(offset < rds);
157
        b = block_get(dev_handle, rscnt + fatcnt * sf + offset);
162
        b = block_get(dev_handle, rscnt + fatcnt * sf + offset);
158
        return b;
163
        return b;
159
    }
164
    }
Line 519... Line 524...
519
    return false;
524
    return false;
520
}
525
}
521
 
526
 
522
static void *fat_root_get(dev_handle_t dev_handle)
527
static void *fat_root_get(dev_handle_t dev_handle)
523
{
528
{
524
    return NULL;    /* TODO */
529
    return fat_node_get(dev_handle, 0);
525
}
530
}
526
 
531
 
527
static char fat_plb_get_char(unsigned pos)
532
static char fat_plb_get_char(unsigned pos)
528
{
533
{
529
    return fat_reg.plb_ro[pos % PLB_SIZE];
534
    return fat_reg.plb_ro[pos % PLB_SIZE];
Line 556... Line 561...
556
    .plb_get_char = fat_plb_get_char,
561
    .plb_get_char = fat_plb_get_char,
557
    .is_directory = fat_is_directory,
562
    .is_directory = fat_is_directory,
558
    .is_file = fat_is_file
563
    .is_file = fat_is_file
559
};
564
};
560
 
565
 
-
 
566
void fat_mounted(ipc_callid_t rid, ipc_call_t *request)
-
 
567
{
-
 
568
    dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
-
 
569
    block_t *bb;
-
 
570
    uint16_t rde;
-
 
571
    int rc;
-
 
572
 
-
 
573
    /* Read the number of root directory entries. */
-
 
574
    bb = block_get(dev_handle, BS_BLOCK);
-
 
575
    rde = uint16_t_le2host(FAT_BS(bb)->root_ent_max);
-
 
576
    block_put(bb);
-
 
577
 
-
 
578
    rc = fat_idx_init_by_dev_handle(dev_handle);
-
 
579
    if (rc != EOK) {
-
 
580
        ipc_answer_0(rid, rc);
-
 
581
        return;
-
 
582
    }
-
 
583
 
-
 
584
    /* Initialize the root node. */
-
 
585
    fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));
-
 
586
    if (!rootp) {
-
 
587
        fat_idx_fini_by_dev_handle(dev_handle);
-
 
588
        ipc_answer_0(rid, ENOMEM);
-
 
589
        return;
-
 
590
    }
-
 
591
    fat_node_initialize(rootp);
-
 
592
 
-
 
593
    fat_idx_t *ridxp = fat_idx_get_by_pos(dev_handle, FAT_CLST_ROOTPAR, 0);
-
 
594
    if (!ridxp) {
-
 
595
        free(rootp);
-
 
596
        fat_idx_fini_by_dev_handle(dev_handle);
-
 
597
        ipc_answer_0(rid, ENOMEM);
-
 
598
        return;
-
 
599
    }
-
 
600
    assert(ridxp->index == 0);
-
 
601
    /* ridxp->lock held */
-
 
602
 
-
 
603
    rootp->type = FAT_DIRECTORY;
-
 
604
    rootp->firstc = FAT_CLST_ROOT;
-
 
605
    rootp->refcnt = 1;
-
 
606
    rootp->size = rde * sizeof(fat_dentry_t);
-
 
607
    rootp->idx = ridxp;
-
 
608
    ridxp->nodep = rootp;
-
 
609
   
-
 
610
    futex_up(&ridxp->lock);
-
 
611
 
-
 
612
    ipc_answer_0(rid, EOK);
-
 
613
}
-
 
614
 
-
 
615
void fat_mount(ipc_callid_t rid, ipc_call_t *request)
-
 
616
{
-
 
617
    ipc_answer_0(rid, ENOTSUP);
-
 
618
}
-
 
619
 
561
void fat_lookup(ipc_callid_t rid, ipc_call_t *request)
620
void fat_lookup(ipc_callid_t rid, ipc_call_t *request)
562
{
621
{
563
    libfs_lookup(&fat_libfs_ops, fat_reg.fs_handle, rid, request);
622
    libfs_lookup(&fat_libfs_ops, fat_reg.fs_handle, rid, request);
564
}
623
}
565
 
624