diff options
Diffstat (limited to 'fs/xfs/xfs_log_priv.h')
-rw-r--r-- | fs/xfs/xfs_log_priv.h | 179 |
1 files changed, 83 insertions, 96 deletions
diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index a884cea82fca..8f285149681f 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h | |||
@@ -1,33 +1,19 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. | 2 | * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. |
3 | * All Rights Reserved. | ||
3 | * | 4 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 5 | * This program is free software; you can redistribute it and/or |
5 | * under the terms of version 2 of the GNU General Public License as | 6 | * modify it under the terms of the GNU General Public License as |
6 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
7 | * | 8 | * |
8 | * This program is distributed in the hope that it would be useful, but | 9 | * This program is distributed in the hope that it would be useful, |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | * GNU General Public License for more details. | ||
11 | * | 13 | * |
12 | * Further, this software is distributed without any warranty that it is | 14 | * You should have received a copy of the GNU General Public License |
13 | * free of the rightful claim of any third person regarding infringement | 15 | * along with this program; if not, write the Free Software Foundation, |
14 | * or the like. Any license provided herein, whether implied or | 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
15 | * otherwise, applies only to this software file. Patent licenses, if | ||
16 | * any, provided herein do not apply to combinations of this program with | ||
17 | * other software, or any other product whatsoever. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License along | ||
20 | * with this program; if not, write the Free Software Foundation, Inc., 59 | ||
21 | * Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
22 | * | ||
23 | * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, | ||
24 | * Mountain View, CA 94043, or: | ||
25 | * | ||
26 | * http://www.sgi.com | ||
27 | * | ||
28 | * For further information regarding this notice, see: | ||
29 | * | ||
30 | * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ | ||
31 | */ | 17 | */ |
32 | #ifndef __XFS_LOG_PRIV_H__ | 18 | #ifndef __XFS_LOG_PRIV_H__ |
33 | #define __XFS_LOG_PRIV_H__ | 19 | #define __XFS_LOG_PRIV_H__ |
@@ -35,6 +21,7 @@ | |||
35 | struct xfs_buf; | 21 | struct xfs_buf; |
36 | struct ktrace; | 22 | struct ktrace; |
37 | struct log; | 23 | struct log; |
24 | struct xlog_ticket; | ||
38 | struct xfs_buf_cancel; | 25 | struct xfs_buf_cancel; |
39 | struct xfs_mount; | 26 | struct xfs_mount; |
40 | 27 | ||
@@ -120,77 +107,6 @@ struct xfs_mount; | |||
120 | ((i) >> 24) | 107 | ((i) >> 24) |
121 | #endif | 108 | #endif |
122 | 109 | ||
123 | #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XLOG_GRANT_SUB_SPACE) | ||
124 | void xlog_grant_sub_space(struct log *log, int bytes, int type); | ||
125 | #define XLOG_GRANT_SUB_SPACE(log,bytes,type) \ | ||
126 | xlog_grant_sub_space(log,bytes,type) | ||
127 | #else | ||
128 | #define XLOG_GRANT_SUB_SPACE(log,bytes,type) \ | ||
129 | { \ | ||
130 | if (type == 'w') { \ | ||
131 | (log)->l_grant_write_bytes -= (bytes); \ | ||
132 | if ((log)->l_grant_write_bytes < 0) { \ | ||
133 | (log)->l_grant_write_bytes += (log)->l_logsize; \ | ||
134 | (log)->l_grant_write_cycle--; \ | ||
135 | } \ | ||
136 | } else { \ | ||
137 | (log)->l_grant_reserve_bytes -= (bytes); \ | ||
138 | if ((log)->l_grant_reserve_bytes < 0) { \ | ||
139 | (log)->l_grant_reserve_bytes += (log)->l_logsize;\ | ||
140 | (log)->l_grant_reserve_cycle--; \ | ||
141 | } \ | ||
142 | } \ | ||
143 | } | ||
144 | #endif | ||
145 | #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XLOG_GRANT_ADD_SPACE) | ||
146 | void xlog_grant_add_space(struct log *log, int bytes, int type); | ||
147 | #define XLOG_GRANT_ADD_SPACE(log,bytes,type) \ | ||
148 | xlog_grant_add_space(log,bytes,type) | ||
149 | #else | ||
150 | #define XLOG_GRANT_ADD_SPACE(log,bytes,type) \ | ||
151 | { \ | ||
152 | if (type == 'w') { \ | ||
153 | (log)->l_grant_write_bytes += (bytes); \ | ||
154 | if ((log)->l_grant_write_bytes > (log)->l_logsize) { \ | ||
155 | (log)->l_grant_write_bytes -= (log)->l_logsize; \ | ||
156 | (log)->l_grant_write_cycle++; \ | ||
157 | } \ | ||
158 | } else { \ | ||
159 | (log)->l_grant_reserve_bytes += (bytes); \ | ||
160 | if ((log)->l_grant_reserve_bytes > (log)->l_logsize) { \ | ||
161 | (log)->l_grant_reserve_bytes -= (log)->l_logsize;\ | ||
162 | (log)->l_grant_reserve_cycle++; \ | ||
163 | } \ | ||
164 | } \ | ||
165 | } | ||
166 | #endif | ||
167 | #define XLOG_INS_TICKETQ(q,tic) \ | ||
168 | { \ | ||
169 | if (q) { \ | ||
170 | (tic)->t_next = (q); \ | ||
171 | (tic)->t_prev = (q)->t_prev; \ | ||
172 | (q)->t_prev->t_next = (tic); \ | ||
173 | (q)->t_prev = (tic); \ | ||
174 | } else { \ | ||
175 | (tic)->t_prev = (tic)->t_next = (tic); \ | ||
176 | (q) = (tic); \ | ||
177 | } \ | ||
178 | (tic)->t_flags |= XLOG_TIC_IN_Q; \ | ||
179 | } | ||
180 | #define XLOG_DEL_TICKETQ(q,tic) \ | ||
181 | { \ | ||
182 | if ((tic) == (tic)->t_next) { \ | ||
183 | (q) = NULL; \ | ||
184 | } else { \ | ||
185 | (q) = (tic)->t_next; \ | ||
186 | (tic)->t_next->t_prev = (tic)->t_prev; \ | ||
187 | (tic)->t_prev->t_next = (tic)->t_next; \ | ||
188 | } \ | ||
189 | (tic)->t_next = (tic)->t_prev = NULL; \ | ||
190 | (tic)->t_flags &= ~XLOG_TIC_IN_Q; \ | ||
191 | } | ||
192 | |||
193 | |||
194 | #define GRANT_LOCK(log) mutex_spinlock(&(log)->l_grant_lock) | 110 | #define GRANT_LOCK(log) mutex_spinlock(&(log)->l_grant_lock) |
195 | #define GRANT_UNLOCK(log, s) mutex_spinunlock(&(log)->l_grant_lock, s) | 111 | #define GRANT_UNLOCK(log, s) mutex_spinunlock(&(log)->l_grant_lock, s) |
196 | #define LOG_LOCK(log) mutex_spinlock(&(log)->l_icloglock) | 112 | #define LOG_LOCK(log) mutex_spinlock(&(log)->l_icloglock) |
@@ -576,6 +492,77 @@ typedef struct log { | |||
576 | * alignment mask */ | 492 | * alignment mask */ |
577 | } xlog_t; | 493 | } xlog_t; |
578 | 494 | ||
495 | #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) | ||
496 | |||
497 | #define XLOG_GRANT_SUB_SPACE(log,bytes,type) \ | ||
498 | xlog_grant_sub_space(log,bytes,type) | ||
499 | static inline void xlog_grant_sub_space(struct log *log, int bytes, int type) | ||
500 | { | ||
501 | if (type == 'w') { \ | ||
502 | (log)->l_grant_write_bytes -= (bytes); \ | ||
503 | if ((log)->l_grant_write_bytes < 0) { \ | ||
504 | (log)->l_grant_write_bytes += (log)->l_logsize; \ | ||
505 | (log)->l_grant_write_cycle--; \ | ||
506 | } \ | ||
507 | } else { \ | ||
508 | (log)->l_grant_reserve_bytes -= (bytes); \ | ||
509 | if ((log)->l_grant_reserve_bytes < 0) { \ | ||
510 | (log)->l_grant_reserve_bytes += (log)->l_logsize;\ | ||
511 | (log)->l_grant_reserve_cycle--; \ | ||
512 | } \ | ||
513 | } \ | ||
514 | } | ||
515 | |||
516 | #define XLOG_GRANT_ADD_SPACE(log,bytes,type) \ | ||
517 | xlog_grant_add_space(log,bytes,type) | ||
518 | static inline void | ||
519 | xlog_grant_add_space(struct log *log, int bytes, int type) | ||
520 | { | ||
521 | if (type == 'w') { \ | ||
522 | (log)->l_grant_write_bytes += (bytes); \ | ||
523 | if ((log)->l_grant_write_bytes > (log)->l_logsize) { \ | ||
524 | (log)->l_grant_write_bytes -= (log)->l_logsize; \ | ||
525 | (log)->l_grant_write_cycle++; \ | ||
526 | } \ | ||
527 | } else { \ | ||
528 | (log)->l_grant_reserve_bytes += (bytes); \ | ||
529 | if ((log)->l_grant_reserve_bytes > (log)->l_logsize) { \ | ||
530 | (log)->l_grant_reserve_bytes -= (log)->l_logsize;\ | ||
531 | (log)->l_grant_reserve_cycle++; \ | ||
532 | } \ | ||
533 | } \ | ||
534 | } | ||
535 | |||
536 | #define XLOG_INS_TICKETQ(q, tic) xlog_ins_ticketq(q, tic) | ||
537 | static inline void | ||
538 | xlog_ins_ticketq(struct xlog_ticket *q, struct xlog_ticket *tic) | ||
539 | { \ | ||
540 | if (q) { \ | ||
541 | (tic)->t_next = (q); \ | ||
542 | (tic)->t_prev = (q)->t_prev; \ | ||
543 | (q)->t_prev->t_next = (tic); \ | ||
544 | (q)->t_prev = (tic); \ | ||
545 | } else { \ | ||
546 | (tic)->t_prev = (tic)->t_next = (tic); \ | ||
547 | (q) = (tic); \ | ||
548 | } \ | ||
549 | (tic)->t_flags |= XLOG_TIC_IN_Q; \ | ||
550 | } | ||
551 | |||
552 | #define XLOG_DEL_TICKETQ(q, tic) xlog_del_ticketq(q, tic) | ||
553 | static inline void | ||
554 | xlog_del_ticketq(struct xlog_ticket *q, struct xlog_ticket *tic) | ||
555 | { \ | ||
556 | if ((tic) == (tic)->t_next) { \ | ||
557 | (q) = NULL; \ | ||
558 | } else { \ | ||
559 | (q) = (tic)->t_next; \ | ||
560 | (tic)->t_next->t_prev = (tic)->t_prev; \ | ||
561 | (tic)->t_prev->t_next = (tic)->t_next; \ | ||
562 | } \ | ||
563 | (tic)->t_next = (tic)->t_prev = NULL; \ | ||
564 | (tic)->t_flags &= ~XLOG_TIC_IN_Q; \ | ||
565 | } | ||
579 | 566 | ||
580 | /* common routines */ | 567 | /* common routines */ |
581 | extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); | 568 | extern xfs_lsn_t xlog_assign_tail_lsn(struct xfs_mount *mp); |