diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_file.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_file.c | 140 |
1 files changed, 23 insertions, 117 deletions
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index 41cfcba7ce49..d93d8dd1958d 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
@@ -49,50 +49,49 @@ static struct vm_operations_struct xfs_dmapi_file_vm_ops; | |||
49 | STATIC inline ssize_t | 49 | STATIC inline ssize_t |
50 | __xfs_file_read( | 50 | __xfs_file_read( |
51 | struct kiocb *iocb, | 51 | struct kiocb *iocb, |
52 | char __user *buf, | 52 | const struct iovec *iov, |
53 | unsigned long nr_segs, | ||
53 | int ioflags, | 54 | int ioflags, |
54 | size_t count, | ||
55 | loff_t pos) | 55 | loff_t pos) |
56 | { | 56 | { |
57 | struct iovec iov = {buf, count}; | ||
58 | struct file *file = iocb->ki_filp; | 57 | struct file *file = iocb->ki_filp; |
59 | bhv_vnode_t *vp = vn_from_inode(file->f_dentry->d_inode); | 58 | bhv_vnode_t *vp = vn_from_inode(file->f_dentry->d_inode); |
60 | 59 | ||
61 | BUG_ON(iocb->ki_pos != pos); | 60 | BUG_ON(iocb->ki_pos != pos); |
62 | if (unlikely(file->f_flags & O_DIRECT)) | 61 | if (unlikely(file->f_flags & O_DIRECT)) |
63 | ioflags |= IO_ISDIRECT; | 62 | ioflags |= IO_ISDIRECT; |
64 | return bhv_vop_read(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL); | 63 | return bhv_vop_read(vp, iocb, iov, nr_segs, &iocb->ki_pos, |
64 | ioflags, NULL); | ||
65 | } | 65 | } |
66 | 66 | ||
67 | STATIC ssize_t | 67 | STATIC ssize_t |
68 | xfs_file_aio_read( | 68 | xfs_file_aio_read( |
69 | struct kiocb *iocb, | 69 | struct kiocb *iocb, |
70 | char __user *buf, | 70 | const struct iovec *iov, |
71 | size_t count, | 71 | unsigned long nr_segs, |
72 | loff_t pos) | 72 | loff_t pos) |
73 | { | 73 | { |
74 | return __xfs_file_read(iocb, buf, IO_ISAIO, count, pos); | 74 | return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO, pos); |
75 | } | 75 | } |
76 | 76 | ||
77 | STATIC ssize_t | 77 | STATIC ssize_t |
78 | xfs_file_aio_read_invis( | 78 | xfs_file_aio_read_invis( |
79 | struct kiocb *iocb, | 79 | struct kiocb *iocb, |
80 | char __user *buf, | 80 | const struct iovec *iov, |
81 | size_t count, | 81 | unsigned long nr_segs, |
82 | loff_t pos) | 82 | loff_t pos) |
83 | { | 83 | { |
84 | return __xfs_file_read(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); | 84 | return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos); |
85 | } | 85 | } |
86 | 86 | ||
87 | STATIC inline ssize_t | 87 | STATIC inline ssize_t |
88 | __xfs_file_write( | 88 | __xfs_file_write( |
89 | struct kiocb *iocb, | 89 | struct kiocb *iocb, |
90 | const char __user *buf, | 90 | const struct iovec *iov, |
91 | int ioflags, | 91 | unsigned long nr_segs, |
92 | size_t count, | 92 | int ioflags, |
93 | loff_t pos) | 93 | loff_t pos) |
94 | { | 94 | { |
95 | struct iovec iov = {(void __user *)buf, count}; | ||
96 | struct file *file = iocb->ki_filp; | 95 | struct file *file = iocb->ki_filp; |
97 | struct inode *inode = file->f_mapping->host; | 96 | struct inode *inode = file->f_mapping->host; |
98 | bhv_vnode_t *vp = vn_from_inode(inode); | 97 | bhv_vnode_t *vp = vn_from_inode(inode); |
@@ -100,117 +99,28 @@ __xfs_file_write( | |||
100 | BUG_ON(iocb->ki_pos != pos); | 99 | BUG_ON(iocb->ki_pos != pos); |
101 | if (unlikely(file->f_flags & O_DIRECT)) | 100 | if (unlikely(file->f_flags & O_DIRECT)) |
102 | ioflags |= IO_ISDIRECT; | 101 | ioflags |= IO_ISDIRECT; |
103 | return bhv_vop_write(vp, iocb, &iov, 1, &iocb->ki_pos, ioflags, NULL); | 102 | return bhv_vop_write(vp, iocb, iov, nr_segs, &iocb->ki_pos, |
103 | ioflags, NULL); | ||
104 | } | 104 | } |
105 | 105 | ||
106 | STATIC ssize_t | 106 | STATIC ssize_t |
107 | xfs_file_aio_write( | 107 | xfs_file_aio_write( |
108 | struct kiocb *iocb, | 108 | struct kiocb *iocb, |
109 | const char __user *buf, | 109 | const struct iovec *iov, |
110 | size_t count, | 110 | unsigned long nr_segs, |
111 | loff_t pos) | 111 | loff_t pos) |
112 | { | 112 | { |
113 | return __xfs_file_write(iocb, buf, IO_ISAIO, count, pos); | 113 | return __xfs_file_write(iocb, iov, nr_segs, IO_ISAIO, pos); |
114 | } | 114 | } |
115 | 115 | ||
116 | STATIC ssize_t | 116 | STATIC ssize_t |
117 | xfs_file_aio_write_invis( | 117 | xfs_file_aio_write_invis( |
118 | struct kiocb *iocb, | 118 | struct kiocb *iocb, |
119 | const char __user *buf, | 119 | const struct iovec *iov, |
120 | size_t count, | ||
121 | loff_t pos) | ||
122 | { | ||
123 | return __xfs_file_write(iocb, buf, IO_ISAIO|IO_INVIS, count, pos); | ||
124 | } | ||
125 | |||
126 | STATIC inline ssize_t | ||
127 | __xfs_file_readv( | ||
128 | struct file *file, | ||
129 | const struct iovec *iov, | ||
130 | int ioflags, | ||
131 | unsigned long nr_segs, | ||
132 | loff_t *ppos) | ||
133 | { | ||
134 | struct inode *inode = file->f_mapping->host; | ||
135 | bhv_vnode_t *vp = vn_from_inode(inode); | ||
136 | struct kiocb kiocb; | ||
137 | ssize_t rval; | ||
138 | |||
139 | init_sync_kiocb(&kiocb, file); | ||
140 | kiocb.ki_pos = *ppos; | ||
141 | |||
142 | if (unlikely(file->f_flags & O_DIRECT)) | ||
143 | ioflags |= IO_ISDIRECT; | ||
144 | rval = bhv_vop_read(vp, &kiocb, iov, nr_segs, | ||
145 | &kiocb.ki_pos, ioflags, NULL); | ||
146 | |||
147 | *ppos = kiocb.ki_pos; | ||
148 | return rval; | ||
149 | } | ||
150 | |||
151 | STATIC ssize_t | ||
152 | xfs_file_readv( | ||
153 | struct file *file, | ||
154 | const struct iovec *iov, | ||
155 | unsigned long nr_segs, | ||
156 | loff_t *ppos) | ||
157 | { | ||
158 | return __xfs_file_readv(file, iov, 0, nr_segs, ppos); | ||
159 | } | ||
160 | |||
161 | STATIC ssize_t | ||
162 | xfs_file_readv_invis( | ||
163 | struct file *file, | ||
164 | const struct iovec *iov, | ||
165 | unsigned long nr_segs, | ||
166 | loff_t *ppos) | ||
167 | { | ||
168 | return __xfs_file_readv(file, iov, IO_INVIS, nr_segs, ppos); | ||
169 | } | ||
170 | |||
171 | STATIC inline ssize_t | ||
172 | __xfs_file_writev( | ||
173 | struct file *file, | ||
174 | const struct iovec *iov, | ||
175 | int ioflags, | ||
176 | unsigned long nr_segs, | ||
177 | loff_t *ppos) | ||
178 | { | ||
179 | struct inode *inode = file->f_mapping->host; | ||
180 | bhv_vnode_t *vp = vn_from_inode(inode); | ||
181 | struct kiocb kiocb; | ||
182 | ssize_t rval; | ||
183 | |||
184 | init_sync_kiocb(&kiocb, file); | ||
185 | kiocb.ki_pos = *ppos; | ||
186 | if (unlikely(file->f_flags & O_DIRECT)) | ||
187 | ioflags |= IO_ISDIRECT; | ||
188 | |||
189 | rval = bhv_vop_write(vp, &kiocb, iov, nr_segs, | ||
190 | &kiocb.ki_pos, ioflags, NULL); | ||
191 | |||
192 | *ppos = kiocb.ki_pos; | ||
193 | return rval; | ||
194 | } | ||
195 | |||
196 | STATIC ssize_t | ||
197 | xfs_file_writev( | ||
198 | struct file *file, | ||
199 | const struct iovec *iov, | ||
200 | unsigned long nr_segs, | 120 | unsigned long nr_segs, |
201 | loff_t *ppos) | 121 | loff_t pos) |
202 | { | ||
203 | return __xfs_file_writev(file, iov, 0, nr_segs, ppos); | ||
204 | } | ||
205 | |||
206 | STATIC ssize_t | ||
207 | xfs_file_writev_invis( | ||
208 | struct file *file, | ||
209 | const struct iovec *iov, | ||
210 | unsigned long nr_segs, | ||
211 | loff_t *ppos) | ||
212 | { | 122 | { |
213 | return __xfs_file_writev(file, iov, IO_INVIS, nr_segs, ppos); | 123 | return __xfs_file_write(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos); |
214 | } | 124 | } |
215 | 125 | ||
216 | STATIC ssize_t | 126 | STATIC ssize_t |
@@ -540,8 +450,6 @@ const struct file_operations xfs_file_operations = { | |||
540 | .llseek = generic_file_llseek, | 450 | .llseek = generic_file_llseek, |
541 | .read = do_sync_read, | 451 | .read = do_sync_read, |
542 | .write = do_sync_write, | 452 | .write = do_sync_write, |
543 | .readv = xfs_file_readv, | ||
544 | .writev = xfs_file_writev, | ||
545 | .aio_read = xfs_file_aio_read, | 453 | .aio_read = xfs_file_aio_read, |
546 | .aio_write = xfs_file_aio_write, | 454 | .aio_write = xfs_file_aio_write, |
547 | .sendfile = xfs_file_sendfile, | 455 | .sendfile = xfs_file_sendfile, |
@@ -565,8 +473,6 @@ const struct file_operations xfs_invis_file_operations = { | |||
565 | .llseek = generic_file_llseek, | 473 | .llseek = generic_file_llseek, |
566 | .read = do_sync_read, | 474 | .read = do_sync_read, |
567 | .write = do_sync_write, | 475 | .write = do_sync_write, |
568 | .readv = xfs_file_readv_invis, | ||
569 | .writev = xfs_file_writev_invis, | ||
570 | .aio_read = xfs_file_aio_read_invis, | 476 | .aio_read = xfs_file_aio_read_invis, |
571 | .aio_write = xfs_file_aio_write_invis, | 477 | .aio_write = xfs_file_aio_write_invis, |
572 | .sendfile = xfs_file_sendfile_invis, | 478 | .sendfile = xfs_file_sendfile_invis, |