Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
exofs
exofs.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2005, 2006
3
* Avishay Traeger (
[email protected]
)
4
* Copyright (C) 2008, 2009
5
* Boaz Harrosh <
[email protected]
>
6
*
7
* Copyrights for code taken from ext2:
8
* Copyright (C) 1992, 1993, 1994, 1995
9
* Remy Card (
[email protected]
)
10
* Laboratoire MASI - Institut Blaise Pascal
11
* Universite Pierre et Marie Curie (Paris VI)
12
* from
13
* linux/fs/minix/inode.c
14
* Copyright (C) 1991, 1992 Linus Torvalds
15
*
16
* This file is part of exofs.
17
*
18
* exofs is free software; you can redistribute it and/or modify
19
* it under the terms of the GNU General Public License as published by
20
* the Free Software Foundation. Since it is based on ext2, and the only
21
* valid version of GPL for the Linux kernel is version 2, the only valid
22
* version of GPL for exofs is version 2.
23
*
24
* exofs is distributed in the hope that it will be useful,
25
* but WITHOUT ANY WARRANTY; without even the implied warranty of
26
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27
* GNU General Public License for more details.
28
*
29
* You should have received a copy of the GNU General Public License
30
* along with exofs; if not, write to the Free Software
31
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32
*/
33
#ifndef __EXOFS_H__
34
#define __EXOFS_H__
35
36
#include <linux/fs.h>
37
#include <linux/time.h>
38
#include <
linux/backing-dev.h
>
39
#include <
scsi/osd_ore.h
>
40
41
#include "
common.h
"
42
43
#define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a)
44
45
#ifdef CONFIG_EXOFS_DEBUG
46
#define EXOFS_DBGMSG(fmt, a...) \
47
printk(KERN_NOTICE "exofs @%s:%d: " fmt, __func__, __LINE__, ##a)
48
#else
49
#define EXOFS_DBGMSG(fmt, a...) \
50
do { if (0) printk(fmt, ##a); } while (0)
51
#endif
52
53
/* u64 has problems with printk this will cast it to unsigned long long */
54
#define _LLU(x) (unsigned long long)(x)
55
56
struct
exofs_dev
{
57
struct
ore_dev
ored
;
58
unsigned
did
;
59
unsigned
urilen
;
60
uint8_t
*
uri
;
61
struct
kobject
ed_kobj
;
62
};
63
/*
64
* our extension to the in-memory superblock
65
*/
66
struct
exofs_sb_info
{
67
struct
backing_dev_info
bdi
;
/* register our bdi with VFS */
68
struct
exofs_sb_stats
s_ess
;
/* Written often, pre-allocate*/
69
int
s_timeout
;
/* timeout for OSD operations */
70
uint64_t
s_nextid
;
/* highest object ID used */
71
uint32_t
s_numfiles
;
/* number of files on fs */
72
spinlock_t
s_next_gen_lock
;
/* spinlock for gen # update */
73
u32
s_next_generation
;
/* next gen # to use */
74
atomic_t
s_curr_pending
;
/* number of pending commands */
75
76
struct
ore_layout
layout
;
/* Default files layout */
77
struct
ore_comp
one_comp
;
/* id & cred of partition id=0*/
78
struct
ore_components
oc
;
/* comps for the partition */
79
struct
kobject
s_kobj
;
/* holds per-sbi kobject */
80
};
81
82
/*
83
* our extension to the in-memory inode
84
*/
85
struct
exofs_i_info
{
86
struct
inode
vfs_inode
;
/* normal in-memory inode */
87
wait_queue_head_t
i_wq
;
/* wait queue for inode */
88
unsigned
long
i_flags
;
/* various atomic flags */
89
uint32_t
i_data
[
EXOFS_IDATA
];
/*short symlink names and device #s*/
90
uint32_t
i_dir_start_lookup
;
/* which page to start lookup */
91
uint64_t
i_commit_size
;
/* the object's written length */
92
struct
ore_comp
one_comp
;
/* same component for all devices */
93
struct
ore_components
oc
;
/* inode view of the device table */
94
};
95
96
static
inline
osd_id
exofs_oi_objno(
struct
exofs_i_info
*oi)
97
{
98
return
oi->
vfs_inode
.i_ino +
EXOFS_OBJ_OFF
;
99
}
100
101
/*
102
* our inode flags
103
*/
104
#define OBJ_2BCREATED 0
/* object will be created soon*/
105
#define OBJ_CREATED 1
/* object has been created on the osd*/
106
107
static
inline
int
obj_2bcreated(
struct
exofs_i_info
*oi)
108
{
109
return
test_bit
(
OBJ_2BCREATED
, &oi->
i_flags
);
110
}
111
112
static
inline
void
set_obj_2bcreated(
struct
exofs_i_info
*oi)
113
{
114
set_bit
(
OBJ_2BCREATED
, &oi->
i_flags
);
115
}
116
117
static
inline
int
obj_created(
struct
exofs_i_info
*oi)
118
{
119
return
test_bit
(
OBJ_CREATED
, &oi->
i_flags
);
120
}
121
122
static
inline
void
set_obj_created(
struct
exofs_i_info
*oi)
123
{
124
set_bit
(
OBJ_CREATED
, &oi->
i_flags
);
125
}
126
127
int
__exofs_wait_obj_created
(
struct
exofs_i_info
*oi);
128
static
inline
int
wait_obj_created(
struct
exofs_i_info
*oi)
129
{
130
if
(
likely
(obj_created(oi)))
131
return
0;
132
133
return
__exofs_wait_obj_created
(oi);
134
}
135
136
/*
137
* get to our inode from the vfs inode
138
*/
139
static
inline
struct
exofs_i_info
*exofs_i(
struct
inode
*
inode
)
140
{
141
return
container_of
(inode,
struct
exofs_i_info
,
vfs_inode
);
142
}
143
144
/*
145
* Maximum count of links to a file
146
*/
147
#define EXOFS_LINK_MAX 32000
148
149
/*************************
150
* function declarations *
151
*************************/
152
153
/* inode.c */
154
unsigned
exofs_max_io_pages
(
struct
ore_layout
*
layout
,
155
unsigned
expected_pages);
156
int
exofs_setattr
(
struct
dentry
*,
struct
iattr
*);
157
int
exofs_write_begin
(
struct
file
*
file
,
struct
address_space
*
mapping
,
158
loff_t
pos
,
unsigned
len,
unsigned
flags
,
159
struct
page
**pagep,
void
**fsdata);
160
extern
struct
inode
*
exofs_iget
(
struct
super_block
*,
unsigned
long
);
161
struct
inode
*
exofs_new_inode
(
struct
inode
*,
umode_t
);
162
extern
int
exofs_write_inode
(
struct
inode
*,
struct
writeback_control
*wbc);
163
extern
void
exofs_evict_inode
(
struct
inode
*);
164
165
/* dir.c: */
166
int
exofs_add_link
(
struct
dentry
*,
struct
inode
*);
167
ino_t
exofs_inode_by_name
(
struct
inode
*,
struct
dentry
*);
168
int
exofs_delete_entry
(
struct
exofs_dir_entry
*,
struct
page
*);
169
int
exofs_make_empty
(
struct
inode
*,
struct
inode
*);
170
struct
exofs_dir_entry
*
exofs_find_entry
(
struct
inode
*,
struct
dentry
*,
171
struct
page
**);
172
int
exofs_empty_dir
(
struct
inode
*);
173
struct
exofs_dir_entry
*
exofs_dotdot
(
struct
inode
*,
struct
page
**);
174
ino_t
exofs_parent_ino
(
struct
dentry
*
child
);
175
int
exofs_set_link
(
struct
inode
*,
struct
exofs_dir_entry
*,
struct
page
*,
176
struct
inode
*);
177
178
/* super.c */
179
void
exofs_make_credential
(
u8
cred_a[
OSD_CAP_LEN
],
180
const
struct
osd_obj_id
*obj);
181
int
exofs_sbi_write_stats
(
struct
exofs_sb_info
*sbi);
182
183
/* sys.c */
184
int
exofs_sysfs_init
(
void
);
185
void
exofs_sysfs_uninit
(
void
);
186
int
exofs_sysfs_sb_add
(
struct
exofs_sb_info
*sbi,
187
struct
exofs_dt_device_info
*dt_dev);
188
void
exofs_sysfs_sb_del
(
struct
exofs_sb_info
*sbi);
189
int
exofs_sysfs_odev_add
(
struct
exofs_dev
*edev,
190
struct
exofs_sb_info
*sbi);
191
void
exofs_sysfs_dbg_print
(
void
);
192
193
/*********************
194
* operation vectors *
195
*********************/
196
/* dir.c: */
197
extern
const
struct
file_operations
exofs_dir_operations
;
198
199
/* file.c */
200
extern
const
struct
inode_operations
exofs_file_inode_operations
;
201
extern
const
struct
file_operations
exofs_file_operations
;
202
203
/* inode.c */
204
extern
const
struct
address_space_operations
exofs_aops
;
205
206
/* namei.c */
207
extern
const
struct
inode_operations
exofs_dir_inode_operations
;
208
extern
const
struct
inode_operations
exofs_special_inode_operations
;
209
210
/* symlink.c */
211
extern
const
struct
inode_operations
exofs_symlink_inode_operations
;
212
extern
const
struct
inode_operations
exofs_fast_symlink_inode_operations
;
213
214
/* exofs_init_comps will initialize an ore_components device array
215
* pointing to a single ore_comp struct, and a round-robin view
216
* of the device table.
217
* The first device of each inode is the [inode->ino % num_devices]
218
* and the rest of the devices sequentially following where the
219
* first device is after the last device.
220
* It is assumed that the global device array at @sbi is twice
221
* bigger and that the device table repeats twice.
222
* See: exofs_read_lookup_dev_table()
223
*/
224
static
inline
void
exofs_init_comps(
struct
ore_components
*oc,
225
struct
ore_comp
*one_comp,
226
struct
exofs_sb_info
*sbi,
osd_id
oid
)
227
{
228
unsigned
dev_mod = (unsigned)oid, first_dev;
229
230
one_comp->
obj
.partition = sbi->
one_comp
.obj.partition;
231
one_comp->
obj
.id =
oid
;
232
exofs_make_credential
(one_comp->
cred
, &one_comp->
obj
);
233
234
oc->
first_dev
= 0;
235
oc->
numdevs
= sbi->
layout
.group_width * sbi->
layout
.mirrors_p1 *
236
sbi->
layout
.group_count;
237
oc->
single_comp
= EC_SINGLE_COMP;
238
oc->
comps
= one_comp;
239
240
/* Round robin device view of the table */
241
first_dev = (dev_mod * sbi->
layout
.mirrors_p1) % sbi->
oc
.numdevs;
242
oc->
ods
= &sbi->
oc
.ods[first_dev];
243
}
244
245
#endif
Generated on Thu Jan 10 2013 14:46:38 for Linux Kernel by
1.8.2