Whamcloud - gitweb
LU-2158 fsfilt: Remove bits from fsfilt_ext3.c/lustre_fsfilt.h
[fs/lustre-release.git] / lustre / include / linux / lustre_fsfilt.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2012, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * lustre/include/linux/lustre_fsfilt.h
37  *
38  * Filesystem interface helper.
39  */
40
41 #ifndef _LINUX_LUSTRE_FSFILT_H
42 #define _LINUX_LUSTRE_FSFILT_H
43
44 #ifndef _LUSTRE_FSFILT_H
45 #error Do not #include this file directly. #include <lustre_fsfilt.h> instead
46 #endif
47
48 #ifdef __KERNEL__
49
50 #include <obd.h>
51 #include <obd_class.h>
52
53 typedef void (*fsfilt_cb_t)(struct obd_device *obd, __u64 last_rcvd,
54                             void *data, int error);
55
56 struct fsfilt_operations {
57         cfs_list_t fs_list;
58         cfs_module_t *fs_owner;
59         char   *fs_type;
60         char   *(* fs_getlabel)(struct super_block *sb);
61         void   *(* fs_start)(struct inode *inode, int op, void *desc_private,
62                              int logs);
63         int     (* fs_commit)(struct inode *inode, void *handle,int force_sync);
64         int     (* fs_map_inode_pages)(struct inode *inode, struct page **page,
65                                        int pages, unsigned long *blocks,
66                                        int *created, int create,
67                                        struct mutex *sem);
68         int     (* fs_write_record)(struct file *, void *, int size, loff_t *,
69                                     int force_sync);
70         int     (* fs_read_record)(struct file *, void *, int size, loff_t *);
71         int     (* fs_setup)(struct super_block *sb);
72 };
73
74 extern int fsfilt_register_ops(struct fsfilt_operations *fs_ops);
75 extern void fsfilt_unregister_ops(struct fsfilt_operations *fs_ops);
76 extern struct fsfilt_operations *fsfilt_get_ops(const char *type);
77 extern void fsfilt_put_ops(struct fsfilt_operations *fs_ops);
78
79 static inline char *fsfilt_get_label(struct obd_device *obd,
80                                      struct super_block *sb)
81 {
82         if (obd->obd_fsops->fs_getlabel == NULL)
83                 return NULL;
84         if (obd->obd_fsops->fs_getlabel(sb)[0] == '\0')
85                 return NULL;
86
87         return obd->obd_fsops->fs_getlabel(sb);
88 }
89
90 #define FSFILT_OP_UNLINK                1
91 #define FSFILT_OP_RMDIR                 2
92 #define FSFILT_OP_RENAME                3
93 #define FSFILT_OP_CREATE                4
94 #define FSFILT_OP_MKDIR                 5
95 #define FSFILT_OP_SYMLINK               6
96 #define FSFILT_OP_MKNOD                 7
97 #define FSFILT_OP_SETATTR               8
98 #define FSFILT_OP_LINK                  9
99 #define FSFILT_OP_CANCEL_UNLINK         10
100
101 #define __fsfilt_check_slow(obd, start, msg)                              \
102 do {                                                                      \
103         if (cfs_time_before(jiffies, start + 15 * CFS_HZ))                \
104                 break;                                                    \
105         else if (cfs_time_before(jiffies, start + 30 * CFS_HZ))           \
106                 CDEBUG(D_VFSTRACE, "%s: slow %s %lus\n", obd->obd_name,   \
107                        msg, (jiffies-start) / CFS_HZ);                    \
108         else if (cfs_time_before(jiffies, start + DISK_TIMEOUT * CFS_HZ)) \
109                 CWARN("%s: slow %s %lus\n", obd->obd_name, msg,           \
110                       (jiffies - start) / CFS_HZ);                        \
111         else                                                              \
112                 CERROR("%s: slow %s %lus\n", obd->obd_name, msg,          \
113                        (jiffies - start) / CFS_HZ);                       \
114 } while (0)
115
116 #define fsfilt_check_slow(obd, start, msg)              \
117 do {                                                    \
118         __fsfilt_check_slow(obd, start, msg);           \
119         start = jiffies;                                \
120 } while (0)
121
122 static inline void *fsfilt_start_log(struct obd_device *obd,
123                                      struct inode *inode, int op,
124                                      struct obd_trans_info *oti, int logs)
125 {
126         unsigned long now = jiffies;
127         void *parent_handle = oti ? oti->oti_handle : NULL;
128         void *handle;
129
130         handle = obd->obd_fsops->fs_start(inode, op, parent_handle, logs);
131         CDEBUG(D_INFO, "started handle %p (%p)\n", handle, parent_handle);
132
133         if (oti != NULL) {
134                 if (parent_handle == NULL) {
135                         oti->oti_handle = handle;
136                 } else if (handle != parent_handle) {
137                         CERROR("mismatch: parent %p, handle %p, oti %p\n",
138                                parent_handle, handle, oti);
139                         LBUG();
140                 }
141         }
142         fsfilt_check_slow(obd, now, "journal start");
143         return handle;
144 }
145
146 static inline int fsfilt_commit(struct obd_device *obd, struct inode *inode,
147                                 void *handle, int force_sync)
148 {
149         unsigned long now = jiffies;
150         int rc = obd->obd_fsops->fs_commit(inode, handle, force_sync);
151         CDEBUG(D_INFO, "committing handle %p\n", handle);
152
153         fsfilt_check_slow(obd, now, "journal start");
154
155         return rc;
156 }
157
158 static inline int fsfilt_map_inode_pages(struct obd_device *obd,
159                                          struct inode *inode,
160                                          struct page **page, int pages,
161                                          unsigned long *blocks, int *created,
162                                          int create, struct mutex *mutex)
163 {
164         return obd->obd_fsops->fs_map_inode_pages(inode, page, pages, blocks,
165                                                   created, create, mutex);
166 }
167
168 static inline int fsfilt_read_record(struct obd_device *obd, struct file *file,
169                                      void *buf, loff_t size, loff_t *offs)
170 {
171         return obd->obd_fsops->fs_read_record(file, buf, size, offs);
172 }
173
174 static inline int fsfilt_write_record(struct obd_device *obd, struct file *file,
175                                       void *buf, loff_t size, loff_t *offs,
176                                       int force_sync)
177 {
178         return obd->obd_fsops->fs_write_record(file, buf, size,offs,force_sync);
179 }
180
181 static inline int fsfilt_setup(struct obd_device *obd, struct super_block *fs)
182 {
183         if (obd->obd_fsops->fs_setup)
184                 return obd->obd_fsops->fs_setup(fs);
185         return 0;
186 }
187
188
189
190 #endif /* __KERNEL__ */
191
192 #endif