Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3568 → Rev 3571

/trunk/uspace/lib/libblock/libblock.c
299,7 → 299,7
*
* @return Block structure.
*/
block_t *block_get(dev_handle_t dev_handle, off_t boff)
block_t *block_get(dev_handle_t dev_handle, bn_t boff)
{
devcon_t *devcon;
cache_t *cache;
/trunk/uspace/lib/libblock/libblock.h
44,6 → 44,8
#include <libadt/hash_table.h>
#include <libadt/list.h>
 
typedef unsigned bn_t; /**< Block number type. */
 
typedef struct block {
/** Futex protecting the reference count. */
futex_t lock;
56,7 → 58,7
/** Handle of the device where the block resides. */
dev_handle_t dev_handle;
/** Block offset on the block device. Counted in 'size'-byte blocks. */
off_t boff;
bn_t boff;
/** Size of the block. */
size_t size;
/** Link for placing the block into the free block list. */
75,7 → 77,7
 
extern int block_cache_init(dev_handle_t, size_t, unsigned);
 
extern block_t *block_get(dev_handle_t, off_t);
extern block_t *block_get(dev_handle_t, bn_t);
extern void block_put(block_t *);
 
extern int block_read(int, off_t *, size_t *, off_t *, void *, size_t, size_t);
/trunk/uspace/srv/fs/fat/fat_fat.c
59,10 → 59,7
* @param bs Buffer holding the boot sector for the file.
* @param dev_handle Device handle of the device with the file.
* @param firstc First cluster to start the walk with.
* @param penult If non-NULL, output argument hodling the
* the penultimate cluster visited.
* @param ult If non-NULL, output argument holding the
* ultimate cluster visited.
* @param lastc If non-NULL, output argument hodling the last cluster number visited.
* @param max_clusters Maximum number of clusters to visit.
*
* @return Number of clusters seen during the walk.
69,7 → 66,7
*/
uint16_t
fat_cluster_walk(fat_bs_t *bs, dev_handle_t dev_handle, fat_cluster_t firstc,
fat_cluster_t *penult, fat_cluster_t *ult, uint16_t max_clusters)
fat_cluster_t *lastc, uint16_t max_clusters)
{
block_t *b;
unsigned bps;
82,22 → 79,18
 
if (firstc == FAT_CLST_RES0) {
/* No space allocated to the file. */
if (ult)
*ult = firstc;
if (lastc)
*lastc = firstc;
return 0;
}
 
/* At this point, the meaning of penult is not well-defined. */
if (penult)
*penult = FAT_CLST_RES0;
 
while (clst < FAT_CLST_LAST1 && clusters < max_clusters) {
unsigned fsec; /* sector offset relative to FAT1 */
bn_t fsec; /* sector offset relative to FAT1 */
unsigned fidx; /* FAT1 entry index */
 
assert(clst >= FAT_CLST_FIRST);
if (penult)
*penult = clst; /* remember the penultimate cluster */
if (lastc)
*lastc = clst; /* remember the last cluster number */
fsec = (clst * sizeof(fat_cluster_t)) / bps;
fidx = clst % (bps / sizeof(fat_cluster_t));
/* read FAT1 */
108,8 → 101,8
clusters++;
}
 
if (ult)
*ult = clst;
if (lastc && clst < FAT_CLST_LAST1)
*lastc = clst;
 
return clusters;
}
120,13 → 113,13
* @param dev_handle Device handle of the file system.
* @param firstc First cluster used by the file. Can be zero if the file
* is empty.
* @param offset Offset in blocks.
* @param bn Block number.
*
* @return Block structure holding the requested block.
*/
block_t *
_fat_block_get(fat_bs_t *bs, dev_handle_t dev_handle, fat_cluster_t firstc,
off_t offset)
bn_t bn)
{
block_t *b;
unsigned bps;
149,18 → 142,18
 
if (firstc == FAT_CLST_ROOT) {
/* root directory special case */
assert(offset < rds);
b = block_get(dev_handle, rscnt + bs->fatcnt * sf + offset);
assert(bn < rds);
b = block_get(dev_handle, rscnt + bs->fatcnt * sf + bn);
return b;
}
 
max_clusters = offset / bs->spc;
clusters = fat_cluster_walk(bs, dev_handle, firstc, NULL, &lastc,
max_clusters = bn / bs->spc;
clusters = fat_cluster_walk(bs, dev_handle, firstc, &lastc,
max_clusters);
assert(clusters == max_clusters);
 
b = block_get(dev_handle, ssa + (lastc - FAT_CLST_FIRST) * bs->spc +
offset % bs->spc);
bn % bs->spc);
 
return b;
}
361,7 → 354,7
uint8_t fatno;
 
if (fat_cluster_walk(bs, nodep->idx->dev_handle, nodep->firstc, &lcl,
NULL, (uint16_t) -1) == 0) {
(uint16_t) -1) == 0) {
/* No clusters allocated to the node yet. */
nodep->firstc = host2uint16_t_le(mcl);
nodep->dirty = true; /* need to sync node */
/trunk/uspace/srv/fs/fat/fat_fat.h
35,6 → 35,7
 
#include "../../vfs/vfs.h"
#include <stdint.h>
#include <libblock.h>
 
#define FAT1 0
 
58,14 → 59,15
typedef uint16_t fat_cluster_t;
 
#define fat_clusters_get(bs, dh, fc) \
fat_cluster_walk((bs), (dh), (fc), NULL, NULL, (uint16_t) -1)
#define fat_block_get(bs, np, off) \
_fat_block_get((bs), (np)->idx->dev_handle, (np)->firstc, (off))
fat_cluster_walk((bs), (dh), (fc), NULL, (uint16_t) -1)
extern uint16_t fat_cluster_walk(struct fat_bs *, dev_handle_t, fat_cluster_t,
fat_cluster_t *, uint16_t);
 
#define fat_block_get(bs, np, bn) \
_fat_block_get((bs), (np)->idx->dev_handle, (np)->firstc, (bn))
 
extern struct block *_fat_block_get(struct fat_bs *, dev_handle_t,
fat_cluster_t, off_t);
extern uint16_t fat_cluster_walk(struct fat_bs *, dev_handle_t, fat_cluster_t,
fat_cluster_t *, fat_cluster_t *, uint16_t);
fat_cluster_t, bn_t);
extern void fat_append_clusters(struct fat_bs *, struct fat_node *,
fat_cluster_t);