Ignore:
Timestamp:
2011-08-14T17:24:52Z (13 years ago)
Author:
Oleg Romanenko <romanenko.oleg@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
cd860fc
Parents:
25c60f4
Message:

exFAT: add exfat_directory_open_parent for managing parent directory
without node pointer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/exfat/exfat_directory.c

    r25c60f4 rf061de75  
    5454        di->bnum = 0;
    5555        di->last = false;
     56        di->fragmented = false;
     57        di->firstc = 0;
    5658}
    5759
     
    6264        if (di->nodep->type != EXFAT_DIRECTORY)
    6365                return EINVAL;
    64 
    65         di->bs = block_bb_get(di->nodep->idx->devmap_handle);
    66         di->blocks = di->nodep->size / BPS(di->bs);
     66        di->devmap_handle = nodep->idx->devmap_handle;
     67        di->fragmented = nodep->fragmented;
     68        di->firstc = nodep->firstc;
     69
     70        di->bs = block_bb_get(di->devmap_handle);
     71        di->blocks = nodep->size / BPS(di->bs);
     72        return EOK;
     73}
     74
     75int exfat_directory_open_parent(exfat_directory_t *di,
     76    devmap_handle_t devmap_handle, exfat_cluster_t firstc, bool fragmented)
     77{
     78        exfat_directory_init(di);
     79        di->devmap_handle = devmap_handle;
     80        di->fragmented = fragmented;
     81        di->firstc = firstc;
     82        di->bs = block_bb_get(devmap_handle);
     83        di->blocks = 0;
    6784        return EOK;
    6885}
     
    84101
    85102        i = (di->pos * sizeof(exfat_dentry_t)) / BPS(di->bs);
    86         if (i < di->blocks) {
    87                 if (di->b && di->bnum != i) {
    88                         block_put(di->b);
     103        if (di->nodep && (i >= di->blocks))
     104                return ENOENT;
     105
     106        if (di->b && di->bnum != i) {
     107                block_put(di->b);
     108                di->b = NULL;
     109        }
     110        if (!di->b) {
     111                if (di->nodep) {
     112                        rc = exfat_block_get(&di->b, di->bs, di->nodep, i, BLOCK_FLAGS_NONE);
     113                } else {
     114                        rc = exfat_block_get_by_clst(&di->b, di->bs, di->devmap_handle,
     115                            di->fragmented, di->firstc, NULL, i, BLOCK_FLAGS_NONE);
     116                }
     117                if (rc != EOK) {
    89118                        di->b = NULL;
     119                        return rc;
    90120                }
    91                 if (!di->b) {
    92                         rc = exfat_block_get(&di->b, di->bs, di->nodep, i, BLOCK_FLAGS_NONE);
    93                         if (rc != EOK) {
    94                                 di->b = NULL;
    95                                 return rc;
    96                         }
    97                         di->bnum = i;
    98                 }
    99                 return EOK;
    100         }
    101         return ENOENT;
     121                di->bnum = i;
     122        }
     123        return EOK;
    102124}
    103125
Note: See TracChangeset for help on using the changeset viewer.