GFS2: fix sparse warnings: constant is so big it is ...
[safe/jmp/linux-2.6] / fs / gfs2 / meta_io.c
1 /*
2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3  * Copyright (C) 2004-2008 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 #include <linux/sched.h>
11 #include <linux/slab.h>
12 #include <linux/spinlock.h>
13 #include <linux/completion.h>
14 #include <linux/buffer_head.h>
15 #include <linux/mm.h>
16 #include <linux/pagemap.h>
17 #include <linux/writeback.h>
18 #include <linux/swap.h>
19 #include <linux/delay.h>
20 #include <linux/bio.h>
21 #include <linux/gfs2_ondisk.h>
22
23 #include "gfs2.h"
24 #include "incore.h"
25 #include "glock.h"
26 #include "glops.h"
27 #include "inode.h"
28 #include "log.h"
29 #include "lops.h"
30 #include "meta_io.h"
31 #include "rgrp.h"
32 #include "trans.h"
33 #include "util.h"
34 #include "ops_address.h"
35
36 static int aspace_get_block(struct inode *inode, sector_t lblock,
37                             struct buffer_head *bh_result, int create)
38 {
39         gfs2_assert_warn(inode->i_sb->s_fs_info, 0);
40         return -EOPNOTSUPP;
41 }
42
43 static int gfs2_aspace_writepage(struct page *page,
44                                  struct writeback_control *wbc)
45 {
46         return block_write_full_page(page, aspace_get_block, wbc);
47 }
48
49 static const struct address_space_operations aspace_aops = {
50         .writepage = gfs2_aspace_writepage,
51         .releasepage = gfs2_releasepage,
52         .sync_page = block_sync_page,
53 };
54
55 /**
56  * gfs2_aspace_get - Create and initialize a struct inode structure
57  * @sdp: the filesystem the aspace is in
58  *
59  * Right now a struct inode is just a struct inode.  Maybe Linux
60  * will supply a more lightweight address space construct (that works)
61  * in the future.
62  *
63  * Make sure pages/buffers in this aspace aren't in high memory.
64  *
65  * Returns: the aspace
66  */
67
68 struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp)
69 {
70         struct inode *aspace;
71         struct gfs2_inode *ip;
72
73         aspace = new_inode(sdp->sd_vfs);
74         if (aspace) {
75                 mapping_set_gfp_mask(aspace->i_mapping, GFP_NOFS);
76                 aspace->i_mapping->a_ops = &aspace_aops;
77                 aspace->i_size = ~0ULL;
78                 ip = GFS2_I(aspace);
79                 clear_bit(GIF_USER, &ip->i_flags);
80                 insert_inode_hash(aspace);
81         }
82         return aspace;
83 }
84
85 void gfs2_aspace_put(struct inode *aspace)
86 {
87         remove_inode_hash(aspace);
88         iput(aspace);
89 }
90
91 /**
92  * gfs2_meta_inval - Invalidate all buffers associated with a glock
93  * @gl: the glock
94  *
95  */
96
97 void gfs2_meta_inval(struct gfs2_glock *gl)
98 {
99         struct gfs2_sbd *sdp = gl->gl_sbd;
100         struct inode *aspace = gl->gl_aspace;
101         struct address_space *mapping = gl->gl_aspace->i_mapping;
102
103         gfs2_assert_withdraw(sdp, !atomic_read(&gl->gl_ail_count));
104
105         atomic_inc(&aspace->i_writecount);
106         truncate_inode_pages(mapping, 0);
107         atomic_dec(&aspace->i_writecount);
108
109         gfs2_assert_withdraw(sdp, !mapping->nrpages);
110 }
111
112 /**
113  * gfs2_meta_sync - Sync all buffers associated with a glock
114  * @gl: The glock
115  *
116  */
117
118 void gfs2_meta_sync(struct gfs2_glock *gl)
119 {
120         struct address_space *mapping = gl->gl_aspace->i_mapping;
121         int error;
122
123         filemap_fdatawrite(mapping);
124         error = filemap_fdatawait(mapping);
125
126         if (error)
127                 gfs2_io_error(gl->gl_sbd);
128 }
129
130 /**
131  * gfs2_getbuf - Get a buffer with a given address space
132  * @gl: the glock
133  * @blkno: the block number (filesystem scope)
134  * @create: 1 if the buffer should be created
135  *
136  * Returns: the buffer
137  */
138
139 struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create)
140 {
141         struct address_space *mapping = gl->gl_aspace->i_mapping;
142         struct gfs2_sbd *sdp = gl->gl_sbd;
143         struct page *page;
144         struct buffer_head *bh;
145         unsigned int shift;
146         unsigned long index;
147         unsigned int bufnum;
148
149         shift = PAGE_CACHE_SHIFT - sdp->sd_sb.sb_bsize_shift;
150         index = blkno >> shift;             /* convert block to page */
151         bufnum = blkno - (index << shift);  /* block buf index within page */
152
153         if (create) {
154                 for (;;) {
155                         page = grab_cache_page(mapping, index);
156                         if (page)
157                                 break;
158                         yield();
159                 }
160         } else {
161                 page = find_lock_page(mapping, index);
162                 if (!page)
163                         return NULL;
164         }
165
166         if (!page_has_buffers(page))
167                 create_empty_buffers(page, sdp->sd_sb.sb_bsize, 0);
168
169         /* Locate header for our buffer within our page */
170         for (bh = page_buffers(page); bufnum--; bh = bh->b_this_page)
171                 /* Do nothing */;
172         get_bh(bh);
173
174         if (!buffer_mapped(bh))
175                 map_bh(bh, sdp->sd_vfs, blkno);
176
177         unlock_page(page);
178         mark_page_accessed(page);
179         page_cache_release(page);
180
181         return bh;
182 }
183
184 static void meta_prep_new(struct buffer_head *bh)
185 {
186         struct gfs2_meta_header *mh = (struct gfs2_meta_header *)bh->b_data;
187
188         lock_buffer(bh);
189         clear_buffer_dirty(bh);
190         set_buffer_uptodate(bh);
191         unlock_buffer(bh);
192
193         mh->mh_magic = cpu_to_be32(GFS2_MAGIC);
194 }
195
196 /**
197  * gfs2_meta_new - Get a block
198  * @gl: The glock associated with this block
199  * @blkno: The block number
200  *
201  * Returns: The buffer
202  */
203
204 struct buffer_head *gfs2_meta_new(struct gfs2_glock *gl, u64 blkno)
205 {
206         struct buffer_head *bh;
207         bh = gfs2_getbuf(gl, blkno, CREATE);
208         meta_prep_new(bh);
209         return bh;
210 }
211
212 /**
213  * gfs2_meta_read - Read a block from disk
214  * @gl: The glock covering the block
215  * @blkno: The block number
216  * @flags: flags
217  * @bhp: the place where the buffer is returned (NULL on failure)
218  *
219  * Returns: errno
220  */
221
222 int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags,
223                    struct buffer_head **bhp)
224 {
225         *bhp = gfs2_getbuf(gl, blkno, CREATE);
226         if (!buffer_uptodate(*bhp)) {
227                 ll_rw_block(READ_META, 1, bhp);
228                 if (flags & DIO_WAIT) {
229                         int error = gfs2_meta_wait(gl->gl_sbd, *bhp);
230                         if (error) {
231                                 brelse(*bhp);
232                                 return error;
233                         }
234                 }
235         }
236
237         return 0;
238 }
239
240 /**
241  * gfs2_meta_wait - Reread a block from disk
242  * @sdp: the filesystem
243  * @bh: The block to wait for
244  *
245  * Returns: errno
246  */
247
248 int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh)
249 {
250         if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
251                 return -EIO;
252
253         wait_on_buffer(bh);
254
255         if (!buffer_uptodate(bh)) {
256                 struct gfs2_trans *tr = current->journal_info;
257                 if (tr && tr->tr_touched)
258                         gfs2_io_error_bh(sdp, bh);
259                 return -EIO;
260         }
261         if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
262                 return -EIO;
263
264         return 0;
265 }
266
267 /**
268  * gfs2_attach_bufdata - attach a struct gfs2_bufdata structure to a buffer
269  * @gl: the glock the buffer belongs to
270  * @bh: The buffer to be attached to
271  * @meta: Flag to indicate whether its metadata or not
272  */
273
274 void gfs2_attach_bufdata(struct gfs2_glock *gl, struct buffer_head *bh,
275                          int meta)
276 {
277         struct gfs2_bufdata *bd;
278
279         if (meta)
280                 lock_page(bh->b_page);
281
282         if (bh->b_private) {
283                 if (meta)
284                         unlock_page(bh->b_page);
285                 return;
286         }
287
288         bd = kmem_cache_zalloc(gfs2_bufdata_cachep, GFP_NOFS | __GFP_NOFAIL);
289         bd->bd_bh = bh;
290         bd->bd_gl = gl;
291
292         INIT_LIST_HEAD(&bd->bd_list_tr);
293         if (meta)
294                 lops_init_le(&bd->bd_le, &gfs2_buf_lops);
295         else
296                 lops_init_le(&bd->bd_le, &gfs2_databuf_lops);
297         bh->b_private = bd;
298
299         if (meta)
300                 unlock_page(bh->b_page);
301 }
302
303 void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int meta)
304 {
305         struct gfs2_sbd *sdp = GFS2_SB(bh->b_page->mapping->host);
306         struct gfs2_bufdata *bd = bh->b_private;
307         if (test_clear_buffer_pinned(bh)) {
308                 list_del_init(&bd->bd_le.le_list);
309                 if (meta) {
310                         gfs2_assert_warn(sdp, sdp->sd_log_num_buf);
311                         sdp->sd_log_num_buf--;
312                         tr->tr_num_buf_rm++;
313                 } else {
314                         gfs2_assert_warn(sdp, sdp->sd_log_num_databuf);
315                         sdp->sd_log_num_databuf--;
316                         tr->tr_num_databuf_rm++;
317                 }
318                 tr->tr_touched = 1;
319                 brelse(bh);
320         }
321         if (bd) {
322                 if (bd->bd_ail) {
323                         gfs2_remove_from_ail(bd);
324                         bh->b_private = NULL;
325                         bd->bd_bh = NULL;
326                         bd->bd_blkno = bh->b_blocknr;
327                         gfs2_trans_add_revoke(sdp, bd);
328                 }
329         }
330         clear_buffer_dirty(bh);
331         clear_buffer_uptodate(bh);
332 }
333
334 /**
335  * gfs2_meta_wipe - make inode's buffers so they aren't dirty/pinned anymore
336  * @ip: the inode who owns the buffers
337  * @bstart: the first buffer in the run
338  * @blen: the number of buffers in the run
339  *
340  */
341
342 void gfs2_meta_wipe(struct gfs2_inode *ip, u64 bstart, u32 blen)
343 {
344         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
345         struct buffer_head *bh;
346
347         while (blen) {
348                 bh = gfs2_getbuf(ip->i_gl, bstart, NO_CREATE);
349                 if (bh) {
350                         lock_buffer(bh);
351                         gfs2_log_lock(sdp);
352                         gfs2_remove_from_journal(bh, current->journal_info, 1);
353                         gfs2_log_unlock(sdp);
354                         unlock_buffer(bh);
355                         brelse(bh);
356                 }
357
358                 bstart++;
359                 blen--;
360         }
361 }
362
363 /**
364  * gfs2_meta_indirect_buffer - Get a metadata buffer
365  * @ip: The GFS2 inode
366  * @height: The level of this buf in the metadata (indir addr) tree (if any)
367  * @num: The block number (device relative) of the buffer
368  * @new: Non-zero if we may create a new buffer
369  * @bhp: the buffer is returned here
370  *
371  * Returns: errno
372  */
373
374 int gfs2_meta_indirect_buffer(struct gfs2_inode *ip, int height, u64 num,
375                               int new, struct buffer_head **bhp)
376 {
377         struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
378         struct gfs2_glock *gl = ip->i_gl;
379         struct buffer_head *bh;
380         int ret = 0;
381
382         if (new) {
383                 BUG_ON(height == 0);
384                 bh = gfs2_meta_new(gl, num);
385                 gfs2_trans_add_bh(ip->i_gl, bh, 1);
386                 gfs2_metatype_set(bh, GFS2_METATYPE_IN, GFS2_FORMAT_IN);
387                 gfs2_buffer_clear_tail(bh, sizeof(struct gfs2_meta_header));
388         } else {
389                 u32 mtype = height ? GFS2_METATYPE_IN : GFS2_METATYPE_DI;
390                 ret = gfs2_meta_read(gl, num, DIO_WAIT, &bh);
391                 if (ret == 0 && gfs2_metatype_check(sdp, bh, mtype)) {
392                         brelse(bh);
393                         ret = -EIO;
394                 }
395         }
396         *bhp = bh;
397         return ret;
398 }
399
400 /**
401  * gfs2_meta_ra - start readahead on an extent of a file
402  * @gl: the glock the blocks belong to
403  * @dblock: the starting disk block
404  * @extlen: the number of blocks in the extent
405  *
406  * returns: the first buffer in the extent
407  */
408
409 struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen)
410 {
411         struct gfs2_sbd *sdp = gl->gl_sbd;
412         struct buffer_head *first_bh, *bh;
413         u32 max_ra = gfs2_tune_get(sdp, gt_max_readahead) >>
414                           sdp->sd_sb.sb_bsize_shift;
415
416         BUG_ON(!extlen);
417
418         if (max_ra < 1)
419                 max_ra = 1;
420         if (extlen > max_ra)
421                 extlen = max_ra;
422
423         first_bh = gfs2_getbuf(gl, dblock, CREATE);
424
425         if (buffer_uptodate(first_bh))
426                 goto out;
427         if (!buffer_locked(first_bh))
428                 ll_rw_block(READ_META, 1, &first_bh);
429
430         dblock++;
431         extlen--;
432
433         while (extlen) {
434                 bh = gfs2_getbuf(gl, dblock, CREATE);
435
436                 if (!buffer_uptodate(bh) && !buffer_locked(bh))
437                         ll_rw_block(READA, 1, &bh);
438                 brelse(bh);
439                 dblock++;
440                 extlen--;
441                 if (!buffer_locked(first_bh) && buffer_uptodate(first_bh))
442                         goto out;
443         }
444
445         wait_on_buffer(first_bh);
446 out:
447         return first_bh;
448 }
449