1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <linux/fs.h>
35#include <linux/time.h>
36#include "common.h"
37
38#ifndef __EXOFS_H__
39#define __EXOFS_H__
40
41#define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a)
42
43#ifdef CONFIG_EXOFS_DEBUG
44#define EXOFS_DBGMSG(fmt, a...) \
45 printk(KERN_NOTICE "exofs @%s:%d: " fmt, __func__, __LINE__, ##a)
46#else
47#define EXOFS_DBGMSG(fmt, a...) \
48 do { if (0) printk(fmt, ##a); } while (0)
49#endif
50
51
52#define _LLU(x) (unsigned long long)(x)
53
54
55
56
57struct exofs_sb_info {
58 struct osd_dev *s_dev;
59 osd_id s_pid;
60 int s_timeout;
61 uint64_t s_nextid;
62 uint32_t s_numfiles;
63 spinlock_t s_next_gen_lock;
64 u32 s_next_generation;
65 atomic_t s_curr_pending;
66 uint8_t s_cred[OSD_CAP_LEN];
67};
68
69
70
71
72struct exofs_i_info {
73 unsigned long i_flags;
74 uint32_t i_data[EXOFS_IDATA];
75 uint32_t i_dir_start_lookup;
76 wait_queue_head_t i_wq;
77 uint64_t i_commit_size;
78 uint8_t i_cred[OSD_CAP_LEN];
79 struct inode vfs_inode;
80};
81
82
83
84
85#define OBJ_2BCREATED 0
86#define OBJ_CREATED 1
87
88static inline int obj_2bcreated(struct exofs_i_info *oi)
89{
90 return test_bit(OBJ_2BCREATED, &oi->i_flags);
91}
92
93static inline void set_obj_2bcreated(struct exofs_i_info *oi)
94{
95 set_bit(OBJ_2BCREATED, &oi->i_flags);
96}
97
98static inline int obj_created(struct exofs_i_info *oi)
99{
100 return test_bit(OBJ_CREATED, &oi->i_flags);
101}
102
103static inline void set_obj_created(struct exofs_i_info *oi)
104{
105 set_bit(OBJ_CREATED, &oi->i_flags);
106}
107
108int __exofs_wait_obj_created(struct exofs_i_info *oi);
109static inline int wait_obj_created(struct exofs_i_info *oi)
110{
111 if (likely(obj_created(oi)))
112 return 0;
113
114 return __exofs_wait_obj_created(oi);
115}
116
117
118
119
120static inline struct exofs_i_info *exofs_i(struct inode *inode)
121{
122 return container_of(inode, struct exofs_i_info, vfs_inode);
123}
124
125
126
127
128#define EXOFS_LINK_MAX 32000
129
130
131
132
133
134void exofs_truncate(struct inode *inode);
135int exofs_setattr(struct dentry *, struct iattr *);
136int exofs_write_begin(struct file *file, struct address_space *mapping,
137 loff_t pos, unsigned len, unsigned flags,
138 struct page **pagep, void **fsdata);
139extern struct inode *exofs_iget(struct super_block *, unsigned long);
140struct inode *exofs_new_inode(struct inode *, int);
141extern int exofs_write_inode(struct inode *, int);
142extern void exofs_delete_inode(struct inode *);
143
144
145int exofs_add_link(struct dentry *, struct inode *);
146ino_t exofs_inode_by_name(struct inode *, struct dentry *);
147int exofs_delete_entry(struct exofs_dir_entry *, struct page *);
148int exofs_make_empty(struct inode *, struct inode *);
149struct exofs_dir_entry *exofs_find_entry(struct inode *, struct dentry *,
150 struct page **);
151int exofs_empty_dir(struct inode *);
152struct exofs_dir_entry *exofs_dotdot(struct inode *, struct page **);
153ino_t exofs_parent_ino(struct dentry *child);
154int exofs_set_link(struct inode *, struct exofs_dir_entry *, struct page *,
155 struct inode *);
156
157
158int exofs_sync_fs(struct super_block *sb, int wait);
159
160
161
162
163
164extern const struct file_operations exofs_dir_operations;
165
166
167extern const struct inode_operations exofs_file_inode_operations;
168extern const struct file_operations exofs_file_operations;
169
170
171extern const struct address_space_operations exofs_aops;
172
173
174extern const struct inode_operations exofs_dir_inode_operations;
175extern const struct inode_operations exofs_special_inode_operations;
176
177
178extern const struct inode_operations exofs_symlink_inode_operations;
179extern const struct inode_operations exofs_fast_symlink_inode_operations;
180
181#endif
182