~galfy/helenos/bird-port-mainline

« back to all changes in this revision

Viewing changes to uspace/lib/libblock/libblock.h

  • Committer: Martin Decky
  • Date: 2009-08-04 11:19:19 UTC
  • Revision ID: martin@uranus.dsrg.hide.ms.mff.cuni.cz-20090804111919-evyclddlr3v5lhmp
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2008 Jakub Jermar
 
3
 * Copyright (c) 2008 Martin Decky 
 
4
 * All rights reserved.
 
5
 *
 
6
 * Redistribution and use in source and binary forms, with or without
 
7
 * modification, are permitted provided that the following conditions
 
8
 * are met:
 
9
 *
 
10
 * - Redistributions of source code must retain the above copyright
 
11
 *   notice, this list of conditions and the following disclaimer.
 
12
 * - Redistributions in binary form must reproduce the above copyright
 
13
 *   notice, this list of conditions and the following disclaimer in the
 
14
 *   documentation and/or other materials provided with the distribution.
 
15
 * - The name of the author may not be used to endorse or promote products
 
16
 *   derived from this software without specific prior written permission.
 
17
 *
 
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
28
 */
 
29
 
 
30
/** @addtogroup libblock 
 
31
 * @{
 
32
 */ 
 
33
/**
 
34
 * @file
 
35
 */
 
36
 
 
37
#ifndef LIBBLOCK_LIBBLOCK_H_
 
38
#define LIBBLOCK_LIBBLOCK_H_ 
 
39
 
 
40
#include <stdint.h>
 
41
#include "../../srv/vfs/vfs.h"
 
42
#include <fibril_sync.h>
 
43
#include <adt/hash_table.h>
 
44
#include <adt/list.h>
 
45
 
 
46
/*
 
47
 * Flags that can be used with block_get().
 
48
 */
 
49
 
 
50
/** 
 
51
 * This macro is a symbolic value for situations where no special flags are
 
52
 * needed.
 
53
 */
 
54
#define BLOCK_FLAGS_NONE        0
 
55
 
 
56
/**
 
57
 * When the client of block_get() intends to overwrite the current contents of
 
58
 * the block, this flag is used to avoid the unnecessary read.
 
59
 */
 
60
#define BLOCK_FLAGS_NOREAD      1
 
61
 
 
62
typedef unsigned bn_t;  /**< Block number type. */
 
63
 
 
64
typedef struct block {
 
65
        /** Mutex protecting the reference count. */
 
66
        fibril_mutex_t lock;
 
67
        /** Number of references to the block_t structure. */
 
68
        unsigned refcnt;
 
69
        /** If true, the block needs to be written back to the block device. */
 
70
        bool dirty;
 
71
        /** Readers / Writer lock protecting the contents of the block. */
 
72
        fibril_rwlock_t contents_lock;
 
73
        /** Handle of the device where the block resides. */
 
74
        dev_handle_t dev_handle;
 
75
        /** Block offset on the block device. Counted in 'size'-byte blocks. */
 
76
        bn_t boff;
 
77
        /** Size of the block. */
 
78
        size_t size;
 
79
        /** Link for placing the block into the free block list. */
 
80
        link_t free_link;
 
81
        /** Link for placing the block into the block hash table. */ 
 
82
        link_t hash_link;
 
83
        /** Buffer with the block data. */
 
84
        void *data;
 
85
} block_t;
 
86
 
 
87
/** Caching mode */
 
88
enum cache_mode {
 
89
        /** Write-Through */
 
90
        CACHE_MODE_WT,
 
91
        /** Write-Back */
 
92
        CACHE_MODE_WB
 
93
};
 
94
 
 
95
extern int block_init(dev_handle_t, size_t);
 
96
extern void block_fini(dev_handle_t);
 
97
 
 
98
extern int block_bb_read(dev_handle_t, off_t, size_t);
 
99
extern void *block_bb_get(dev_handle_t);
 
100
 
 
101
extern int block_cache_init(dev_handle_t, size_t, unsigned, enum cache_mode);
 
102
 
 
103
extern block_t *block_get(dev_handle_t, bn_t, int);
 
104
extern void block_put(block_t *);
 
105
 
 
106
extern int block_seqread(dev_handle_t, off_t *, size_t *, off_t *, void *,
 
107
    size_t, size_t);
 
108
 
 
109
#endif
 
110
 
 
111
/** @}
 
112
 */
 
113