4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
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.
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).
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
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
27 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
30 * Copyright (c) 2012, Intel Corporation.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
36 * lustre/include/linux/lustre_fsfilt.h
38 * Filesystem interface helper.
41 #ifndef _LINUX_LUSTRE_FSFILT_H
42 #define _LINUX_LUSTRE_FSFILT_H
44 #ifndef _LUSTRE_FSFILT_H
45 #error Do not #include this file directly. #include <lustre_fsfilt.h> instead
51 #include <obd_class.h>
53 typedef void (*fsfilt_cb_t)(struct obd_device *obd, __u64 last_rcvd,
54 void *data, int error);
56 struct fsfilt_operations {
58 cfs_module_t *fs_owner;
60 char *(* fs_getlabel)(struct super_block *sb);
61 void *(* fs_start)(struct inode *inode, int op, void *desc_private,
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,
68 int (* fs_write_record)(struct file *, void *, int size, loff_t *,
70 int (* fs_read_record)(struct file *, void *, int size, loff_t *);
71 int (* fs_setup)(struct super_block *sb);
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);
79 static inline char *fsfilt_get_label(struct obd_device *obd,
80 struct super_block *sb)
82 if (obd->obd_fsops->fs_getlabel == NULL)
84 if (obd->obd_fsops->fs_getlabel(sb)[0] == '\0')
87 return obd->obd_fsops->fs_getlabel(sb);
90 #define FSFILT_OP_UNLINK 1
91 #define FSFILT_OP_CANCEL_UNLINK 10
93 #define __fsfilt_check_slow(obd, start, msg) \
95 if (cfs_time_before(jiffies, start + 15 * CFS_HZ)) \
97 else if (cfs_time_before(jiffies, start + 30 * CFS_HZ)) \
98 CDEBUG(D_VFSTRACE, "%s: slow %s %lus\n", obd->obd_name, \
99 msg, (jiffies-start) / CFS_HZ); \
100 else if (cfs_time_before(jiffies, start + DISK_TIMEOUT * CFS_HZ)) \
101 CWARN("%s: slow %s %lus\n", obd->obd_name, msg, \
102 (jiffies - start) / CFS_HZ); \
104 CERROR("%s: slow %s %lus\n", obd->obd_name, msg, \
105 (jiffies - start) / CFS_HZ); \
108 #define fsfilt_check_slow(obd, start, msg) \
110 __fsfilt_check_slow(obd, start, msg); \
114 static inline void *fsfilt_start_log(struct obd_device *obd,
115 struct inode *inode, int op,
116 struct obd_trans_info *oti, int logs)
118 unsigned long now = jiffies;
119 void *parent_handle = oti ? oti->oti_handle : NULL;
122 handle = obd->obd_fsops->fs_start(inode, op, parent_handle, logs);
123 CDEBUG(D_INFO, "started handle %p (%p)\n", handle, parent_handle);
126 if (parent_handle == NULL) {
127 oti->oti_handle = handle;
128 } else if (handle != parent_handle) {
129 CERROR("mismatch: parent %p, handle %p, oti %p\n",
130 parent_handle, handle, oti);
134 fsfilt_check_slow(obd, now, "journal start");
138 static inline int fsfilt_commit(struct obd_device *obd, struct inode *inode,
139 void *handle, int force_sync)
141 unsigned long now = jiffies;
142 int rc = obd->obd_fsops->fs_commit(inode, handle, force_sync);
143 CDEBUG(D_INFO, "committing handle %p\n", handle);
145 fsfilt_check_slow(obd, now, "journal start");
150 static inline int fsfilt_map_inode_pages(struct obd_device *obd,
152 struct page **page, int pages,
153 unsigned long *blocks, int *created,
154 int create, struct mutex *mutex)
156 return obd->obd_fsops->fs_map_inode_pages(inode, page, pages, blocks,
157 created, create, mutex);
160 static inline int fsfilt_read_record(struct obd_device *obd, struct file *file,
161 void *buf, loff_t size, loff_t *offs)
163 return obd->obd_fsops->fs_read_record(file, buf, size, offs);
166 static inline int fsfilt_write_record(struct obd_device *obd, struct file *file,
167 void *buf, loff_t size, loff_t *offs,
170 return obd->obd_fsops->fs_write_record(file, buf, size,offs,force_sync);
173 static inline int fsfilt_setup(struct obd_device *obd, struct super_block *fs)
175 if (obd->obd_fsops->fs_setup)
176 return obd->obd_fsops->fs_setup(fs);
182 #endif /* __KERNEL__ */