~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/gfs2/lops.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/gfs2/lops.c (Version linux-6.12-rc7) and /fs/gfs2/lops.c (Version linux-2.6.32.71)


  1 // SPDX-License-Identifier: GPL-2.0-only       << 
  2 /*                                                  1 /*
  3  * Copyright (C) Sistina Software, Inc.  1997-      2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
  4  * Copyright (C) 2004-2006 Red Hat, Inc.  All       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.
  5  */                                                 8  */
  6                                                     9 
  7 #include <linux/sched.h>                           10 #include <linux/sched.h>
  8 #include <linux/slab.h>                            11 #include <linux/slab.h>
  9 #include <linux/spinlock.h>                        12 #include <linux/spinlock.h>
 10 #include <linux/completion.h>                      13 #include <linux/completion.h>
 11 #include <linux/buffer_head.h>                     14 #include <linux/buffer_head.h>
 12 #include <linux/mempool.h>                     << 
 13 #include <linux/gfs2_ondisk.h>                     15 #include <linux/gfs2_ondisk.h>
 14 #include <linux/bio.h>                             16 #include <linux/bio.h>
 15 #include <linux/fs.h>                              17 #include <linux/fs.h>
 16 #include <linux/list_sort.h>                   << 
 17 #include <linux/blkdev.h>                      << 
 18                                                    18 
 19 #include "bmap.h"                              << 
 20 #include "dir.h"                               << 
 21 #include "gfs2.h"                                  19 #include "gfs2.h"
 22 #include "incore.h"                                20 #include "incore.h"
 23 #include "inode.h"                                 21 #include "inode.h"
 24 #include "glock.h"                                 22 #include "glock.h"
 25 #include "glops.h"                             << 
 26 #include "log.h"                                   23 #include "log.h"
 27 #include "lops.h"                                  24 #include "lops.h"
 28 #include "meta_io.h"                               25 #include "meta_io.h"
 29 #include "recovery.h"                              26 #include "recovery.h"
 30 #include "rgrp.h"                                  27 #include "rgrp.h"
 31 #include "trans.h"                                 28 #include "trans.h"
 32 #include "util.h"                                  29 #include "util.h"
 33 #include "trace_gfs2.h"                            30 #include "trace_gfs2.h"
 34                                                    31 
 35 /**                                                32 /**
 36  * gfs2_pin - Pin a buffer in memory               33  * gfs2_pin - Pin a buffer in memory
 37  * @sdp: The superblock                            34  * @sdp: The superblock
 38  * @bh: The buffer to be pinned                    35  * @bh: The buffer to be pinned
 39  *                                                 36  *
 40  * The log lock must be held when calling this     37  * The log lock must be held when calling this function
 41  */                                                38  */
 42 void gfs2_pin(struct gfs2_sbd *sdp, struct buf !!  39 static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh)
 43 {                                                  40 {
 44         struct gfs2_bufdata *bd;                   41         struct gfs2_bufdata *bd;
 45                                                    42 
 46         BUG_ON(!current->journal_info);        !!  43         gfs2_assert_withdraw(sdp, test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags));
 47                                                    44 
 48         clear_buffer_dirty(bh);                    45         clear_buffer_dirty(bh);
 49         if (test_set_buffer_pinned(bh))            46         if (test_set_buffer_pinned(bh))
 50                 gfs2_assert_withdraw(sdp, 0);      47                 gfs2_assert_withdraw(sdp, 0);
 51         if (!buffer_uptodate(bh))                  48         if (!buffer_uptodate(bh))
 52                 gfs2_io_error_bh_wd(sdp, bh);  !!  49                 gfs2_io_error_bh(sdp, bh);
 53         bd = bh->b_private;                        50         bd = bh->b_private;
 54         /* If this buffer is in the AIL and it     51         /* If this buffer is in the AIL and it has already been written
 55          * to in-place disk block, remove it f     52          * to in-place disk block, remove it from the AIL.
 56          */                                        53          */
 57         spin_lock(&sdp->sd_ail_lock);          !!  54         if (bd->bd_ail)
 58         if (bd->bd_tr)                         !!  55                 list_move(&bd->bd_ail_st_list, &bd->bd_ail->ai_ail2_list);
 59                 list_move(&bd->bd_ail_st_list, << 
 60         spin_unlock(&sdp->sd_ail_lock);        << 
 61         get_bh(bh);                                56         get_bh(bh);
 62         atomic_inc(&sdp->sd_log_pinned);       << 
 63         trace_gfs2_pin(bd, 1);                     57         trace_gfs2_pin(bd, 1);
 64 }                                                  58 }
 65                                                    59 
 66 static bool buffer_is_rgrp(const struct gfs2_b << 
 67 {                                              << 
 68         return bd->bd_gl->gl_name.ln_type == L << 
 69 }                                              << 
 70                                                << 
 71 static void maybe_release_space(struct gfs2_bu << 
 72 {                                              << 
 73         struct gfs2_glock *gl = bd->bd_gl;     << 
 74         struct gfs2_sbd *sdp = gl->gl_name.ln_ << 
 75         struct gfs2_rgrpd *rgd = gfs2_glock2rg << 
 76         unsigned int index = bd->bd_bh->b_bloc << 
 77         struct gfs2_bitmap *bi = rgd->rd_bits  << 
 78                                                << 
 79         rgrp_lock_local(rgd);                  << 
 80         if (bi->bi_clone == NULL)              << 
 81                 goto out;                      << 
 82         if (sdp->sd_args.ar_discard)           << 
 83                 gfs2_rgrp_send_discards(sdp, r << 
 84         memcpy(bi->bi_clone + bi->bi_offset,   << 
 85                bd->bd_bh->b_data + bi->bi_offs << 
 86         clear_bit(GBF_FULL, &bi->bi_flags);    << 
 87         rgd->rd_free_clone = rgd->rd_free;     << 
 88         BUG_ON(rgd->rd_free_clone < rgd->rd_re << 
 89         rgd->rd_extfail_pt = rgd->rd_free;     << 
 90                                                << 
 91 out:                                           << 
 92         rgrp_unlock_local(rgd);                << 
 93 }                                              << 
 94                                                << 
 95 /**                                                60 /**
 96  * gfs2_unpin - Unpin a buffer                     61  * gfs2_unpin - Unpin a buffer
 97  * @sdp: the filesystem the buffer belongs to      62  * @sdp: the filesystem the buffer belongs to
 98  * @bh: The buffer to unpin                        63  * @bh: The buffer to unpin
 99  * @tr: The system transaction being flushed   !!  64  * @ai:
                                                   >>  65  *
100  */                                                66  */
101                                                    67 
102 static void gfs2_unpin(struct gfs2_sbd *sdp, s     68 static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh,
103                        struct gfs2_trans *tr)  !!  69                        struct gfs2_ail *ai)
104 {                                                  70 {
105         struct gfs2_bufdata *bd = bh->b_privat     71         struct gfs2_bufdata *bd = bh->b_private;
106                                                    72 
107         BUG_ON(!buffer_uptodate(bh));          !!  73         gfs2_assert_withdraw(sdp, buffer_uptodate(bh));
108         BUG_ON(!buffer_pinned(bh));            !!  74 
                                                   >>  75         if (!buffer_pinned(bh))
                                                   >>  76                 gfs2_assert_withdraw(sdp, 0);
109                                                    77 
110         lock_buffer(bh);                           78         lock_buffer(bh);
111         mark_buffer_dirty(bh);                     79         mark_buffer_dirty(bh);
112         clear_buffer_pinned(bh);                   80         clear_buffer_pinned(bh);
113                                                    81 
114         if (buffer_is_rgrp(bd))                !!  82         gfs2_log_lock(sdp);
115                 maybe_release_space(bd);       !!  83         if (bd->bd_ail) {
116                                                << 
117         spin_lock(&sdp->sd_ail_lock);          << 
118         if (bd->bd_tr) {                       << 
119                 list_del(&bd->bd_ail_st_list);     84                 list_del(&bd->bd_ail_st_list);
120                 brelse(bh);                        85                 brelse(bh);
121         } else {                                   86         } else {
122                 struct gfs2_glock *gl = bd->bd     87                 struct gfs2_glock *gl = bd->bd_gl;
123                 list_add(&bd->bd_ail_gl_list,      88                 list_add(&bd->bd_ail_gl_list, &gl->gl_ail_list);
124                 atomic_inc(&gl->gl_ail_count);     89                 atomic_inc(&gl->gl_ail_count);
125         }                                          90         }
126         bd->bd_tr = tr;                        !!  91         bd->bd_ail = ai;
127         list_add(&bd->bd_ail_st_list, &tr->tr_ !!  92         list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list);
128         spin_unlock(&sdp->sd_ail_lock);        << 
129                                                << 
130         clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_f     93         clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
131         trace_gfs2_pin(bd, 0);                     94         trace_gfs2_pin(bd, 0);
                                                   >>  95         gfs2_log_unlock(sdp);
132         unlock_buffer(bh);                         96         unlock_buffer(bh);
133         atomic_dec(&sdp->sd_log_pinned);       << 
134 }                                                  97 }
135                                                    98 
136 void gfs2_log_incr_head(struct gfs2_sbd *sdp)  << 
137 {                                              << 
138         BUG_ON((sdp->sd_log_flush_head == sdp- << 
139                (sdp->sd_log_flush_head != sdp- << 
140                                                    99 
141         if (++sdp->sd_log_flush_head == sdp->s !! 100 static inline struct gfs2_log_descriptor *bh_log_desc(struct buffer_head *bh)
142                 sdp->sd_log_flush_head = 0;    << 
143 }                                              << 
144                                                << 
145 u64 gfs2_log_bmap(struct gfs2_jdesc *jd, unsig << 
146 {                                                 101 {
147         struct gfs2_journal_extent *je;        !! 102         return (struct gfs2_log_descriptor *)bh->b_data;
148                                                << 
149         list_for_each_entry(je, &jd->extent_li << 
150                 if (lblock >= je->lblock && lb << 
151                         return je->dblock + lb << 
152         }                                      << 
153                                                << 
154         return -1;                             << 
155 }                                                 103 }
156                                                   104 
157 /**                                            !! 105 static inline __be64 *bh_log_ptr(struct buffer_head *bh)
158  * gfs2_end_log_write_bh - end log write of pa << 
159  * @sdp: The superblock                        << 
160  * @bvec: The bio_vec                          << 
161  * @error: The i/o status                      << 
162  *                                             << 
163  * This finds the relevant buffers and unlocks << 
164  * error flag according to the status of the i << 
165  * used when the log is writing data which has << 
166  * that is pinned in the pagecache.            << 
167  */                                            << 
168                                                << 
169 static void gfs2_end_log_write_bh(struct gfs2_ << 
170                                   struct bio_v << 
171                                   blk_status_t << 
172 {                                              << 
173         struct buffer_head *bh, *next;         << 
174         struct page *page = bvec->bv_page;     << 
175         unsigned size;                         << 
176                                                << 
177         bh = page_buffers(page);               << 
178         size = bvec->bv_len;                   << 
179         while (bh_offset(bh) < bvec->bv_offset << 
180                 bh = bh->b_this_page;          << 
181         do {                                   << 
182                 if (error)                     << 
183                         mark_buffer_write_io_e << 
184                 unlock_buffer(bh);             << 
185                 next = bh->b_this_page;        << 
186                 size -= bh->b_size;            << 
187                 brelse(bh);                    << 
188                 bh = next;                     << 
189         } while(bh && size);                   << 
190 }                                              << 
191                                                << 
192 /**                                            << 
193  * gfs2_end_log_write - end of i/o to the log  << 
194  * @bio: The bio                               << 
195  *                                             << 
196  * Each bio_vec contains either data from the  << 
197  * relating to the log itself. Here we iterate << 
198  * array, processing both kinds of data.       << 
199  *                                             << 
200  */                                            << 
201                                                << 
202 static void gfs2_end_log_write(struct bio *bio << 
203 {                                                 106 {
204         struct gfs2_sbd *sdp = bio->bi_private !! 107         struct gfs2_log_descriptor *ld = bh_log_desc(bh);
205         struct bio_vec *bvec;                  !! 108         return (__force __be64 *)(ld + 1);
206         struct page *page;                     << 
207         struct bvec_iter_all iter_all;         << 
208                                                << 
209         if (bio->bi_status) {                  << 
210                 if (!cmpxchg(&sdp->sd_log_erro << 
211                         fs_err(sdp, "Error %d  << 
212                                bio->bi_status, << 
213                 gfs2_withdraw_delayed(sdp);    << 
214                 /* prevent more writes to the  << 
215                 clear_bit(SDF_JOURNAL_LIVE, &s << 
216                 wake_up(&sdp->sd_logd_waitq);  << 
217         }                                      << 
218                                                << 
219         bio_for_each_segment_all(bvec, bio, it << 
220                 page = bvec->bv_page;          << 
221                 if (page_has_buffers(page))    << 
222                         gfs2_end_log_write_bh( << 
223                 else                           << 
224                         mempool_free(page, gfs << 
225         }                                      << 
226                                                << 
227         bio_put(bio);                          << 
228         if (atomic_dec_and_test(&sdp->sd_log_i << 
229                 wake_up(&sdp->sd_log_flush_wai << 
230 }                                                 109 }
231                                                   110 
232 /**                                            !! 111 static inline __be64 *bh_ptr_end(struct buffer_head *bh)
233  * gfs2_log_submit_bio - Submit any pending lo << 
234  * @biop: Address of the bio pointer           << 
235  * @opf: REQ_OP | op_flags                     << 
236  *                                             << 
237  * Submit any pending part-built or full bio t << 
238  * there is no pending bio, then this is a no- << 
239  */                                            << 
240                                                << 
241 void gfs2_log_submit_bio(struct bio **biop, bl << 
242 {                                                 112 {
243         struct bio *bio = *biop;               !! 113         return (__force __be64 *)(bh->b_data + bh->b_size);
244         if (bio) {                             << 
245                 struct gfs2_sbd *sdp = bio->bi << 
246                 atomic_inc(&sdp->sd_log_in_fli << 
247                 bio->bi_opf = opf;             << 
248                 submit_bio(bio);               << 
249                 *biop = NULL;                  << 
250         }                                      << 
251 }                                              << 
252                                                << 
253 /**                                            << 
254  * gfs2_log_alloc_bio - Allocate a bio         << 
255  * @sdp: The super block                       << 
256  * @blkno: The device block number we want to  << 
257  * @end_io: The bi_end_io callback             << 
258  *                                             << 
259  * Allocate a new bio, initialize it with the  << 
260  *                                             << 
261  * Returns: The newly allocated bio            << 
262  */                                            << 
263                                                << 
264 static struct bio *gfs2_log_alloc_bio(struct g << 
265                                       bio_end_ << 
266 {                                              << 
267         struct super_block *sb = sdp->sd_vfs;  << 
268         struct bio *bio = bio_alloc(sb->s_bdev << 
269                                                << 
270         bio->bi_iter.bi_sector = blkno << sdp- << 
271         bio->bi_end_io = end_io;               << 
272         bio->bi_private = sdp;                 << 
273                                                << 
274         return bio;                            << 
275 }                                                 114 }
276                                                   115 
277 /**                                            << 
278  * gfs2_log_get_bio - Get cached log bio, or a << 
279  * @sdp: The super block                       << 
280  * @blkno: The device block number we want to  << 
281  * @biop: The bio to get or allocate           << 
282  * @op: REQ_OP                                 << 
283  * @end_io: The bi_end_io callback             << 
284  * @flush: Always flush the current bio and al << 
285  *                                             << 
286  * If there is a cached bio, then if the next  << 
287  * with the previous one, return it, otherwise << 
288  * device. If there is no cached bio, or we ju << 
289  * allocate a new one.                         << 
290  *                                             << 
291  * Returns: The bio to use for log writes      << 
292  */                                            << 
293                                                << 
294 static struct bio *gfs2_log_get_bio(struct gfs << 
295                                     struct bio << 
296                                     bio_end_io << 
297 {                                              << 
298         struct bio *bio = *biop;               << 
299                                                << 
300         if (bio) {                             << 
301                 u64 nblk;                      << 
302                                                << 
303                 nblk = bio_end_sector(bio);    << 
304                 nblk >>= sdp->sd_fsb2bb_shift; << 
305                 if (blkno == nblk && !flush)   << 
306                         return bio;            << 
307                 gfs2_log_submit_bio(biop, op); << 
308         }                                      << 
309                                                << 
310         *biop = gfs2_log_alloc_bio(sdp, blkno, << 
311         return *biop;                          << 
312 }                                              << 
313                                                << 
314 /**                                            << 
315  * gfs2_log_write - write to log               << 
316  * @sdp: the filesystem                        << 
317  * @jd: The journal descriptor                 << 
318  * @page: the page to write                    << 
319  * @size: the size of the data to write        << 
320  * @offset: the offset within the page         << 
321  * @blkno: block number of the log entry       << 
322  *                                             << 
323  * Try and add the page segment to the current << 
324  * submit the current bio to the device and cr << 
325  * then add the page segment to that.          << 
326  */                                            << 
327                                                << 
328 void gfs2_log_write(struct gfs2_sbd *sdp, stru << 
329                     struct page *page, unsigne << 
330                     u64 blkno)                 << 
331 {                                              << 
332         struct bio *bio;                       << 
333         int ret;                               << 
334                                                << 
335         bio = gfs2_log_get_bio(sdp, blkno, &jd << 
336                                gfs2_end_log_wr << 
337         ret = bio_add_page(bio, page, size, of << 
338         if (ret == 0) {                        << 
339                 bio = gfs2_log_get_bio(sdp, bl << 
340                                        REQ_OP_ << 
341                 ret = bio_add_page(bio, page,  << 
342                 WARN_ON(ret == 0);             << 
343         }                                      << 
344 }                                              << 
345                                                << 
346 /**                                            << 
347  * gfs2_log_write_bh - write a buffer's conten << 
348  * @sdp: The super block                       << 
349  * @bh: The buffer pointing to the in-place lo << 
350  *                                             << 
351  * This writes the content of the buffer to th << 
352  * in the log. The buffer will be unlocked onc << 
353  * completed.                                  << 
354  */                                            << 
355                                                << 
356 static void gfs2_log_write_bh(struct gfs2_sbd  << 
357 {                                              << 
358         u64 dblock;                            << 
359                                                << 
360         dblock = gfs2_log_bmap(sdp->sd_jdesc,  << 
361         gfs2_log_incr_head(sdp);               << 
362         gfs2_log_write(sdp, sdp->sd_jdesc, bh- << 
363                        bh_offset(bh), dblock); << 
364 }                                              << 
365                                                << 
366 /**                                            << 
367  * gfs2_log_write_page - write one block store << 
368  * @sdp: The superblock                        << 
369  * @page: The struct page                      << 
370  *                                             << 
371  * This writes the first block-sized part of t << 
372  * that the page must have been allocated from << 
373  * and that after this has been called, owners << 
374  * the page may be freed at any time.          << 
375  */                                            << 
376                                                << 
377 static void gfs2_log_write_page(struct gfs2_sb << 
378 {                                              << 
379         struct super_block *sb = sdp->sd_vfs;  << 
380         u64 dblock;                            << 
381                                                << 
382         dblock = gfs2_log_bmap(sdp->sd_jdesc,  << 
383         gfs2_log_incr_head(sdp);               << 
384         gfs2_log_write(sdp, sdp->sd_jdesc, pag << 
385 }                                              << 
386                                                << 
387 /**                                            << 
388  * gfs2_end_log_read - end I/O callback for re << 
389  * @bio: The bio                               << 
390  *                                             << 
391  * Simply unlock the pages in the bio. The mai << 
392  * process them in order as necessary.         << 
393  */                                            << 
394 static void gfs2_end_log_read(struct bio *bio) << 
395 {                                              << 
396         int error = blk_status_to_errno(bio->b << 
397         struct folio_iter fi;                  << 
398                                                << 
399         bio_for_each_folio_all(fi, bio) {      << 
400                 /* We're abusing wb_err to get << 
401                 filemap_set_wb_err(fi.folio->m << 
402                 folio_end_read(fi.folio, !erro << 
403         }                                      << 
404                                                << 
405         bio_put(bio);                          << 
406 }                                              << 
407                                                << 
408 /**                                            << 
409  * gfs2_jhead_pg_srch - Look for the journal h << 
410  * @jd: The journal descriptor                 << 
411  * @head: The journal head to start from       << 
412  * @page: The page to look in                  << 
413  *                                             << 
414  * Returns: 1 if found, 0 otherwise.           << 
415  */                                            << 
416                                                << 
417 static bool gfs2_jhead_pg_srch(struct gfs2_jde << 
418                               struct gfs2_log_ << 
419                               struct page *pag << 
420 {                                              << 
421         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ << 
422         struct gfs2_log_header_host lh;        << 
423         void *kaddr;                           << 
424         unsigned int offset;                   << 
425         bool ret = false;                      << 
426                                                << 
427         kaddr = kmap_local_page(page);         << 
428         for (offset = 0; offset < PAGE_SIZE; o << 
429                 if (!__get_log_header(sdp, kad << 
430                         if (lh.lh_sequence >=  << 
431                                 *head = lh;    << 
432                         else {                 << 
433                                 ret = true;    << 
434                                 break;         << 
435                         }                      << 
436                 }                              << 
437         }                                      << 
438         kunmap_local(kaddr);                   << 
439         return ret;                            << 
440 }                                              << 
441                                                << 
442 /**                                            << 
443  * gfs2_jhead_process_page - Search/cleanup a  << 
444  * @jd: The journal descriptor                 << 
445  * @index: Index of the page to look into      << 
446  * @head: The journal head to start from       << 
447  * @done: If set, perform only cleanup, else s << 
448  *                                             << 
449  * Find the folio with 'index' in the journal' << 
450  * the journal head if requested (cleanup == f << 
451  * folio so the page cache can reclaim it. We  << 
452  * reference on this folio twice, first when w << 
453  * to obtain the folio to add it to the bio an << 
454  * filemap_get_folio() here to get the folio t << 
455  * completed.                                  << 
456  * This function is also used to free up a fol << 
457  * used. Maybe we added it to a bio, but not s << 
458  * submitted the I/O, but we already found the << 
459  * our references to the folio.                << 
460  */                                            << 
461                                                << 
462 static void gfs2_jhead_process_page(struct gfs << 
463                                     struct gfs << 
464                                     bool *done << 
465 {                                              << 
466         struct folio *folio;                   << 
467                                                << 
468         folio = filemap_get_folio(jd->jd_inode << 
469                                                << 
470         folio_wait_locked(folio);              << 
471         if (!folio_test_uptodate(folio))       << 
472                 *done = true;                  << 
473                                                << 
474         if (!*done)                            << 
475                 *done = gfs2_jhead_pg_srch(jd, << 
476                                                << 
477         /* filemap_get_folio() and the earlier << 
478         folio_put_refs(folio, 2);              << 
479 }                                              << 
480                                                << 
481 static struct bio *gfs2_chain_bio(struct bio * << 
482 {                                              << 
483         struct bio *new;                       << 
484                                                << 
485         new = bio_alloc(prev->bi_bdev, nr_iove << 
486         bio_clone_blkg_association(new, prev); << 
487         new->bi_iter.bi_sector = bio_end_secto << 
488         bio_chain(new, prev);                  << 
489         submit_bio(prev);                      << 
490         return new;                            << 
491 }                                              << 
492                                                << 
493 /**                                            << 
494  * gfs2_find_jhead - find the head of a log    << 
495  * @jd: The journal descriptor                 << 
496  * @head: The log descriptor for the head of t << 
497  * @keep_cache: If set inode pages will not be << 
498  *                                             << 
499  * Do a search of a journal by reading it in l << 
500  * the valid log entry with the highest sequen << 
501  *                                             << 
502  * Returns: 0 on success, errno otherwise      << 
503  */                                            << 
504 int gfs2_find_jhead(struct gfs2_jdesc *jd, str << 
505                     bool keep_cache)           << 
506 {                                              << 
507         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ << 
508         struct address_space *mapping = jd->jd << 
509         unsigned int block = 0, blocks_submitt << 
510         unsigned int bsize = sdp->sd_sb.sb_bsi << 
511         unsigned int bsize_shift = sdp->sd_sb. << 
512         unsigned int shift = PAGE_SHIFT - bsiz << 
513         unsigned int max_blocks = 2 * 1024 * 1 << 
514         struct gfs2_journal_extent *je;        << 
515         int sz, ret = 0;                       << 
516         struct bio *bio = NULL;                << 
517         struct page *page = NULL;              << 
518         bool done = false;                     << 
519         errseq_t since;                        << 
520                                                << 
521         memset(head, 0, sizeof(*head));        << 
522         if (list_empty(&jd->extent_list))      << 
523                 gfs2_map_journal_extents(sdp,  << 
524                                                << 
525         since = filemap_sample_wb_err(mapping) << 
526         list_for_each_entry(je, &jd->extent_li << 
527                 u64 dblock = je->dblock;       << 
528                                                << 
529                 for (; block < je->lblock + je << 
530                         if (!page) {           << 
531                                 page = grab_ca << 
532                                 if (!page) {   << 
533                                         ret =  << 
534                                         done = << 
535                                         goto o << 
536                                 }              << 
537                                 off = 0;       << 
538                         }                      << 
539                                                << 
540                         if (bio && (off || blo << 
541                                 sector_t secto << 
542                                                << 
543                                 if (bio_end_se << 
544                                         sz = b << 
545                                         if (sz << 
546                                                << 
547                                 }              << 
548                                 if (off) {     << 
549                                         unsign << 
550                                                << 
551                                                << 
552                                         bio =  << 
553                                         goto a << 
554                                 }              << 
555                         }                      << 
556                                                << 
557                         if (bio) {             << 
558                                 blocks_submitt << 
559                                 submit_bio(bio << 
560                         }                      << 
561                                                << 
562                         bio = gfs2_log_alloc_b << 
563                         bio->bi_opf = REQ_OP_R << 
564 add_block_to_new_bio:                          << 
565                         sz = bio_add_page(bio, << 
566                         BUG_ON(sz != bsize);   << 
567 block_added:                                   << 
568                         off += bsize;          << 
569                         if (off == PAGE_SIZE)  << 
570                                 page = NULL;   << 
571                         if (blocks_submitted < << 
572                                 /* Keep at lea << 
573                                 continue;      << 
574                         }                      << 
575                                                << 
576                         gfs2_jhead_process_pag << 
577                         blocks_read += PAGE_SI << 
578                         if (done)              << 
579                                 goto out;  /*  << 
580                 }                              << 
581         }                                      << 
582                                                << 
583 out:                                           << 
584         if (bio)                               << 
585                 submit_bio(bio);               << 
586         while (blocks_read < block) {          << 
587                 gfs2_jhead_process_page(jd, bl << 
588                 blocks_read += PAGE_SIZE >> bs << 
589         }                                      << 
590                                                << 
591         if (!ret)                              << 
592                 ret = filemap_check_wb_err(map << 
593                                                << 
594         if (!keep_cache)                       << 
595                 truncate_inode_pages(mapping,  << 
596                                                << 
597         return ret;                            << 
598 }                                              << 
599                                                   116 
600 static struct page *gfs2_get_log_desc(struct g !! 117 static struct buffer_head *gfs2_get_log_desc(struct gfs2_sbd *sdp, u32 ld_type)
601                                       u32 ld_l << 
602 {                                                 118 {
603         struct page *page = mempool_alloc(gfs2 !! 119         struct buffer_head *bh = gfs2_log_get_buf(sdp);
604         struct gfs2_log_descriptor *ld = page_ !! 120         struct gfs2_log_descriptor *ld = bh_log_desc(bh);
605         clear_page(ld);                        << 
606         ld->ld_header.mh_magic = cpu_to_be32(G    121         ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
607         ld->ld_header.mh_type = cpu_to_be32(GF    122         ld->ld_header.mh_type = cpu_to_be32(GFS2_METATYPE_LD);
608         ld->ld_header.mh_format = cpu_to_be32(    123         ld->ld_header.mh_format = cpu_to_be32(GFS2_FORMAT_LD);
609         ld->ld_type = cpu_to_be32(ld_type);       124         ld->ld_type = cpu_to_be32(ld_type);
610         ld->ld_length = cpu_to_be32(ld_length) !! 125         ld->ld_length = 0;
611         ld->ld_data1 = cpu_to_be32(ld_data1);  !! 126         ld->ld_data1 = 0;
612         ld->ld_data2 = 0;                         127         ld->ld_data2 = 0;
613         return page;                           !! 128         memset(ld->ld_reserved, 0, sizeof(ld->ld_reserved));
                                                   >> 129         return bh;
614 }                                                 130 }
615                                                   131 
616 static void gfs2_check_magic(struct buffer_hea !! 132 static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
617 {                                              << 
618         void *kaddr;                           << 
619         __be32 *ptr;                           << 
620                                                << 
621         clear_buffer_escaped(bh);              << 
622         kaddr = kmap_local_page(bh->b_page);   << 
623         ptr = kaddr + bh_offset(bh);           << 
624         if (*ptr == cpu_to_be32(GFS2_MAGIC))   << 
625                 set_buffer_escaped(bh);        << 
626         kunmap_local(kaddr);                   << 
627 }                                              << 
628                                                << 
629 static int blocknr_cmp(void *priv, const struc << 
630                        const struct list_head  << 
631 {                                                 133 {
632         struct gfs2_bufdata *bda, *bdb;        !! 134         struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le);
633                                                !! 135         struct gfs2_trans *tr;
634         bda = list_entry(a, struct gfs2_bufdat << 
635         bdb = list_entry(b, struct gfs2_bufdat << 
636                                                   136 
637         if (bda->bd_bh->b_blocknr < bdb->bd_bh !! 137         lock_buffer(bd->bd_bh);
638                 return -1;                     !! 138         gfs2_log_lock(sdp);
639         if (bda->bd_bh->b_blocknr > bdb->bd_bh !! 139         if (!list_empty(&bd->bd_list_tr))
640                 return 1;                      !! 140                 goto out;
641         return 0;                              !! 141         tr = current->journal_info;
                                                   >> 142         tr->tr_touched = 1;
                                                   >> 143         tr->tr_num_buf++;
                                                   >> 144         list_add(&bd->bd_list_tr, &tr->tr_list_buf);
                                                   >> 145         if (!list_empty(&le->le_list))
                                                   >> 146                 goto out;
                                                   >> 147         set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
                                                   >> 148         set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);
                                                   >> 149         gfs2_meta_check(sdp, bd->bd_bh);
                                                   >> 150         gfs2_pin(sdp, bd->bd_bh);
                                                   >> 151         sdp->sd_log_num_buf++;
                                                   >> 152         list_add(&le->le_list, &sdp->sd_log_le_buf);
                                                   >> 153         tr->tr_num_buf_new++;
                                                   >> 154 out:
                                                   >> 155         gfs2_log_unlock(sdp);
                                                   >> 156         unlock_buffer(bd->bd_bh);
642 }                                                 157 }
643                                                   158 
644 static void gfs2_before_commit(struct gfs2_sbd !! 159 static void buf_lo_before_commit(struct gfs2_sbd *sdp)
645                                 unsigned int t << 
646                                 bool is_databu << 
647 {                                                 160 {
                                                   >> 161         struct buffer_head *bh;
648         struct gfs2_log_descriptor *ld;           162         struct gfs2_log_descriptor *ld;
649         struct gfs2_bufdata *bd1 = NULL, *bd2;    163         struct gfs2_bufdata *bd1 = NULL, *bd2;
650         struct page *page;                     !! 164         unsigned int total;
                                                   >> 165         unsigned int limit;
651         unsigned int num;                         166         unsigned int num;
652         unsigned n;                               167         unsigned n;
653         __be64 *ptr;                              168         __be64 *ptr;
654                                                   169 
                                                   >> 170         limit = buf_limit(sdp);
                                                   >> 171         /* for 4k blocks, limit = 503 */
                                                   >> 172 
655         gfs2_log_lock(sdp);                       173         gfs2_log_lock(sdp);
656         list_sort(NULL, blist, blocknr_cmp);   !! 174         total = sdp->sd_log_num_buf;
657         bd1 = bd2 = list_prepare_entry(bd1, bl !! 175         bd1 = bd2 = list_prepare_entry(bd1, &sdp->sd_log_le_buf, bd_le.le_list);
658         while(total) {                            176         while(total) {
659                 num = total;                      177                 num = total;
660                 if (total > limit)                178                 if (total > limit)
661                         num = limit;              179                         num = limit;
662                 gfs2_log_unlock(sdp);             180                 gfs2_log_unlock(sdp);
663                 page = gfs2_get_log_desc(sdp,  !! 181                 bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_METADATA);
664                                          is_da << 
665                                          GFS2_ << 
666                 ld = page_address(page);       << 
667                 gfs2_log_lock(sdp);               182                 gfs2_log_lock(sdp);
668                 ptr = (__be64 *)(ld + 1);      !! 183                 ld = bh_log_desc(bh);
                                                   >> 184                 ptr = bh_log_ptr(bh);
                                                   >> 185                 ld->ld_length = cpu_to_be32(num + 1);
                                                   >> 186                 ld->ld_data1 = cpu_to_be32(num);
669                                                   187 
670                 n = 0;                            188                 n = 0;
671                 list_for_each_entry_continue(b !! 189                 list_for_each_entry_continue(bd1, &sdp->sd_log_le_buf,
                                                   >> 190                                              bd_le.le_list) {
672                         *ptr++ = cpu_to_be64(b    191                         *ptr++ = cpu_to_be64(bd1->bd_bh->b_blocknr);
673                         if (is_databuf) {      << 
674                                 gfs2_check_mag << 
675                                 *ptr++ = cpu_t << 
676                         }                      << 
677                         if (++n >= num)           192                         if (++n >= num)
678                                 break;            193                                 break;
679                 }                                 194                 }
680                                                   195 
681                 gfs2_log_unlock(sdp);             196                 gfs2_log_unlock(sdp);
682                 gfs2_log_write_page(sdp, page) !! 197                 submit_bh(WRITE_SYNC_PLUG, bh);
683                 gfs2_log_lock(sdp);               198                 gfs2_log_lock(sdp);
684                                                   199 
685                 n = 0;                            200                 n = 0;
686                 list_for_each_entry_continue(b !! 201                 list_for_each_entry_continue(bd2, &sdp->sd_log_le_buf,
                                                   >> 202                                              bd_le.le_list) {
687                         get_bh(bd2->bd_bh);       203                         get_bh(bd2->bd_bh);
688                         gfs2_log_unlock(sdp);     204                         gfs2_log_unlock(sdp);
689                         lock_buffer(bd2->bd_bh    205                         lock_buffer(bd2->bd_bh);
690                                                !! 206                         bh = gfs2_log_fake_buf(sdp, bd2->bd_bh);
691                         if (buffer_escaped(bd2 !! 207                         submit_bh(WRITE_SYNC_PLUG, bh);
692                                 void *p;       << 
693                                                << 
694                                 page = mempool << 
695                                 p = page_addre << 
696                                 memcpy_from_pa << 
697                                 *(__be32 *)p = << 
698                                 clear_buffer_e << 
699                                 unlock_buffer( << 
700                                 brelse(bd2->bd << 
701                                 gfs2_log_write << 
702                         } else {               << 
703                                 gfs2_log_write << 
704                         }                      << 
705                         gfs2_log_lock(sdp);       208                         gfs2_log_lock(sdp);
706                         if (++n >= num)           209                         if (++n >= num)
707                                 break;            210                                 break;
708                 }                                 211                 }
709                                                   212 
710                 BUG_ON(total < num);              213                 BUG_ON(total < num);
711                 total -= num;                     214                 total -= num;
712         }                                         215         }
713         gfs2_log_unlock(sdp);                     216         gfs2_log_unlock(sdp);
714 }                                                 217 }
715                                                   218 
716 static void buf_lo_before_commit(struct gfs2_s !! 219 static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
717 {                                              << 
718         unsigned int limit = buf_limit(sdp); / << 
719         unsigned int nbuf;                     << 
720         if (tr == NULL)                        << 
721                 return;                        << 
722         nbuf = tr->tr_num_buf_new - tr->tr_num << 
723         gfs2_before_commit(sdp, limit, nbuf, & << 
724 }                                              << 
725                                                << 
726 static void buf_lo_after_commit(struct gfs2_sb << 
727 {                                                 220 {
728         struct list_head *head;                !! 221         struct list_head *head = &sdp->sd_log_le_buf;
729         struct gfs2_bufdata *bd;                  222         struct gfs2_bufdata *bd;
730                                                   223 
731         if (tr == NULL)                        << 
732                 return;                        << 
733                                                << 
734         head = &tr->tr_buf;                    << 
735         while (!list_empty(head)) {               224         while (!list_empty(head)) {
736                 bd = list_first_entry(head, st !! 225                 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
737                 list_del_init(&bd->bd_list);   !! 226                 list_del_init(&bd->bd_le.le_list);
738                 gfs2_unpin(sdp, bd->bd_bh, tr) !! 227                 sdp->sd_log_num_buf--;
                                                   >> 228 
                                                   >> 229                 gfs2_unpin(sdp, bd->bd_bh, ai);
739         }                                         230         }
                                                   >> 231         gfs2_assert_warn(sdp, !sdp->sd_log_num_buf);
740 }                                                 232 }
741                                                   233 
742 static void buf_lo_before_scan(struct gfs2_jde    234 static void buf_lo_before_scan(struct gfs2_jdesc *jd,
743                                struct gfs2_log    235                                struct gfs2_log_header_host *head, int pass)
744 {                                                 236 {
                                                   >> 237         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
                                                   >> 238 
745         if (pass != 0)                            239         if (pass != 0)
746                 return;                           240                 return;
747                                                   241 
748         jd->jd_found_blocks = 0;               !! 242         sdp->sd_found_blocks = 0;
749         jd->jd_replayed_blocks = 0;            !! 243         sdp->sd_replayed_blocks = 0;
750 }                                                 244 }
751                                                   245 
752 #define obsolete_rgrp_replay \                 !! 246 static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
753 "Replaying 0x%llx from jid=%d/0x%llx but we al << 
754 #define obsolete_rgrp_replay2 \                << 
755 "busy:%d, pinned:%d rg_gen:0x%llx, j_gen:0x%ll << 
756                                                << 
757 static void obsolete_rgrp(struct gfs2_jdesc *j << 
758                           u64 blkno)           << 
759 {                                              << 
760         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_ << 
761         struct gfs2_rgrpd *rgd;                << 
762         struct gfs2_rgrp *jrgd = (struct gfs2_ << 
763                                                << 
764         rgd = gfs2_blk2rgrpd(sdp, blkno, false << 
765         if (rgd && rgd->rd_addr == blkno &&    << 
766             rgd->rd_bits && rgd->rd_bits->bi_b << 
767                 fs_info(sdp, obsolete_rgrp_rep << 
768                         jd->jd_jid, bh_log->b_ << 
769                 fs_info(sdp, obsolete_rgrp_rep << 
770                         buffer_busy(rgd->rd_bi << 
771                         buffer_pinned(rgd->rd_ << 
772                         rgd->rd_igeneration,   << 
773                         be64_to_cpu(jrgd->rg_i << 
774                 gfs2_dump_glock(NULL, rgd->rd_ << 
775         }                                      << 
776 }                                              << 
777                                                << 
778 static int buf_lo_scan_elements(struct gfs2_jd << 
779                                 struct gfs2_lo    247                                 struct gfs2_log_descriptor *ld, __be64 *ptr,
780                                 int pass)         248                                 int pass)
781 {                                                 249 {
782         struct gfs2_inode *ip = GFS2_I(jd->jd_    250         struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
783         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    251         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
784         struct gfs2_glock *gl = ip->i_gl;         252         struct gfs2_glock *gl = ip->i_gl;
785         unsigned int blks = be32_to_cpu(ld->ld    253         unsigned int blks = be32_to_cpu(ld->ld_data1);
786         struct buffer_head *bh_log, *bh_ip;       254         struct buffer_head *bh_log, *bh_ip;
787         u64 blkno;                                255         u64 blkno;
788         int error = 0;                            256         int error = 0;
789                                                   257 
790         if (pass != 1 || be32_to_cpu(ld->ld_ty    258         if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_METADATA)
791                 return 0;                         259                 return 0;
792                                                   260 
793         gfs2_replay_incr_blk(jd, &start);      !! 261         gfs2_replay_incr_blk(sdp, &start);
794                                                   262 
795         for (; blks; gfs2_replay_incr_blk(jd,  !! 263         for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
796                 blkno = be64_to_cpu(*ptr++);      264                 blkno = be64_to_cpu(*ptr++);
797                                                   265 
798                 jd->jd_found_blocks++;         !! 266                 sdp->sd_found_blocks++;
799                                                   267 
800                 if (gfs2_revoke_check(jd, blkn !! 268                 if (gfs2_revoke_check(sdp, blkno, start))
801                         continue;                 269                         continue;
802                                                   270 
803                 error = gfs2_replay_read_block    271                 error = gfs2_replay_read_block(jd, start, &bh_log);
804                 if (error)                        272                 if (error)
805                         return error;             273                         return error;
806                                                   274 
807                 bh_ip = gfs2_meta_new(gl, blkn    275                 bh_ip = gfs2_meta_new(gl, blkno);
808                 memcpy(bh_ip->b_data, bh_log->    276                 memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size);
809                                                   277 
810                 if (gfs2_meta_check(sdp, bh_ip    278                 if (gfs2_meta_check(sdp, bh_ip))
811                         error = -EIO;             279                         error = -EIO;
812                 else {                         !! 280                 else
813                         struct gfs2_meta_heade << 
814                                 (struct gfs2_m << 
815                                                << 
816                         if (mh->mh_type == cpu << 
817                                 obsolete_rgrp( << 
818                                                << 
819                         mark_buffer_dirty(bh_i    281                         mark_buffer_dirty(bh_ip);
820                 }                              !! 282 
821                 brelse(bh_log);                   283                 brelse(bh_log);
822                 brelse(bh_ip);                    284                 brelse(bh_ip);
823                                                   285 
824                 if (error)                        286                 if (error)
825                         break;                    287                         break;
826                                                   288 
827                 jd->jd_replayed_blocks++;      !! 289                 sdp->sd_replayed_blocks++;
828         }                                         290         }
829                                                   291 
830         return error;                             292         return error;
831 }                                                 293 }
832                                                   294 
833 static void buf_lo_after_scan(struct gfs2_jdes    295 static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
834 {                                                 296 {
835         struct gfs2_inode *ip = GFS2_I(jd->jd_    297         struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
836         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    298         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
837                                                   299 
838         if (error) {                              300         if (error) {
839                 gfs2_inode_metasync(ip->i_gl); !! 301                 gfs2_meta_sync(ip->i_gl);
840                 return;                           302                 return;
841         }                                         303         }
842         if (pass != 1)                            304         if (pass != 1)
843                 return;                           305                 return;
844                                                   306 
845         gfs2_inode_metasync(ip->i_gl);         !! 307         gfs2_meta_sync(ip->i_gl);
846                                                   308 
847         fs_info(sdp, "jid=%u: Replayed %u of %    309         fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n",
848                 jd->jd_jid, jd->jd_replayed_bl !! 310                 jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
849 }                                                 311 }
850                                                   312 
851 static void revoke_lo_before_commit(struct gfs !! 313 static void revoke_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
852 {                                                 314 {
                                                   >> 315         struct gfs2_trans *tr;
                                                   >> 316 
                                                   >> 317         tr = current->journal_info;
                                                   >> 318         tr->tr_touched = 1;
                                                   >> 319         tr->tr_num_revoke++;
                                                   >> 320         sdp->sd_log_num_revoke++;
                                                   >> 321         list_add(&le->le_list, &sdp->sd_log_le_revoke);
                                                   >> 322 }
                                                   >> 323 
                                                   >> 324 static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
                                                   >> 325 {
                                                   >> 326         struct gfs2_log_descriptor *ld;
853         struct gfs2_meta_header *mh;              327         struct gfs2_meta_header *mh;
                                                   >> 328         struct buffer_head *bh;
854         unsigned int offset;                      329         unsigned int offset;
855         struct list_head *head = &sdp->sd_log_ !! 330         struct list_head *head = &sdp->sd_log_le_revoke;
856         struct gfs2_bufdata *bd;                  331         struct gfs2_bufdata *bd;
857         struct page *page;                     << 
858         unsigned int length;                   << 
859                                                   332 
860         gfs2_flush_revokes(sdp);               << 
861         if (!sdp->sd_log_num_revoke)              333         if (!sdp->sd_log_num_revoke)
862                 return;                           334                 return;
863                                                   335 
864         length = gfs2_struct2blk(sdp, sdp->sd_ !! 336         bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE);
865         page = gfs2_get_log_desc(sdp, GFS2_LOG !! 337         ld = bh_log_desc(bh);
                                                   >> 338         ld->ld_length = cpu_to_be32(gfs2_struct2blk(sdp, sdp->sd_log_num_revoke,
                                                   >> 339                                                     sizeof(u64)));
                                                   >> 340         ld->ld_data1 = cpu_to_be32(sdp->sd_log_num_revoke);
866         offset = sizeof(struct gfs2_log_descri    341         offset = sizeof(struct gfs2_log_descriptor);
867                                                   342 
868         list_for_each_entry(bd, head, bd_list) !! 343         while (!list_empty(head)) {
                                                   >> 344                 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
                                                   >> 345                 list_del_init(&bd->bd_le.le_list);
869                 sdp->sd_log_num_revoke--;         346                 sdp->sd_log_num_revoke--;
870                                                   347 
871                 if (offset + sizeof(u64) > sdp    348                 if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) {
872                         gfs2_log_write_page(sd !! 349                         submit_bh(WRITE_SYNC_PLUG, bh);
873                         page = mempool_alloc(g !! 350 
874                         mh = page_address(page !! 351                         bh = gfs2_log_get_buf(sdp);
875                         clear_page(mh);        !! 352                         mh = (struct gfs2_meta_header *)bh->b_data;
876                         mh->mh_magic = cpu_to_    353                         mh->mh_magic = cpu_to_be32(GFS2_MAGIC);
877                         mh->mh_type = cpu_to_b    354                         mh->mh_type = cpu_to_be32(GFS2_METATYPE_LB);
878                         mh->mh_format = cpu_to    355                         mh->mh_format = cpu_to_be32(GFS2_FORMAT_LB);
879                         offset = sizeof(struct    356                         offset = sizeof(struct gfs2_meta_header);
880                 }                                 357                 }
881                                                   358 
882                 *(__be64 *)(page_address(page) !! 359                 *(__be64 *)(bh->b_data + offset) = cpu_to_be64(bd->bd_blkno);
                                                   >> 360                 kmem_cache_free(gfs2_bufdata_cachep, bd);
                                                   >> 361 
883                 offset += sizeof(u64);            362                 offset += sizeof(u64);
884         }                                         363         }
885         gfs2_assert_withdraw(sdp, !sdp->sd_log    364         gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke);
886                                                   365 
887         gfs2_log_write_page(sdp, page);        !! 366         submit_bh(WRITE_SYNC_PLUG, bh);
888 }                                              << 
889                                                << 
890 void gfs2_drain_revokes(struct gfs2_sbd *sdp)  << 
891 {                                              << 
892         struct list_head *head = &sdp->sd_log_ << 
893         struct gfs2_bufdata *bd;               << 
894         struct gfs2_glock *gl;                 << 
895                                                << 
896         while (!list_empty(head)) {            << 
897                 bd = list_first_entry(head, st << 
898                 list_del_init(&bd->bd_list);   << 
899                 gl = bd->bd_gl;                << 
900                 gfs2_glock_remove_revoke(gl);  << 
901                 kmem_cache_free(gfs2_bufdata_c << 
902         }                                      << 
903 }                                              << 
904                                                << 
905 static void revoke_lo_after_commit(struct gfs2 << 
906 {                                              << 
907         gfs2_drain_revokes(sdp);               << 
908 }                                                 367 }
909                                                   368 
910 static void revoke_lo_before_scan(struct gfs2_    369 static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
911                                   struct gfs2_    370                                   struct gfs2_log_header_host *head, int pass)
912 {                                                 371 {
                                                   >> 372         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
                                                   >> 373 
913         if (pass != 0)                            374         if (pass != 0)
914                 return;                           375                 return;
915                                                   376 
916         jd->jd_found_revokes = 0;              !! 377         sdp->sd_found_revokes = 0;
917         jd->jd_replay_tail = head->lh_tail;    !! 378         sdp->sd_replay_tail = head->lh_tail;
918 }                                                 379 }
919                                                   380 
920 static int revoke_lo_scan_elements(struct gfs2 !! 381 static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
921                                    struct gfs2    382                                    struct gfs2_log_descriptor *ld, __be64 *ptr,
922                                    int pass)      383                                    int pass)
923 {                                                 384 {
924         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    385         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
925         unsigned int blks = be32_to_cpu(ld->ld    386         unsigned int blks = be32_to_cpu(ld->ld_length);
926         unsigned int revokes = be32_to_cpu(ld-    387         unsigned int revokes = be32_to_cpu(ld->ld_data1);
927         struct buffer_head *bh;                   388         struct buffer_head *bh;
928         unsigned int offset;                      389         unsigned int offset;
929         u64 blkno;                                390         u64 blkno;
930         int first = 1;                            391         int first = 1;
931         int error;                                392         int error;
932                                                   393 
933         if (pass != 0 || be32_to_cpu(ld->ld_ty    394         if (pass != 0 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_REVOKE)
934                 return 0;                         395                 return 0;
935                                                   396 
936         offset = sizeof(struct gfs2_log_descri    397         offset = sizeof(struct gfs2_log_descriptor);
937                                                   398 
938         for (; blks; gfs2_replay_incr_blk(jd,  !! 399         for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
939                 error = gfs2_replay_read_block    400                 error = gfs2_replay_read_block(jd, start, &bh);
940                 if (error)                        401                 if (error)
941                         return error;             402                         return error;
942                                                   403 
943                 if (!first)                       404                 if (!first)
944                         gfs2_metatype_check(sd    405                         gfs2_metatype_check(sdp, bh, GFS2_METATYPE_LB);
945                                                   406 
946                 while (offset + sizeof(u64) <=    407                 while (offset + sizeof(u64) <= sdp->sd_sb.sb_bsize) {
947                         blkno = be64_to_cpu(*(    408                         blkno = be64_to_cpu(*(__be64 *)(bh->b_data + offset));
948                                                   409 
949                         error = gfs2_revoke_ad !! 410                         error = gfs2_revoke_add(sdp, blkno, start);
950                         if (error < 0) {          411                         if (error < 0) {
951                                 brelse(bh);       412                                 brelse(bh);
952                                 return error;     413                                 return error;
953                         }                         414                         }
954                         else if (error)           415                         else if (error)
955                                 jd->jd_found_r !! 416                                 sdp->sd_found_revokes++;
956                                                   417 
957                         if (!--revokes)           418                         if (!--revokes)
958                                 break;            419                                 break;
959                         offset += sizeof(u64);    420                         offset += sizeof(u64);
960                 }                                 421                 }
961                                                   422 
962                 brelse(bh);                       423                 brelse(bh);
963                 offset = sizeof(struct gfs2_me    424                 offset = sizeof(struct gfs2_meta_header);
964                 first = 0;                        425                 first = 0;
965         }                                         426         }
966                                                   427 
967         return 0;                                 428         return 0;
968 }                                                 429 }
969                                                   430 
970 static void revoke_lo_after_scan(struct gfs2_j    431 static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
971 {                                                 432 {
972         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    433         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
973                                                   434 
974         if (error) {                              435         if (error) {
975                 gfs2_revoke_clean(jd);         !! 436                 gfs2_revoke_clean(sdp);
976                 return;                           437                 return;
977         }                                         438         }
978         if (pass != 1)                            439         if (pass != 1)
979                 return;                           440                 return;
980                                                   441 
981         fs_info(sdp, "jid=%u: Found %u revoke     442         fs_info(sdp, "jid=%u: Found %u revoke tags\n",
982                 jd->jd_jid, jd->jd_found_revok !! 443                 jd->jd_jid, sdp->sd_found_revokes);
983                                                   444 
984         gfs2_revoke_clean(jd);                 !! 445         gfs2_revoke_clean(sdp);
                                                   >> 446 }
                                                   >> 447 
                                                   >> 448 static void rg_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
                                                   >> 449 {
                                                   >> 450         struct gfs2_rgrpd *rgd;
                                                   >> 451         struct gfs2_trans *tr = current->journal_info;
                                                   >> 452 
                                                   >> 453         tr->tr_touched = 1;
                                                   >> 454 
                                                   >> 455         rgd = container_of(le, struct gfs2_rgrpd, rd_le);
                                                   >> 456 
                                                   >> 457         gfs2_log_lock(sdp);
                                                   >> 458         if (!list_empty(&le->le_list)){
                                                   >> 459                 gfs2_log_unlock(sdp);
                                                   >> 460                 return;
                                                   >> 461         }
                                                   >> 462         gfs2_rgrp_bh_hold(rgd);
                                                   >> 463         sdp->sd_log_num_rg++;
                                                   >> 464         list_add(&le->le_list, &sdp->sd_log_le_rg);
                                                   >> 465         gfs2_log_unlock(sdp);
                                                   >> 466 }
                                                   >> 467 
                                                   >> 468 static void rg_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
                                                   >> 469 {
                                                   >> 470         struct list_head *head = &sdp->sd_log_le_rg;
                                                   >> 471         struct gfs2_rgrpd *rgd;
                                                   >> 472 
                                                   >> 473         while (!list_empty(head)) {
                                                   >> 474                 rgd = list_entry(head->next, struct gfs2_rgrpd, rd_le.le_list);
                                                   >> 475                 list_del_init(&rgd->rd_le.le_list);
                                                   >> 476                 sdp->sd_log_num_rg--;
                                                   >> 477 
                                                   >> 478                 gfs2_rgrp_repolish_clones(rgd);
                                                   >> 479                 gfs2_rgrp_bh_put(rgd);
                                                   >> 480         }
                                                   >> 481         gfs2_assert_warn(sdp, !sdp->sd_log_num_rg);
985 }                                                 482 }
986                                                   483 
987 /**                                               484 /**
988  * databuf_lo_before_commit - Scan the data bu !! 485  * databuf_lo_add - Add a databuf to the transaction.
989  * @sdp: The filesystem                        !! 486  *
990  * @tr: The system transaction being flushed   !! 487  * This is used in two distinct cases:
                                                   >> 488  * i) In ordered write mode
                                                   >> 489  *    We put the data buffer on a list so that we can ensure that its
                                                   >> 490  *    synced to disk at the right time
                                                   >> 491  * ii) In journaled data mode
                                                   >> 492  *    We need to journal the data block in the same way as metadata in
                                                   >> 493  *    the functions above. The difference is that here we have a tag
                                                   >> 494  *    which is two __be64's being the block number (as per meta data)
                                                   >> 495  *    and a flag which says whether the data block needs escaping or
                                                   >> 496  *    not. This means we need a new log entry for each 251 or so data
                                                   >> 497  *    blocks, which isn't an enormous overhead but twice as much as
                                                   >> 498  *    for normal metadata blocks.
991  */                                               499  */
                                                   >> 500 static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
                                                   >> 501 {
                                                   >> 502         struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le);
                                                   >> 503         struct gfs2_trans *tr = current->journal_info;
                                                   >> 504         struct address_space *mapping = bd->bd_bh->b_page->mapping;
                                                   >> 505         struct gfs2_inode *ip = GFS2_I(mapping->host);
                                                   >> 506 
                                                   >> 507         lock_buffer(bd->bd_bh);
                                                   >> 508         gfs2_log_lock(sdp);
                                                   >> 509         if (tr) {
                                                   >> 510                 if (!list_empty(&bd->bd_list_tr))
                                                   >> 511                         goto out;
                                                   >> 512                 tr->tr_touched = 1;
                                                   >> 513                 if (gfs2_is_jdata(ip)) {
                                                   >> 514                         tr->tr_num_buf++;
                                                   >> 515                         list_add(&bd->bd_list_tr, &tr->tr_list_buf);
                                                   >> 516                 }
                                                   >> 517         }
                                                   >> 518         if (!list_empty(&le->le_list))
                                                   >> 519                 goto out;
                                                   >> 520 
                                                   >> 521         set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
                                                   >> 522         set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);
                                                   >> 523         if (gfs2_is_jdata(ip)) {
                                                   >> 524                 gfs2_pin(sdp, bd->bd_bh);
                                                   >> 525                 tr->tr_num_databuf_new++;
                                                   >> 526                 sdp->sd_log_num_databuf++;
                                                   >> 527                 list_add(&le->le_list, &sdp->sd_log_le_databuf);
                                                   >> 528         } else {
                                                   >> 529                 list_add(&le->le_list, &sdp->sd_log_le_ordered);
                                                   >> 530         }
                                                   >> 531 out:
                                                   >> 532         gfs2_log_unlock(sdp);
                                                   >> 533         unlock_buffer(bd->bd_bh);
                                                   >> 534 }
992                                                   535 
993 static void databuf_lo_before_commit(struct gf !! 536 static void gfs2_check_magic(struct buffer_head *bh)
994 {                                                 537 {
995         unsigned int limit = databuf_limit(sdp !! 538         void *kaddr;
996         unsigned int nbuf;                     !! 539         __be32 *ptr;
997         if (tr == NULL)                        !! 540 
                                                   >> 541         clear_buffer_escaped(bh);
                                                   >> 542         kaddr = kmap_atomic(bh->b_page, KM_USER0);
                                                   >> 543         ptr = kaddr + bh_offset(bh);
                                                   >> 544         if (*ptr == cpu_to_be32(GFS2_MAGIC))
                                                   >> 545                 set_buffer_escaped(bh);
                                                   >> 546         kunmap_atomic(kaddr, KM_USER0);
                                                   >> 547 }
                                                   >> 548 
                                                   >> 549 static void gfs2_write_blocks(struct gfs2_sbd *sdp, struct buffer_head *bh,
                                                   >> 550                               struct list_head *list, struct list_head *done,
                                                   >> 551                               unsigned int n)
                                                   >> 552 {
                                                   >> 553         struct buffer_head *bh1;
                                                   >> 554         struct gfs2_log_descriptor *ld;
                                                   >> 555         struct gfs2_bufdata *bd;
                                                   >> 556         __be64 *ptr;
                                                   >> 557 
                                                   >> 558         if (!bh)
998                 return;                           559                 return;
999         nbuf = tr->tr_num_databuf_new - tr->tr !! 560 
1000         gfs2_before_commit(sdp, limit, nbuf,  !! 561         ld = bh_log_desc(bh);
                                                   >> 562         ld->ld_length = cpu_to_be32(n + 1);
                                                   >> 563         ld->ld_data1 = cpu_to_be32(n);
                                                   >> 564 
                                                   >> 565         ptr = bh_log_ptr(bh);
                                                   >> 566         
                                                   >> 567         get_bh(bh);
                                                   >> 568         submit_bh(WRITE_SYNC_PLUG, bh);
                                                   >> 569         gfs2_log_lock(sdp);
                                                   >> 570         while(!list_empty(list)) {
                                                   >> 571                 bd = list_entry(list->next, struct gfs2_bufdata, bd_le.le_list);
                                                   >> 572                 list_move_tail(&bd->bd_le.le_list, done);
                                                   >> 573                 get_bh(bd->bd_bh);
                                                   >> 574                 while (be64_to_cpu(*ptr) != bd->bd_bh->b_blocknr) {
                                                   >> 575                         gfs2_log_incr_head(sdp);
                                                   >> 576                         ptr += 2;
                                                   >> 577                 }
                                                   >> 578                 gfs2_log_unlock(sdp);
                                                   >> 579                 lock_buffer(bd->bd_bh);
                                                   >> 580                 if (buffer_escaped(bd->bd_bh)) {
                                                   >> 581                         void *kaddr;
                                                   >> 582                         bh1 = gfs2_log_get_buf(sdp);
                                                   >> 583                         kaddr = kmap_atomic(bd->bd_bh->b_page, KM_USER0);
                                                   >> 584                         memcpy(bh1->b_data, kaddr + bh_offset(bd->bd_bh),
                                                   >> 585                                bh1->b_size);
                                                   >> 586                         kunmap_atomic(kaddr, KM_USER0);
                                                   >> 587                         *(__be32 *)bh1->b_data = 0;
                                                   >> 588                         clear_buffer_escaped(bd->bd_bh);
                                                   >> 589                         unlock_buffer(bd->bd_bh);
                                                   >> 590                         brelse(bd->bd_bh);
                                                   >> 591                 } else {
                                                   >> 592                         bh1 = gfs2_log_fake_buf(sdp, bd->bd_bh);
                                                   >> 593                 }
                                                   >> 594                 submit_bh(WRITE_SYNC_PLUG, bh1);
                                                   >> 595                 gfs2_log_lock(sdp);
                                                   >> 596                 ptr += 2;
                                                   >> 597         }
                                                   >> 598         gfs2_log_unlock(sdp);
                                                   >> 599         brelse(bh);
                                                   >> 600 }
                                                   >> 601 
                                                   >> 602 /**
                                                   >> 603  * databuf_lo_before_commit - Scan the data buffers, writing as we go
                                                   >> 604  *
                                                   >> 605  */
                                                   >> 606 
                                                   >> 607 static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
                                                   >> 608 {
                                                   >> 609         struct gfs2_bufdata *bd = NULL;
                                                   >> 610         struct buffer_head *bh = NULL;
                                                   >> 611         unsigned int n = 0;
                                                   >> 612         __be64 *ptr = NULL, *end = NULL;
                                                   >> 613         LIST_HEAD(processed);
                                                   >> 614         LIST_HEAD(in_progress);
                                                   >> 615 
                                                   >> 616         gfs2_log_lock(sdp);
                                                   >> 617         while (!list_empty(&sdp->sd_log_le_databuf)) {
                                                   >> 618                 if (ptr == end) {
                                                   >> 619                         gfs2_log_unlock(sdp);
                                                   >> 620                         gfs2_write_blocks(sdp, bh, &in_progress, &processed, n);
                                                   >> 621                         n = 0;
                                                   >> 622                         bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_JDATA);
                                                   >> 623                         ptr = bh_log_ptr(bh);
                                                   >> 624                         end = bh_ptr_end(bh) - 1;
                                                   >> 625                         gfs2_log_lock(sdp);
                                                   >> 626                         continue;
                                                   >> 627                 }
                                                   >> 628                 bd = list_entry(sdp->sd_log_le_databuf.next, struct gfs2_bufdata, bd_le.le_list);
                                                   >> 629                 list_move_tail(&bd->bd_le.le_list, &in_progress);
                                                   >> 630                 gfs2_check_magic(bd->bd_bh);
                                                   >> 631                 *ptr++ = cpu_to_be64(bd->bd_bh->b_blocknr);
                                                   >> 632                 *ptr++ = cpu_to_be64(buffer_escaped(bh) ? 1 : 0);
                                                   >> 633                 n++;
                                                   >> 634         }
                                                   >> 635         gfs2_log_unlock(sdp);
                                                   >> 636         gfs2_write_blocks(sdp, bh, &in_progress, &processed, n);
                                                   >> 637         gfs2_log_lock(sdp);
                                                   >> 638         list_splice(&processed, &sdp->sd_log_le_databuf);
                                                   >> 639         gfs2_log_unlock(sdp);
1001 }                                                640 }
1002                                                  641 
1003 static int databuf_lo_scan_elements(struct gf !! 642 static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
1004                                     struct gf    643                                     struct gfs2_log_descriptor *ld,
1005                                     __be64 *p    644                                     __be64 *ptr, int pass)
1006 {                                                645 {
1007         struct gfs2_inode *ip = GFS2_I(jd->jd    646         struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
                                                   >> 647         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
1008         struct gfs2_glock *gl = ip->i_gl;        648         struct gfs2_glock *gl = ip->i_gl;
1009         unsigned int blks = be32_to_cpu(ld->l    649         unsigned int blks = be32_to_cpu(ld->ld_data1);
1010         struct buffer_head *bh_log, *bh_ip;      650         struct buffer_head *bh_log, *bh_ip;
1011         u64 blkno;                               651         u64 blkno;
1012         u64 esc;                                 652         u64 esc;
1013         int error = 0;                           653         int error = 0;
1014                                                  654 
1015         if (pass != 1 || be32_to_cpu(ld->ld_t    655         if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_JDATA)
1016                 return 0;                        656                 return 0;
1017                                                  657 
1018         gfs2_replay_incr_blk(jd, &start);     !! 658         gfs2_replay_incr_blk(sdp, &start);
1019         for (; blks; gfs2_replay_incr_blk(jd, !! 659         for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
1020                 blkno = be64_to_cpu(*ptr++);     660                 blkno = be64_to_cpu(*ptr++);
1021                 esc = be64_to_cpu(*ptr++);       661                 esc = be64_to_cpu(*ptr++);
1022                                                  662 
1023                 jd->jd_found_blocks++;        !! 663                 sdp->sd_found_blocks++;
1024                                                  664 
1025                 if (gfs2_revoke_check(jd, blk !! 665                 if (gfs2_revoke_check(sdp, blkno, start))
1026                         continue;                666                         continue;
1027                                                  667 
1028                 error = gfs2_replay_read_bloc    668                 error = gfs2_replay_read_block(jd, start, &bh_log);
1029                 if (error)                       669                 if (error)
1030                         return error;            670                         return error;
1031                                                  671 
1032                 bh_ip = gfs2_meta_new(gl, blk    672                 bh_ip = gfs2_meta_new(gl, blkno);
1033                 memcpy(bh_ip->b_data, bh_log-    673                 memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size);
1034                                                  674 
1035                 /* Unescape */                   675                 /* Unescape */
1036                 if (esc) {                       676                 if (esc) {
1037                         __be32 *eptr = (__be3    677                         __be32 *eptr = (__be32 *)bh_ip->b_data;
1038                         *eptr = cpu_to_be32(G    678                         *eptr = cpu_to_be32(GFS2_MAGIC);
1039                 }                                679                 }
1040                 mark_buffer_dirty(bh_ip);        680                 mark_buffer_dirty(bh_ip);
1041                                                  681 
1042                 brelse(bh_log);                  682                 brelse(bh_log);
1043                 brelse(bh_ip);                   683                 brelse(bh_ip);
                                                   >> 684                 if (error)
                                                   >> 685                         break;
1044                                                  686 
1045                 jd->jd_replayed_blocks++;     !! 687                 sdp->sd_replayed_blocks++;
1046         }                                        688         }
1047                                                  689 
1048         return error;                            690         return error;
1049 }                                                691 }
1050                                                  692 
1051 /* FIXME: sort out accounting for log blocks     693 /* FIXME: sort out accounting for log blocks etc. */
1052                                                  694 
1053 static void databuf_lo_after_scan(struct gfs2    695 static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
1054 {                                                696 {
1055         struct gfs2_inode *ip = GFS2_I(jd->jd    697         struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
1056         struct gfs2_sbd *sdp = GFS2_SB(jd->jd    698         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
1057                                                  699 
1058         if (error) {                             700         if (error) {
1059                 gfs2_inode_metasync(ip->i_gl) !! 701                 gfs2_meta_sync(ip->i_gl);
1060                 return;                          702                 return;
1061         }                                        703         }
1062         if (pass != 1)                           704         if (pass != 1)
1063                 return;                          705                 return;
1064                                                  706 
1065         /* data sync? */                         707         /* data sync? */
1066         gfs2_inode_metasync(ip->i_gl);        !! 708         gfs2_meta_sync(ip->i_gl);
1067                                                  709 
1068         fs_info(sdp, "jid=%u: Replayed %u of     710         fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n",
1069                 jd->jd_jid, jd->jd_replayed_b !! 711                 jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
1070 }                                                712 }
1071                                                  713 
1072 static void databuf_lo_after_commit(struct gf !! 714 static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
1073 {                                                715 {
1074         struct list_head *head;               !! 716         struct list_head *head = &sdp->sd_log_le_databuf;
1075         struct gfs2_bufdata *bd;                 717         struct gfs2_bufdata *bd;
1076                                                  718 
1077         if (tr == NULL)                       << 
1078                 return;                       << 
1079                                               << 
1080         head = &tr->tr_databuf;               << 
1081         while (!list_empty(head)) {              719         while (!list_empty(head)) {
1082                 bd = list_first_entry(head, s !! 720                 bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
1083                 list_del_init(&bd->bd_list);  !! 721                 list_del_init(&bd->bd_le.le_list);
1084                 gfs2_unpin(sdp, bd->bd_bh, tr !! 722                 sdp->sd_log_num_databuf--;
                                                   >> 723                 gfs2_unpin(sdp, bd->bd_bh, ai);
1085         }                                        724         }
                                                   >> 725         gfs2_assert_warn(sdp, !sdp->sd_log_num_databuf);
1086 }                                                726 }
1087                                                  727 
1088                                                  728 
1089 static const struct gfs2_log_operations gfs2_ !! 729 const struct gfs2_log_operations gfs2_buf_lops = {
                                                   >> 730         .lo_add = buf_lo_add,
1090         .lo_before_commit = buf_lo_before_com    731         .lo_before_commit = buf_lo_before_commit,
1091         .lo_after_commit = buf_lo_after_commi    732         .lo_after_commit = buf_lo_after_commit,
1092         .lo_before_scan = buf_lo_before_scan,    733         .lo_before_scan = buf_lo_before_scan,
1093         .lo_scan_elements = buf_lo_scan_eleme    734         .lo_scan_elements = buf_lo_scan_elements,
1094         .lo_after_scan = buf_lo_after_scan,      735         .lo_after_scan = buf_lo_after_scan,
1095         .lo_name = "buf",                        736         .lo_name = "buf",
1096 };                                               737 };
1097                                                  738 
1098 static const struct gfs2_log_operations gfs2_ !! 739 const struct gfs2_log_operations gfs2_revoke_lops = {
                                                   >> 740         .lo_add = revoke_lo_add,
1099         .lo_before_commit = revoke_lo_before_    741         .lo_before_commit = revoke_lo_before_commit,
1100         .lo_after_commit = revoke_lo_after_co << 
1101         .lo_before_scan = revoke_lo_before_sc    742         .lo_before_scan = revoke_lo_before_scan,
1102         .lo_scan_elements = revoke_lo_scan_el    743         .lo_scan_elements = revoke_lo_scan_elements,
1103         .lo_after_scan = revoke_lo_after_scan    744         .lo_after_scan = revoke_lo_after_scan,
1104         .lo_name = "revoke",                     745         .lo_name = "revoke",
1105 };                                               746 };
1106                                                  747 
1107 static const struct gfs2_log_operations gfs2_ !! 748 const struct gfs2_log_operations gfs2_rg_lops = {
                                                   >> 749         .lo_add = rg_lo_add,
                                                   >> 750         .lo_after_commit = rg_lo_after_commit,
                                                   >> 751         .lo_name = "rg",
                                                   >> 752 };
                                                   >> 753 
                                                   >> 754 const struct gfs2_log_operations gfs2_databuf_lops = {
                                                   >> 755         .lo_add = databuf_lo_add,
1108         .lo_before_commit = databuf_lo_before    756         .lo_before_commit = databuf_lo_before_commit,
1109         .lo_after_commit = databuf_lo_after_c    757         .lo_after_commit = databuf_lo_after_commit,
1110         .lo_scan_elements = databuf_lo_scan_e    758         .lo_scan_elements = databuf_lo_scan_elements,
1111         .lo_after_scan = databuf_lo_after_sca    759         .lo_after_scan = databuf_lo_after_scan,
1112         .lo_name = "databuf",                    760         .lo_name = "databuf",
1113 };                                               761 };
1114                                                  762 
1115 const struct gfs2_log_operations *gfs2_log_op    763 const struct gfs2_log_operations *gfs2_log_ops[] = {
1116         &gfs2_databuf_lops,                      764         &gfs2_databuf_lops,
1117         &gfs2_buf_lops,                          765         &gfs2_buf_lops,
                                                   >> 766         &gfs2_rg_lops,
1118         &gfs2_revoke_lops,                       767         &gfs2_revoke_lops,
1119         NULL,                                    768         NULL,
1120 };                                               769 };
1121                                                  770 
1122                                                  771 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php