1 /* -*- mode: c; c-basic-offset: 8; -*- 2 * vim: noexpandtab sw=8 ts=8 sts=0: 3 * 4 * Copyright (C) 2002, 2004, 2005 Oracle. All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public 17 * License along with this program; if not, write to the 18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 * Boston, MA 021110-1307, USA. 20 */ 21 22 #ifndef OCFS2_AOPS_H 23 #define OCFS2_AOPS_H 24 25 int ocfs2_prepare_write_nolock(struct inode *inode, struct page *page, 26 unsigned from, unsigned to); 27 28 handle_t *ocfs2_start_walk_page_trans(struct inode *inode, 29 struct page *page, 30 unsigned from, 31 unsigned to); 32 33 int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, 34 struct inode *inode, unsigned int from, 35 unsigned int to, int new); 36 37 int walk_page_buffers( handle_t *handle, 38 struct buffer_head *head, 39 unsigned from, 40 unsigned to, 41 int *partial, 42 int (*fn)( handle_t *handle, 43 struct buffer_head *bh)); 44 45 struct ocfs2_write_ctxt; 46 typedef int (ocfs2_page_writer)(struct inode *, struct ocfs2_write_ctxt *, 47 u64 *, unsigned int *, unsigned int *); 48 49 ssize_t ocfs2_buffered_write_cluster(struct file *file, loff_t pos, 50 size_t count, ocfs2_page_writer *actor, 51 void *priv); 52 53 struct ocfs2_write_ctxt { 54 size_t w_count; 55 loff_t w_pos; 56 u32 w_cpos; 57 unsigned int w_finished_copy; 58 59 /* This is true if page_size > cluster_size */ 60 unsigned int w_large_pages; 61 62 /* Filler callback and private data */ 63 ocfs2_page_writer *w_write_data_page; 64 void *w_private; 65 66 /* Only valid for the filler callback */ 67 struct page *w_this_page; 68 unsigned int w_this_page_new; 69 }; 70 71 struct ocfs2_buffered_write_priv { 72 char *b_src_buf; 73 const struct iovec *b_cur_iov; /* Current iovec */ 74 size_t b_cur_off; /* Offset in the 75 * current iovec */ 76 }; 77 int ocfs2_map_and_write_user_data(struct inode *inode, 78 struct ocfs2_write_ctxt *wc, 79 u64 *p_blkno, 80 unsigned int *ret_from, 81 unsigned int *ret_to); 82 83 struct ocfs2_splice_write_priv { 84 struct splice_desc *s_sd; 85 struct pipe_buffer *s_buf; 86 struct pipe_inode_info *s_pipe; 87 /* Neither offset value is ever larger than one page */ 88 unsigned int s_offset; 89 unsigned int s_buf_offset; 90 }; 91 int ocfs2_map_and_write_splice_data(struct inode *inode, 92 struct ocfs2_write_ctxt *wc, 93 u64 *p_blkno, 94 unsigned int *ret_from, 95 unsigned int *ret_to); 96 97 /* all ocfs2_dio_end_io()'s fault */ 98 #define ocfs2_iocb_is_rw_locked(iocb) \ 99 test_bit(0, (unsigned long *)&iocb->private) 100 static inline void ocfs2_iocb_set_rw_locked(struct kiocb *iocb, int level) 101 { 102 set_bit(0, (unsigned long *)&iocb->private); 103 if (level) 104 set_bit(1, (unsigned long *)&iocb->private); 105 else 106 clear_bit(1, (unsigned long *)&iocb->private); 107 } 108 #define ocfs2_iocb_clear_rw_locked(iocb) \ 109 clear_bit(0, (unsigned long *)&iocb->private) 110 #define ocfs2_iocb_rw_locked_level(iocb) \ 111 test_bit(1, (unsigned long *)&iocb->private) 112 #endif /* OCFS2_FILE_H */ 113