]> Pileus Git - ~andy/linux/commitdiff
GFS2: Merge gfs2_attach_bufdata() into trans.c
authorSteven Whitehouse <swhiteho@redhat.com>
Fri, 14 Dec 2012 17:54:21 +0000 (17:54 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Tue, 29 Jan 2013 10:28:44 +0000 (10:28 +0000)
The locking in gfs2_attach_bufdata() was type specific (data/meta)
which made the function rather confusing. This patch moves the core
of gfs2_attach_bufdata() into trans.c renaming it gfs2_alloc_bufdata()
and moving the locking into gfs2_trans_add_data()/gfs2_trans_add_meta()

As a result all of the locking related to adding data and metadata to
the journal is now in these two functions. This should help to clarify
what is going on, and give us some opportunities to simplify in
some cases.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/lops.h
fs/gfs2/meta_io.c
fs/gfs2/meta_io.h
fs/gfs2/trans.c

index d85b3767ee088cfef4995f0deeaa7d58d33cf1c2..ba77b7da83251dd7c6f3b010a8fdd3682bc3874f 100644 (file)
@@ -47,13 +47,6 @@ static inline unsigned int databuf_limit(struct gfs2_sbd *sdp)
        return limit;
 }
 
-static inline void lops_init_le(struct gfs2_bufdata *bd,
-                               const struct gfs2_log_operations *lops)
-{
-       INIT_LIST_HEAD(&bd->bd_list);
-       bd->bd_ops = lops;
-}
-
 static inline void lops_before_commit(struct gfs2_sbd *sdp)
 {
        int x;
index 22255d96b27efbb9c3a93e6db8678a147d99548b..b059bbb5059ec3a03efc5b5d7907f1cd66a2be01 100644 (file)
@@ -271,41 +271,6 @@ int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh)
        return 0;
 }
 
-/**
- * gfs2_attach_bufdata - attach a struct gfs2_bufdata structure to a buffer
- * @gl: the glock the buffer belongs to
- * @bh: The buffer to be attached to
- * @meta: Flag to indicate whether its metadata or not
- */
-
-void gfs2_attach_bufdata(struct gfs2_glock *gl, struct buffer_head *bh,
-                        int meta)
-{
-       struct gfs2_bufdata *bd;
-
-       if (meta)
-               lock_page(bh->b_page);
-
-       if (bh->b_private) {
-               if (meta)
-                       unlock_page(bh->b_page);
-               return;
-       }
-
-       bd = kmem_cache_zalloc(gfs2_bufdata_cachep, GFP_NOFS | __GFP_NOFAIL);
-       bd->bd_bh = bh;
-       bd->bd_gl = gl;
-
-       if (meta)
-               lops_init_le(bd, &gfs2_buf_lops);
-       else
-               lops_init_le(bd, &gfs2_databuf_lops);
-       bh->b_private = bd;
-
-       if (meta)
-               unlock_page(bh->b_page);
-}
-
 void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int meta)
 {
        struct address_space *mapping = bh->b_page->mapping;
index c30973b07a7caf54ae5c04e80be2cc6706aeb57e..0d4c843b6f8e59aec3f143a80417d0e4e6de43e0 100644 (file)
@@ -56,9 +56,6 @@ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno,
 int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh);
 struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create);
 
-void gfs2_attach_bufdata(struct gfs2_glock *gl, struct buffer_head *bh,
-                        int meta);
-
 void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr,
                              int meta);
 
index 1fbd57eafa48b6f2cd321c98980a0bffdf542a1a..14dbf6d3cdc0b4a4eea6a76bcb2f7e51e626c1a4 100644 (file)
@@ -143,6 +143,21 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
        sb_end_intwrite(sdp->sd_vfs);
 }
 
+static struct gfs2_bufdata *gfs2_alloc_bufdata(struct gfs2_glock *gl,
+                                              struct buffer_head *bh,
+                                              const struct gfs2_log_operations *lops)
+{
+       struct gfs2_bufdata *bd;
+
+       bd = kmem_cache_zalloc(gfs2_bufdata_cachep, GFP_NOFS | __GFP_NOFAIL);
+       bd->bd_bh = bh;
+       bd->bd_gl = gl;
+       bd->bd_ops = lops;
+       INIT_LIST_HEAD(&bd->bd_list);
+       bh->b_private = bd;
+       return bd;
+}
+
 /**
  * databuf_lo_add - Add a databuf to the transaction.
  *
@@ -190,16 +205,15 @@ void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh)
        lock_buffer(bh);
        gfs2_log_lock(sdp);
        bd = bh->b_private;
-       if (bd)
-               gfs2_assert(sdp, bd->bd_gl == gl);
-       else {
+       if (bd == NULL) {
                gfs2_log_unlock(sdp);
                unlock_buffer(bh);
-               gfs2_attach_bufdata(gl, bh, 0);
-               bd = bh->b_private;
+               if (bh->b_private == NULL)
+                       bd = gfs2_alloc_bufdata(gl, bh, &gfs2_databuf_lops);
                lock_buffer(bh);
                gfs2_log_lock(sdp);
        }
+       gfs2_assert(sdp, bd->bd_gl == gl);
        databuf_lo_add(sdp, bd);
        gfs2_log_unlock(sdp);
        unlock_buffer(bh);
@@ -240,16 +254,17 @@ void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh)
        lock_buffer(bh);
        gfs2_log_lock(sdp);
        bd = bh->b_private;
-       if (bd)
-               gfs2_assert(sdp, bd->bd_gl == gl);
-       else {
+       if (bd == NULL) {
                gfs2_log_unlock(sdp);
                unlock_buffer(bh);
-               gfs2_attach_bufdata(gl, bh, 1);
-               bd = bh->b_private;
+               lock_page(bh->b_page);
+               if (bh->b_private == NULL)
+                       bd = gfs2_alloc_bufdata(gl, bh, &gfs2_buf_lops);
+               unlock_page(bh->b_page);
                lock_buffer(bh);
                gfs2_log_lock(sdp);
        }
+       gfs2_assert(sdp, bd->bd_gl == gl);
        meta_lo_add(sdp, bd);
        gfs2_log_unlock(sdp);
        unlock_buffer(bh);
@@ -263,7 +278,7 @@ void gfs2_trans_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd)
        BUG_ON(!list_empty(&bd->bd_list));
        BUG_ON(!list_empty(&bd->bd_ail_st_list));
        BUG_ON(!list_empty(&bd->bd_ail_gl_list));
-       lops_init_le(bd, &gfs2_revoke_lops);
+       bd->bd_ops = &gfs2_revoke_lops;
        tr->tr_touched = 1;
        tr->tr_num_revoke++;
        sdp->sd_log_num_revoke++;