1 /* object based disk file system
3 * This code is issued under the GNU General Public License.
4 * See the file COPYING in this distribution
6 * Copyright (C), 1999, Stelias Computing Inc
14 #include <linux/obd_class.h>
15 #include <linux/list.h>
17 static inline struct obdo *obdo_fromid(struct lustre_handle *conn, obd_id id,
18 obd_mode mode, obd_flag valid)
26 RETURN(ERR_PTR(-ENOMEM));
32 if ((err = obd_getattr(conn, oa))) {
40 struct obdfs_inode_info {
42 struct list_head oi_inodes;
43 struct list_head oi_pages;
44 char oi_inline[OBD_INLINESZ];
47 struct obdfs_sb_info {
48 struct list_head osi_list; /* list of supers */
49 struct lustre_handle osi_conn;
50 struct super_block *osi_super;
51 struct obd_device *osi_obd;
52 ino_t osi_rootino; /* number of root inode */
53 int osi_minor; /* minor of /dev/obdX */
54 struct list_head osi_inodes; /* list of dirty inodes */
55 unsigned long osi_cache_count;
56 struct semaphore osi_list_mutex;
60 static inline struct obdfs_inode_info *obdfs_i2info(struct inode *inode)
62 return (struct obdfs_inode_info *)&(inode->u.generic_ip);
65 static inline int obdfs_has_inline(struct inode *inode)
67 return (obdfs_i2info(inode)->oi_flags & OBD_FL_INLINEDATA);
70 static void inline obdfs_from_inode(struct obdo *oa, struct inode *inode)
72 struct obdfs_inode_info *oinfo = obdfs_i2info(inode);
74 CDEBUG(D_INFO, "src inode %ld, dst obdo %ld valid 0x%08x\n",
75 inode->i_ino, (long)oa->o_id, oa->o_valid);
76 obdo_from_inode(oa, inode);
77 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
78 CDEBUG(D_INODE, "copying device %x from inode to obdo\n",
80 *((obd_rdev *)oa->o_inline) = kdev_t_to_nr(inode->i_rdev);
81 oa->o_obdflags |= OBD_FL_INLINEDATA;
82 oa->o_valid |= OBD_MD_FLINLINE;
83 } else if (obdfs_has_inline(inode)) {
84 CDEBUG(D_INODE, "copying inline data from inode to obdo\n");
85 memcpy(oa->o_inline, oinfo->oi_inline, OBD_INLINESZ);
86 oa->o_obdflags |= OBD_FL_INLINEDATA;
87 oa->o_valid |= OBD_MD_FLINLINE;
89 } /* obdfs_from_inode */
91 static void inline obdfs_to_inode(struct inode *inode, struct obdo *oa)
93 struct obdfs_inode_info *oinfo = obdfs_i2info(inode);
95 CDEBUG(D_INFO, "src obdo %ld valid 0x%08x, dst inode %ld\n",
96 (long)oa->o_id, oa->o_valid, inode->i_ino);
98 obdo_to_inode(inode, oa);
100 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
101 S_ISFIFO(inode->i_mode)) {
102 obd_rdev rdev = *((obd_rdev *)oa->o_inline);
103 init_special_inode(inode, inode->i_mode, rdev);
105 if (obdo_has_inline(oa)) {
106 CDEBUG(D_INFO, "copying inline from obdo to inode\n");
107 memcpy(oinfo->oi_inline, oa->o_inline, OBD_INLINESZ);
108 oinfo->oi_flags |= OBD_FL_INLINEDATA;
110 } /* obdfs_to_inode */
116 #warning "*** WARNING redefining OPS"
118 #define OPS(sb,op) ((struct obdfs_sb_info *)(& (sb)->u.generic_sbp))->osi_ops->o_ ## op
119 #define IOPS(inode,op) ((struct obdfs_sb_info *)(&(inode)->i_sb->u.generic_sbp))->osi_ops->o_ ## op
123 #warning "*** WARNING redefining ID"
125 #define ID(sb) (&((struct obdfs_sb_info *)( &(sb)->u.generic_sbp))->osi_conn)
126 #define IID(inode) (&((struct obdfs_sb_info *)( &(inode)->i_sb->u.generic_sbp))->osi_conn)
129 #define OBDFS_SUPER_MAGIC 0x4711
133 struct list_head rq_plist; /* linked list of req's */
134 unsigned long rq_jiffies;
135 struct page *rq_page; /* page to be written */
138 extern struct list_head obdfs_super_list; /* list of all OBDFS superblocks */
143 extern struct file_operations obdfs_dir_operations;
144 extern struct inode_operations obdfs_dir_inode_operations;
147 extern struct file_operations obdfs_file_operations;
148 extern struct inode_operations obdfs_file_inode_operations;
151 void obdfs_dequeue_pages(struct inode *inode);
152 int obdfs_flushd_init(void);
153 int obdfs_flushd_cleanup(void);
154 int obdfs_flush_reqs(struct list_head *inode_list, unsigned long check_time);
155 int obdfs_flush_dirty_pages(unsigned long check_time);
160 int obdfs_do_writepage(struct page *, int sync);
161 int obdfs_init_pgrqcache(void);
162 void obdfs_cleanup_pgrqcache(void);
163 inline void obdfs_pgrq_del(struct obdfs_pgrq *pgrq);
164 int obdfs_readpage(struct file *file, struct page *page);
165 int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to);
166 int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsigned to);
167 int obdfs_writepage(struct page *page);
168 struct page *obdfs_getpage(struct inode *inode, unsigned long offset,
169 int create, int locked);
170 int obdfs_write_one_page(struct file *file, struct page *page,
171 unsigned long offset, unsigned long bytes,
173 int obdfs_do_vec_wr(struct inode **inodes, obd_count num_io, obd_count num_oa,
174 struct obdo **obdos, obd_count *oa_bufs,
175 struct page **pages, char **bufs, obd_size *counts,
176 obd_off *offsets, obd_flag *flags);
177 void obdfs_truncate(struct inode *inode);
180 extern long obdfs_cache_count;
181 extern long obdfs_mutex_start;
184 extern struct inode_operations obdfs_fast_symlink_inode_operations;
185 extern struct inode_operations obdfs_symlink_inode_operations;
188 void obdfs_sysctl_init(void);
189 void obdfs_sysctl_clean(void);
191 static inline struct obdfs_sb_info *obdfs_i2sbi(struct inode *inode)
193 return (struct obdfs_sb_info *) &(inode->i_sb->u.generic_sbp);
196 static inline struct list_head *obdfs_iplist(struct inode *inode)
198 struct obdfs_inode_info *info = obdfs_i2info(inode);
200 return &info->oi_pages;
203 static inline struct list_head *obdfs_islist(struct inode *inode)
205 struct obdfs_inode_info *info = obdfs_i2info(inode);
207 return &info->oi_inodes;
210 static inline struct list_head *obdfs_slist(struct inode *inode)
212 struct obdfs_sb_info *sbi = obdfs_i2sbi(inode);
214 return &sbi->osi_inodes;
217 static void inline obdfs_set_size (struct inode *inode, obd_size size)
219 inode->i_size = size;
220 inode->i_blocks = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
221 inode->i_sb->s_blocksize_bits;
222 } /* obdfs_set_size */