gfs2: Add missing else in trans_add_meta/data
authorBob Peterson <rpeterso@redhat.com>
Thu, 1 Oct 2015 16:47:31 +0000 (11:47 -0500)
committerBob Peterson <rpeterso@redhat.com>
Thu, 1 Oct 2015 17:00:59 +0000 (12:00 -0500)
This patch fixes a timing window that causes a segfault.
The problem is that bd can remain NULL throughout the function
and then reference that NULL pointer if the bh->b_private starts
out NULL, then someone sets it to non-NULL inside the locking.
In that case, bd still needs to be set.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
fs/gfs2/trans.c

index b95d0d6..0c1bde3 100644 (file)
@@ -176,6 +176,8 @@ void gfs2_trans_add_data(struct gfs2_glock *gl, struct buffer_head *bh)
                unlock_buffer(bh);
                if (bh->b_private == NULL)
                        bd = gfs2_alloc_bufdata(gl, bh, &gfs2_databuf_lops);
+               else
+                       bd = bh->b_private;
                lock_buffer(bh);
                gfs2_log_lock(sdp);
        }
@@ -236,6 +238,8 @@ void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh)
                lock_page(bh->b_page);
                if (bh->b_private == NULL)
                        bd = gfs2_alloc_bufdata(gl, bh, &gfs2_buf_lops);
+               else
+                       bd = bh->b_private;
                unlock_page(bh->b_page);
                lock_buffer(bh);
                gfs2_log_lock(sdp);