1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * lustre/smfs/smfs_internal.h
5 * Lustre filesystem abstraction routines
7 * Copyright (C) 2004 Cluster File Systems, Inc.
9 * This file is part of Lustre, http://www.lustre.org.
11 * Lustre is free software; you can redistribute it and/or
12 * modify it under the terms of version 2 of the GNU General Public
13 * License as published by the Free Software Foundation.
15 * Lustre is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with Lustre; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #ifndef __LINUX_SMFS_H
25 #define __LINUX_SMFS_H
27 //#include <linux/lustre_fsfilt.h>
28 #define SMFSDEV_NAME "/dev/smfsconf"
29 #define SMFS_PSDEV_MINOR 250
30 #define SMFS_PSDEV_MAJOR 10
35 struct list_head list;
38 struct smfs_control_device {
39 struct list_head smfs_dev_list;
42 #define SMFS_TYPE "smfs"
43 #define IOC_SMFS_START _IOWR('s', 41, long)
44 #define IOC_SMFS_STOP _IOWR('s', 42, long)
45 #define IOC_SMFS_REINT _IOWR('s', 43, long)
46 #define IOC_SMFS_UNDO _IOWR('s', 44, long)
50 #define SB_OPS_CHECK 0x1
51 #define INODE_OPS_CHECK 0x2
52 #define FILE_OPS_CHECK 0x4
53 #define DENTRY_OPS_CHECK 0x8
54 #define DEV_OPS_CHECK 0x10
55 #define SYMLINK_OPS_CHECK 0x20
56 #define DIR_OPS_CHECK 0x40
58 #define KML_LOG_NAME "kml_rec"
60 #define MYPATHLEN(buffer, path) ((buffer) + PAGE_SIZE - (path))
63 #define PACK_KML_REC_INIT(buffer, op_code) \
65 int opcode = op_code; \
66 memcpy(buffer, &opcode, sizeof(opcode)); \
67 buffer += sizeof(opcode); \
71 extern int init_smfs_proc_sys(void);
73 extern int get_opt(struct option **option, char **pos);
74 extern void cleanup_option(void);
75 extern int init_option(char *data);
77 extern void sm_set_inode_ops(struct inode *cache_inode, struct inode *inode);
78 extern void sm_set_sb_ops(struct super_block *cache_sb, struct super_block *sb);
79 extern void init_smfs_cache(void);
80 extern void cleanup_smfs_cache(void);
81 extern void sm_set_journal_ops(struct super_block *sb, char *cache_type);
82 extern int smfs_init_sm_ops(struct smfs_super_info *smb);
83 extern void smfs_cleanup_sm_ops(struct smfs_super_info *smb);
84 static inline struct super_operations *cache_sops(struct smfs_super_info *smb)
86 return &smb->sm_ops->sm_sb_ops;
88 static inline struct inode_operations *cache_diops(struct smfs_super_info *smb)
90 return &smb->sm_ops->sm_dir_iops;
92 static inline struct inode_operations *cache_fiops(struct smfs_super_info *smb)
94 return &smb->sm_ops->sm_file_iops;
96 static inline struct inode_operations *cache_siops(struct smfs_super_info *smb)
98 return &smb->sm_ops->sm_sym_iops;
100 static inline struct file_operations *cache_dfops(struct smfs_super_info *smb)
102 return &smb->sm_ops->sm_dir_fops;
104 static inline struct file_operations *cache_ffops(struct smfs_super_info *smb)
106 return &smb->sm_ops->sm_file_fops;
108 static inline struct file_operations *cache_sfops(struct smfs_super_info *smb)
110 return &smb->sm_ops->sm_sym_fops;
112 static inline struct dentry_operations *cache_dops(struct smfs_super_info *smb)
114 return &smb->sm_ops->sm_dentry_ops;
116 static inline struct journal_operations *journal_ops(struct smfs_super_info *smb)
118 return &smb->sm_ops->sm_journal_ops;
121 struct smfs_hook_ops *smfs_alloc_hook_ops(char *name,
122 smfs_hook_func pre_hook,
123 smfs_hook_func post_hook);
125 void smfs_free_hook_ops(struct smfs_hook_ops *hops);
126 int smfs_register_hook_ops(struct smfs_super_info *smb,
127 struct smfs_hook_ops *smh_ops);
129 struct smfs_hook_ops *smfs_unregister_hook_ops(struct smfs_super_info *smb,
132 void smfs_put_super(struct super_block *sb);
133 int smfs_fill_super(struct super_block *sb, void *data, int silent);
135 void smfs_cleanup_hooks(struct smfs_super_info *smb);
137 extern int sm_debug_level;
138 extern int sm_inodes;
139 extern long sm_kmemory;
142 extern struct inode_operations smfs_dir_iops;
143 extern struct file_operations smfs_dir_fops;
145 extern struct inode_operations smfs_file_iops;
146 extern struct file_operations smfs_file_fops;
147 extern int smfs_ioctl(struct inode * inode, struct file * filp,
148 unsigned int cmd, unsigned long arg);
149 extern int smfs_fsync(struct file * file, struct dentry *dentry, int datasync);
150 extern int smfs_setattr(struct dentry *dentry, struct iattr *attr);
151 extern int smfs_setxattr(struct dentry *dentry, const char *name,
152 const void *value, size_t size, int flags);
153 extern int smfs_getxattr(struct dentry *dentry, const char *name, void *buffer,
155 extern ssize_t smfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
156 extern int smfs_removexattr(struct dentry *dentry, const char *name);
157 extern int smfs_open(struct inode * inode, struct file * filp);
158 extern int smfs_release(struct inode * inode, struct file * filp);
160 struct inode *smfs_get_inode(struct super_block *sb, ino_t hash,
161 struct inode *dir, int index);
163 extern struct super_operations smfs_super_ops;
165 struct smfs_iget_args {
166 struct inode *s_inode;
171 extern struct inode_operations smfs_sym_iops;
172 extern struct file_operations smfs_sym_fops;
174 void *smfs_trans_start(struct inode *inode, int op, void *desc_private);
175 void smfs_trans_commit(struct inode *inode, void *handle, int force_sync);
177 extern int smfs_post_rec_write(struct inode *dir, struct dentry *dentry,
178 void *data1, void *data2);
179 extern int smfs_post_rec_setattr(struct inode *dir, struct dentry *dentry,
180 void *data1, void *data2);
181 extern int smfs_post_rec_create(struct inode *dir, struct dentry *dentry,
182 void *data1, void *data2);
184 int smfs_do_rec(struct inode *inode);
185 int smfs_rec_cleanup(struct smfs_super_info *sb);
186 int smfs_rec_init(struct super_block *sb);
188 extern int smfs_rec_unpack(struct smfs_proc_args *args, char *record,
189 char **pbuf, int *opcode);
190 extern int smfs_process_rec(struct super_block *sb, int count,
191 char *dir, int flags);
194 int mds_rec_pack_init(struct smfs_super_info *smb);
196 int ost_rec_pack_init(struct smfs_super_info *smb);
199 extern int smfs_llog_setup(struct super_block *sb, struct vfsmount *mnt);
200 extern int smfs_llog_cleanup(struct super_block *sb);
201 extern int smfs_llog_add_rec(struct smfs_super_info * sinfo, void *data,
204 extern int init_smfs_psdev(void);
205 extern void smfs_cleanup_psdev(void);
209 extern int do_cache_manage;
210 struct cache_purge_queue {
211 wait_queue_head_t cpq_waitq;
212 struct super_block *cpq_sb;
213 struct llog_handle *cpq_loghandle;
215 struct completion cpq_comp;
218 #define CACHE_SPACE_INSERT 0x1
219 #define CACHE_SPACE_DELETE 0x2
220 #define CACHE_SPACE_COMMIT 0x4
222 #define CACHE_LRU_LOG "CACHE_LRU_LIST"
224 extern int smfs_cache_hook(struct inode *inode);
225 extern void cache_space_pre(struct inode *inode, int op);
226 extern int cache_space_post(int op, void *handle, struct inode *old_dir,
227 struct dentry *old_dentry, struct inode *new_dir,
228 struct dentry *new_dentry);
230 int cache_space_hook_setup(struct super_block *);
231 int cache_space_hook_cleanup(void);
232 int cache_space_hook_init(struct super_block *sb);
233 int cache_space_hook_exit(struct smfs_super_info *smfs_info);
235 #define XATTR_SMFS_HOARD_MARK "hoard"
236 #define XATTR_SMFS_CACHE_LOGCOOKIE "cache"
237 #define XATTR_SMFS_ACTIVE_ENTRY "entry"
240 static inline int set_hoard_priority(struct inode *inode, void *handle,
243 struct fsfilt_operations *fsops = I2CSB(inode)->sm_fsfilt;
246 rc = fsops->fs_set_xattr(inode, handle, XATTR_SMFS_HOARD_MARK,
247 hoard, sizeof(__u32));
251 static inline int get_hoard_priority(struct inode *inode, __u32 *hoard)
253 struct fsfilt_operations *fsops = I2CSB(inode)->sm_fsfilt;
256 rc = fsops->fs_get_xattr(inode, XATTR_SMFS_HOARD_MARK,
257 hoard, sizeof(__u32));
261 static inline int set_active_entry(struct inode *dir, __u64 *active_entry,
264 struct fsfilt_operations *fsops = I2CSB(dir)->sm_fsfilt;
266 *active_entry = cpu_to_le64(*active_entry);
267 rc = fsops->fs_set_xattr(dir, handle, XATTR_SMFS_ACTIVE_ENTRY,
268 active_entry, sizeof(__u64));
271 static inline int get_active_entry(struct inode *dir, __u64 *active_entry)
273 struct fsfilt_operations *fsops = I2CSB(dir)->sm_fsfilt;
274 int rc = fsops->fs_get_xattr(dir, XATTR_SMFS_ACTIVE_ENTRY,
275 active_entry, sizeof(__u64));
276 *active_entry = le64_to_cpu(*active_entry);
281 #define HOOK_CREATE 1
282 #define HOOK_LOOKUP 2
284 #define HOOK_UNLINK 4
285 #define HOOK_SYMLINK 5
289 #define HOOK_RENAME 9
290 #define HOOK_SETATTR 10
291 #define HOOK_WRITE 11
292 #define HOOK_READDIR 12
298 #define SMFS_HOOK(inode, dentry, data1, data2, op, handle, flag, rc, label) \
300 LASSERT(inode->i_sb); \
302 struct smfs_super_info *smb = S2SMI(inode->i_sb); \
303 struct list_head *hlist = &smb->smsi_hook_list; \
304 struct list_head *p; \
306 list_for_each(p, hlist) { \
307 struct smfs_hook_ops *hops; \
309 hops = list_entry(p, typeof(*hops), smh_list); \
310 if (flag == PRE_HOOK && hops->smh_pre_op) \
311 rc = hops->smh_pre_op(inode, dentry, data1, \
312 data2, op, handle); \
313 else if (flag == POST_HOOK && hops->smh_post_op) \
314 rc = hops->smh_post_op(inode, dentry, data1, \
315 data2, op, handle); \
324 #define SMFS_GET_INODE(sb, cache_inode, dir, inode, rc, label) \
326 LASSERT(cache_inode); \
327 inode = smfs_get_inode(sb, cache_inode->i_ino, dir, 0); \
330 GOTO(label, rc = -ENOENT); \
335 int smfs_cow_init(struct super_block *sb);
336 int smfs_cow_cleanup(struct smfs_super_info *smb);
337 int smfs_snap_test_inode(struct inode *inode, void *args);
339 #define SMFS_PRE_COW(dir, dentry, new_dir, new_dentry, op, name, rc, label)
342 #endif /* __LINUX_SMFS_H */