-#define CACHE_HOOK_CREATE 1
-#define CACHE_HOOK_LOOKUP 2
-#define CACHE_HOOK_LINK 3
-#define CACHE_HOOK_UNLINK 4
-#define CACHE_HOOK_SYMLINK 5
-#define CACHE_HOOK_MKDIR 6
-#define CACHE_HOOK_RMDIR 7
-#define CACHE_HOOK_MKNOD 8
-#define CACHE_HOOK_RENAME 9
-
-#define CACHE_HOOK_MAX 9
-
-#define SMFS_CACHE_HOOK_PRE(op, handle, dir) \
-{ \
- if (smfs_cache_hook(dir)) { \
- LASSERT(handle != NULL); \
- CDEBUG(D_INODE, "cache hook pre: op %d, dir %lu\n", \
- op, dir->i_ino); \
- cache_space_pre(dir, op); \
- } \
-}
+#define PRE_HOOK 0
+#define POST_HOOK 1
+#define SMFS_HOOK(inode, dentry, data1, data2, op, handle, flag, rc, label) \
+do { \
+ LASSERT(inode->i_sb); \
+ if (!rc) { \
+ struct smfs_super_info *smb = S2SMI(inode->i_sb); \
+ struct list_head *hlist = &smb->smsi_hook_list; \
+ struct list_head *p; \
+ \
+ list_for_each(p, hlist) { \
+ struct smfs_hook_ops *hops; \
+ \
+ hops = list_entry(p, typeof(*hops), smh_list); \
+ if (flag == PRE_HOOK && hops->smh_pre_op) \
+ rc = hops->smh_pre_op(inode, dentry, data1, \
+ data2, op, handle); \
+ else if (flag == POST_HOOK && hops->smh_post_op) \
+ rc = hops->smh_post_op(inode, dentry, data1, \
+ data2, op, handle); \
+ if (rc) \
+ break; \
+ } \
+ } \
+ if (rc) \
+ GOTO(label, rc); \
+} while(0) \
+
+#define SMFS_GET_INODE(sb, cache_inode, dir, inode, rc, label) \
+do { \
+ LASSERT(cache_inode); \
+ inode = smfs_get_inode(sb, cache_inode->i_ino, dir, 0); \
+ iput(cache_inode); \
+ if (!inode) \
+ GOTO(label, rc = -ENOENT); \
+} while(0)