~ [ 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-6.1.114)


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-only            1 
  2 /*                                                
  3  * Copyright (C) Sistina Software, Inc.  1997-    
  4  * Copyright (C) 2004-2006 Red Hat, Inc.  All     
  5  */                                               
  6                                                   
  7 #include <linux/sched.h>                          
  8 #include <linux/slab.h>                           
  9 #include <linux/spinlock.h>                       
 10 #include <linux/completion.h>                     
 11 #include <linux/buffer_head.h>                    
 12 #include <linux/mempool.h>                        
 13 #include <linux/gfs2_ondisk.h>                    
 14 #include <linux/bio.h>                            
 15 #include <linux/fs.h>                             
 16 #include <linux/list_sort.h>                      
 17 #include <linux/blkdev.h>                         
 18                                                   
 19 #include "bmap.h"                                 
 20 #include "dir.h"                                  
 21 #include "gfs2.h"                                 
 22 #include "incore.h"                               
 23 #include "inode.h"                                
 24 #include "glock.h"                                
 25 #include "glops.h"                                
 26 #include "log.h"                                  
 27 #include "lops.h"                                 
 28 #include "meta_io.h"                              
 29 #include "recovery.h"                             
 30 #include "rgrp.h"                                 
 31 #include "trans.h"                                
 32 #include "util.h"                                 
 33 #include "trace_gfs2.h"                           
 34                                                   
 35 /**                                               
 36  * gfs2_pin - Pin a buffer in memory              
 37  * @sdp: The superblock                           
 38  * @bh: The buffer to be pinned                   
 39  *                                                
 40  * The log lock must be held when calling this    
 41  */                                               
 42 void gfs2_pin(struct gfs2_sbd *sdp, struct buf    
 43 {                                                 
 44         struct gfs2_bufdata *bd;                  
 45                                                   
 46         BUG_ON(!current->journal_info);           
 47                                                   
 48         clear_buffer_dirty(bh);                   
 49         if (test_set_buffer_pinned(bh))           
 50                 gfs2_assert_withdraw(sdp, 0);     
 51         if (!buffer_uptodate(bh))                 
 52                 gfs2_io_error_bh_wd(sdp, bh);     
 53         bd = bh->b_private;                       
 54         /* If this buffer is in the AIL and it    
 55          * to in-place disk block, remove it f    
 56          */                                       
 57         spin_lock(&sdp->sd_ail_lock);             
 58         if (bd->bd_tr)                            
 59                 list_move(&bd->bd_ail_st_list,    
 60         spin_unlock(&sdp->sd_ail_lock);           
 61         get_bh(bh);                               
 62         atomic_inc(&sdp->sd_log_pinned);          
 63         trace_gfs2_pin(bd, 1);                    
 64 }                                                 
 65                                                   
 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 /**                                               
 96  * gfs2_unpin - Unpin a buffer                    
 97  * @sdp: the filesystem the buffer belongs to     
 98  * @bh: The buffer to unpin                       
 99  * @tr: The system transaction being flushed      
100  */                                               
101                                                   
102 static void gfs2_unpin(struct gfs2_sbd *sdp, s    
103                        struct gfs2_trans *tr)     
104 {                                                 
105         struct gfs2_bufdata *bd = bh->b_privat    
106                                                   
107         BUG_ON(!buffer_uptodate(bh));             
108         BUG_ON(!buffer_pinned(bh));               
109                                                   
110         lock_buffer(bh);                          
111         mark_buffer_dirty(bh);                    
112         clear_buffer_pinned(bh);                  
113                                                   
114         if (buffer_is_rgrp(bd))                   
115                 maybe_release_space(bd);          
116                                                   
117         spin_lock(&sdp->sd_ail_lock);             
118         if (bd->bd_tr) {                          
119                 list_del(&bd->bd_ail_st_list);    
120                 brelse(bh);                       
121         } else {                                  
122                 struct gfs2_glock *gl = bd->bd    
123                 list_add(&bd->bd_ail_gl_list,     
124                 atomic_inc(&gl->gl_ail_count);    
125         }                                         
126         bd->bd_tr = tr;                           
127         list_add(&bd->bd_ail_st_list, &tr->tr_    
128         spin_unlock(&sdp->sd_ail_lock);           
129                                                   
130         clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_f    
131         trace_gfs2_pin(bd, 0);                    
132         unlock_buffer(bh);                        
133         atomic_dec(&sdp->sd_log_pinned);          
134 }                                                 
135                                                   
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                                                   
141         if (++sdp->sd_log_flush_head == sdp->s    
142                 sdp->sd_log_flush_head = 0;       
143 }                                                 
144                                                   
145 u64 gfs2_log_bmap(struct gfs2_jdesc *jd, unsig    
146 {                                                 
147         struct gfs2_journal_extent *je;           
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 }                                                 
156                                                   
157 /**                                               
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 {                                                 
204         struct gfs2_sbd *sdp = bio->bi_private    
205         struct bio_vec *bvec;                     
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 }                                                 
231                                                   
232 /**                                               
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 {                                                 
243         struct bio *bio = *biop;                  
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 }                                                 
276                                                   
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                                                   
600 static struct page *gfs2_get_log_desc(struct g    
601                                       u32 ld_l    
602 {                                                 
603         struct page *page = mempool_alloc(gfs2    
604         struct gfs2_log_descriptor *ld = page_    
605         clear_page(ld);                           
606         ld->ld_header.mh_magic = cpu_to_be32(G    
607         ld->ld_header.mh_type = cpu_to_be32(GF    
608         ld->ld_header.mh_format = cpu_to_be32(    
609         ld->ld_type = cpu_to_be32(ld_type);       
610         ld->ld_length = cpu_to_be32(ld_length)    
611         ld->ld_data1 = cpu_to_be32(ld_data1);     
612         ld->ld_data2 = 0;                         
613         return page;                              
614 }                                                 
615                                                   
616 static void gfs2_check_magic(struct buffer_hea    
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 {                                                 
632         struct gfs2_bufdata *bda, *bdb;           
633                                                   
634         bda = list_entry(a, struct gfs2_bufdat    
635         bdb = list_entry(b, struct gfs2_bufdat    
636                                                   
637         if (bda->bd_bh->b_blocknr < bdb->bd_bh    
638                 return -1;                        
639         if (bda->bd_bh->b_blocknr > bdb->bd_bh    
640                 return 1;                         
641         return 0;                                 
642 }                                                 
643                                                   
644 static void gfs2_before_commit(struct gfs2_sbd    
645                                 unsigned int t    
646                                 bool is_databu    
647 {                                                 
648         struct gfs2_log_descriptor *ld;           
649         struct gfs2_bufdata *bd1 = NULL, *bd2;    
650         struct page *page;                        
651         unsigned int num;                         
652         unsigned n;                               
653         __be64 *ptr;                              
654                                                   
655         gfs2_log_lock(sdp);                       
656         list_sort(NULL, blist, blocknr_cmp);      
657         bd1 = bd2 = list_prepare_entry(bd1, bl    
658         while(total) {                            
659                 num = total;                      
660                 if (total > limit)                
661                         num = limit;              
662                 gfs2_log_unlock(sdp);             
663                 page = gfs2_get_log_desc(sdp,     
664                                          is_da    
665                                          GFS2_    
666                 ld = page_address(page);          
667                 gfs2_log_lock(sdp);               
668                 ptr = (__be64 *)(ld + 1);         
669                                                   
670                 n = 0;                            
671                 list_for_each_entry_continue(b    
672                         *ptr++ = cpu_to_be64(b    
673                         if (is_databuf) {         
674                                 gfs2_check_mag    
675                                 *ptr++ = cpu_t    
676                         }                         
677                         if (++n >= num)           
678                                 break;            
679                 }                                 
680                                                   
681                 gfs2_log_unlock(sdp);             
682                 gfs2_log_write_page(sdp, page)    
683                 gfs2_log_lock(sdp);               
684                                                   
685                 n = 0;                            
686                 list_for_each_entry_continue(b    
687                         get_bh(bd2->bd_bh);       
688                         gfs2_log_unlock(sdp);     
689                         lock_buffer(bd2->bd_bh    
690                                                   
691                         if (buffer_escaped(bd2    
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);       
706                         if (++n >= num)           
707                                 break;            
708                 }                                 
709                                                   
710                 BUG_ON(total < num);              
711                 total -= num;                     
712         }                                         
713         gfs2_log_unlock(sdp);                     
714 }                                                 
715                                                   
716 static void buf_lo_before_commit(struct gfs2_s    
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 {                                                 
728         struct list_head *head;                   
729         struct gfs2_bufdata *bd;                  
730                                                   
731         if (tr == NULL)                           
732                 return;                           
733                                                   
734         head = &tr->tr_buf;                       
735         while (!list_empty(head)) {               
736                 bd = list_first_entry(head, st    
737                 list_del_init(&bd->bd_list);      
738                 gfs2_unpin(sdp, bd->bd_bh, tr)    
739         }                                         
740 }                                                 
741                                                   
742 static void buf_lo_before_scan(struct gfs2_jde    
743                                struct gfs2_log    
744 {                                                 
745         if (pass != 0)                            
746                 return;                           
747                                                   
748         jd->jd_found_blocks = 0;                  
749         jd->jd_replayed_blocks = 0;               
750 }                                                 
751                                                   
752 #define obsolete_rgrp_replay \                    
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    
780                                 int pass)         
781 {                                                 
782         struct gfs2_inode *ip = GFS2_I(jd->jd_    
783         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    
784         struct gfs2_glock *gl = ip->i_gl;         
785         unsigned int blks = be32_to_cpu(ld->ld    
786         struct buffer_head *bh_log, *bh_ip;       
787         u64 blkno;                                
788         int error = 0;                            
789                                                   
790         if (pass != 1 || be32_to_cpu(ld->ld_ty    
791                 return 0;                         
792                                                   
793         gfs2_replay_incr_blk(jd, &start);         
794                                                   
795         for (; blks; gfs2_replay_incr_blk(jd,     
796                 blkno = be64_to_cpu(*ptr++);      
797                                                   
798                 jd->jd_found_blocks++;            
799                                                   
800                 if (gfs2_revoke_check(jd, blkn    
801                         continue;                 
802                                                   
803                 error = gfs2_replay_read_block    
804                 if (error)                        
805                         return error;             
806                                                   
807                 bh_ip = gfs2_meta_new(gl, blkn    
808                 memcpy(bh_ip->b_data, bh_log->    
809                                                   
810                 if (gfs2_meta_check(sdp, bh_ip    
811                         error = -EIO;             
812                 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    
820                 }                                 
821                 brelse(bh_log);                   
822                 brelse(bh_ip);                    
823                                                   
824                 if (error)                        
825                         break;                    
826                                                   
827                 jd->jd_replayed_blocks++;         
828         }                                         
829                                                   
830         return error;                             
831 }                                                 
832                                                   
833 static void buf_lo_after_scan(struct gfs2_jdes    
834 {                                                 
835         struct gfs2_inode *ip = GFS2_I(jd->jd_    
836         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    
837                                                   
838         if (error) {                              
839                 gfs2_inode_metasync(ip->i_gl);    
840                 return;                           
841         }                                         
842         if (pass != 1)                            
843                 return;                           
844                                                   
845         gfs2_inode_metasync(ip->i_gl);            
846                                                   
847         fs_info(sdp, "jid=%u: Replayed %u of %    
848                 jd->jd_jid, jd->jd_replayed_bl    
849 }                                                 
850                                                   
851 static void revoke_lo_before_commit(struct gfs    
852 {                                                 
853         struct gfs2_meta_header *mh;              
854         unsigned int offset;                      
855         struct list_head *head = &sdp->sd_log_    
856         struct gfs2_bufdata *bd;                  
857         struct page *page;                        
858         unsigned int length;                      
859                                                   
860         gfs2_flush_revokes(sdp);                  
861         if (!sdp->sd_log_num_revoke)              
862                 return;                           
863                                                   
864         length = gfs2_struct2blk(sdp, sdp->sd_    
865         page = gfs2_get_log_desc(sdp, GFS2_LOG    
866         offset = sizeof(struct gfs2_log_descri    
867                                                   
868         list_for_each_entry(bd, head, bd_list)    
869                 sdp->sd_log_num_revoke--;         
870                                                   
871                 if (offset + sizeof(u64) > sdp    
872                         gfs2_log_write_page(sd    
873                         page = mempool_alloc(g    
874                         mh = page_address(page    
875                         clear_page(mh);           
876                         mh->mh_magic = cpu_to_    
877                         mh->mh_type = cpu_to_b    
878                         mh->mh_format = cpu_to    
879                         offset = sizeof(struct    
880                 }                                 
881                                                   
882                 *(__be64 *)(page_address(page)    
883                 offset += sizeof(u64);            
884         }                                         
885         gfs2_assert_withdraw(sdp, !sdp->sd_log    
886                                                   
887         gfs2_log_write_page(sdp, page);           
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 }                                                 
909                                                   
910 static void revoke_lo_before_scan(struct gfs2_    
911                                   struct gfs2_    
912 {                                                 
913         if (pass != 0)                            
914                 return;                           
915                                                   
916         jd->jd_found_revokes = 0;                 
917         jd->jd_replay_tail = head->lh_tail;       
918 }                                                 
919                                                   
920 static int revoke_lo_scan_elements(struct gfs2    
921                                    struct gfs2    
922                                    int pass)      
923 {                                                 
924         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    
925         unsigned int blks = be32_to_cpu(ld->ld    
926         unsigned int revokes = be32_to_cpu(ld-    
927         struct buffer_head *bh;                   
928         unsigned int offset;                      
929         u64 blkno;                                
930         int first = 1;                            
931         int error;                                
932                                                   
933         if (pass != 0 || be32_to_cpu(ld->ld_ty    
934                 return 0;                         
935                                                   
936         offset = sizeof(struct gfs2_log_descri    
937                                                   
938         for (; blks; gfs2_replay_incr_blk(jd,     
939                 error = gfs2_replay_read_block    
940                 if (error)                        
941                         return error;             
942                                                   
943                 if (!first)                       
944                         gfs2_metatype_check(sd    
945                                                   
946                 while (offset + sizeof(u64) <=    
947                         blkno = be64_to_cpu(*(    
948                                                   
949                         error = gfs2_revoke_ad    
950                         if (error < 0) {          
951                                 brelse(bh);       
952                                 return error;     
953                         }                         
954                         else if (error)           
955                                 jd->jd_found_r    
956                                                   
957                         if (!--revokes)           
958                                 break;            
959                         offset += sizeof(u64);    
960                 }                                 
961                                                   
962                 brelse(bh);                       
963                 offset = sizeof(struct gfs2_me    
964                 first = 0;                        
965         }                                         
966                                                   
967         return 0;                                 
968 }                                                 
969                                                   
970 static void revoke_lo_after_scan(struct gfs2_j    
971 {                                                 
972         struct gfs2_sbd *sdp = GFS2_SB(jd->jd_    
973                                                   
974         if (error) {                              
975                 gfs2_revoke_clean(jd);            
976                 return;                           
977         }                                         
978         if (pass != 1)                            
979                 return;                           
980                                                   
981         fs_info(sdp, "jid=%u: Found %u revoke     
982                 jd->jd_jid, jd->jd_found_revok    
983                                                   
984         gfs2_revoke_clean(jd);                    
985 }                                                 
986                                                   
987 /**                                               
988  * databuf_lo_before_commit - Scan the data bu    
989  * @sdp: The filesystem                           
990  * @tr: The system transaction being flushed      
991  */                                               
992                                                   
993 static void databuf_lo_before_commit(struct gf    
994 {                                                 
995         unsigned int limit = databuf_limit(sdp    
996         unsigned int nbuf;                        
997         if (tr == NULL)                           
998                 return;                           
999         nbuf = tr->tr_num_databuf_new - tr->tr    
1000         gfs2_before_commit(sdp, limit, nbuf,     
1001 }                                                
1002                                                  
1003 static int databuf_lo_scan_elements(struct gf    
1004                                     struct gf    
1005                                     __be64 *p    
1006 {                                                
1007         struct gfs2_inode *ip = GFS2_I(jd->jd    
1008         struct gfs2_glock *gl = ip->i_gl;        
1009         unsigned int blks = be32_to_cpu(ld->l    
1010         struct buffer_head *bh_log, *bh_ip;      
1011         u64 blkno;                               
1012         u64 esc;                                 
1013         int error = 0;                           
1014                                                  
1015         if (pass != 1 || be32_to_cpu(ld->ld_t    
1016                 return 0;                        
1017                                                  
1018         gfs2_replay_incr_blk(jd, &start);        
1019         for (; blks; gfs2_replay_incr_blk(jd,    
1020                 blkno = be64_to_cpu(*ptr++);     
1021                 esc = be64_to_cpu(*ptr++);       
1022                                                  
1023                 jd->jd_found_blocks++;           
1024                                                  
1025                 if (gfs2_revoke_check(jd, blk    
1026                         continue;                
1027                                                  
1028                 error = gfs2_replay_read_bloc    
1029                 if (error)                       
1030                         return error;            
1031                                                  
1032                 bh_ip = gfs2_meta_new(gl, blk    
1033                 memcpy(bh_ip->b_data, bh_log-    
1034                                                  
1035                 /* Unescape */                   
1036                 if (esc) {                       
1037                         __be32 *eptr = (__be3    
1038                         *eptr = cpu_to_be32(G    
1039                 }                                
1040                 mark_buffer_dirty(bh_ip);        
1041                                                  
1042                 brelse(bh_log);                  
1043                 brelse(bh_ip);                   
1044                                                  
1045                 jd->jd_replayed_blocks++;        
1046         }                                        
1047                                                  
1048         return error;                            
1049 }                                                
1050                                                  
1051 /* FIXME: sort out accounting for log blocks     
1052                                                  
1053 static void databuf_lo_after_scan(struct gfs2    
1054 {                                                
1055         struct gfs2_inode *ip = GFS2_I(jd->jd    
1056         struct gfs2_sbd *sdp = GFS2_SB(jd->jd    
1057                                                  
1058         if (error) {                             
1059                 gfs2_inode_metasync(ip->i_gl)    
1060                 return;                          
1061         }                                        
1062         if (pass != 1)                           
1063                 return;                          
1064                                                  
1065         /* data sync? */                         
1066         gfs2_inode_metasync(ip->i_gl);           
1067                                                  
1068         fs_info(sdp, "jid=%u: Replayed %u of     
1069                 jd->jd_jid, jd->jd_replayed_b    
1070 }                                                
1071                                                  
1072 static void databuf_lo_after_commit(struct gf    
1073 {                                                
1074         struct list_head *head;                  
1075         struct gfs2_bufdata *bd;                 
1076                                                  
1077         if (tr == NULL)                          
1078                 return;                          
1079                                                  
1080         head = &tr->tr_databuf;                  
1081         while (!list_empty(head)) {              
1082                 bd = list_first_entry(head, s    
1083                 list_del_init(&bd->bd_list);     
1084                 gfs2_unpin(sdp, bd->bd_bh, tr    
1085         }                                        
1086 }                                                
1087                                                  
1088                                                  
1089 static const struct gfs2_log_operations gfs2_    
1090         .lo_before_commit = buf_lo_before_com    
1091         .lo_after_commit = buf_lo_after_commi    
1092         .lo_before_scan = buf_lo_before_scan,    
1093         .lo_scan_elements = buf_lo_scan_eleme    
1094         .lo_after_scan = buf_lo_after_scan,      
1095         .lo_name = "buf",                        
1096 };                                               
1097                                                  
1098 static const struct gfs2_log_operations gfs2_    
1099         .lo_before_commit = revoke_lo_before_    
1100         .lo_after_commit = revoke_lo_after_co    
1101         .lo_before_scan = revoke_lo_before_sc    
1102         .lo_scan_elements = revoke_lo_scan_el    
1103         .lo_after_scan = revoke_lo_after_scan    
1104         .lo_name = "revoke",                     
1105 };                                               
1106                                                  
1107 static const struct gfs2_log_operations gfs2_    
1108         .lo_before_commit = databuf_lo_before    
1109         .lo_after_commit = databuf_lo_after_c    
1110         .lo_scan_elements = databuf_lo_scan_e    
1111         .lo_after_scan = databuf_lo_after_sca    
1112         .lo_name = "databuf",                    
1113 };                                               
1114                                                  
1115 const struct gfs2_log_operations *gfs2_log_op    
1116         &gfs2_databuf_lops,                      
1117         &gfs2_buf_lops,                          
1118         &gfs2_revoke_lops,                       
1119         NULL,                                    
1120 };                                               
1121                                                  
1122                                                  

~ [ 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