1/* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ 9 10#ifndef __LOPS_DOT_H__ 11#define __LOPS_DOT_H__ 12 13#include <linux/list.h> 14#include "incore.h" 15 16extern const struct gfs2_log_operations gfs2_glock_lops; 17extern const struct gfs2_log_operations gfs2_buf_lops; 18extern const struct gfs2_log_operations gfs2_revoke_lops; 19extern const struct gfs2_log_operations gfs2_rg_lops; 20extern const struct gfs2_log_operations gfs2_databuf_lops; 21 22extern const struct gfs2_log_operations *gfs2_log_ops[]; 23 24static inline void lops_init_le(struct gfs2_log_element *le, 25 const struct gfs2_log_operations *lops) 26{ 27 INIT_LIST_HEAD(&le->le_list); 28 le->le_ops = lops; 29} 30 31static inline void lops_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le) 32{ 33 if (le->le_ops->lo_add) 34 le->le_ops->lo_add(sdp, le); 35} 36 37static inline void lops_incore_commit(struct gfs2_sbd *sdp, 38 struct gfs2_trans *tr) 39{ 40 int x; 41 for (x = 0; gfs2_log_ops[x]; x++) 42 if (gfs2_log_ops[x]->lo_incore_commit) 43 gfs2_log_ops[x]->lo_incore_commit(sdp, tr); 44} 45 46static inline void lops_before_commit(struct gfs2_sbd *sdp) 47{ 48 int x; 49 for (x = 0; gfs2_log_ops[x]; x++) 50 if (gfs2_log_ops[x]->lo_before_commit) 51 gfs2_log_ops[x]->lo_before_commit(sdp); 52} 53 54static inline void lops_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai) 55{ 56 int x; 57 for (x = 0; gfs2_log_ops[x]; x++) 58 if (gfs2_log_ops[x]->lo_after_commit) 59 gfs2_log_ops[x]->lo_after_commit(sdp, ai); 60} 61 62static inline void lops_before_scan(struct gfs2_jdesc *jd, 63 struct gfs2_log_header_host *head, 64 unsigned int pass) 65{ 66 int x; 67 for (x = 0; gfs2_log_ops[x]; x++) 68 if (gfs2_log_ops[x]->lo_before_scan) 69 gfs2_log_ops[x]->lo_before_scan(jd, head, pass); 70} 71 72static inline int lops_scan_elements(struct gfs2_jdesc *jd, unsigned int start, 73 struct gfs2_log_descriptor *ld, 74 __be64 *ptr, 75 unsigned int pass) 76{ 77 int x, error; 78 for (x = 0; gfs2_log_ops[x]; x++) 79 if (gfs2_log_ops[x]->lo_scan_elements) { 80 error = gfs2_log_ops[x]->lo_scan_elements(jd, start, 81 ld, ptr, pass); 82 if (error) 83 return error; 84 } 85 86 return 0; 87} 88 89static inline void lops_after_scan(struct gfs2_jdesc *jd, int error, 90 unsigned int pass) 91{ 92 int x; 93 for (x = 0; gfs2_log_ops[x]; x++) 94 if (gfs2_log_ops[x]->lo_before_scan) 95 gfs2_log_ops[x]->lo_after_scan(jd, error, pass); 96} 97 98#endif /* __LOPS_DOT_H__ */ 99