linux/fs/gfs2
Masatake YAMATO 44b8db1386 GFS2: Fixing double brelse'ing bh allocated in gfs2_meta_read when EIO occurs
This patch fixes buffer_head double free in following code path:

gfs2_block_map
=> gfs2_meta_inode_buffer
 => gfs2_meta_indirect_buffer
  => gfs2_meta_read
=> release_metapath

gfs2_block_map calls gfs2_meta_inode_buffer with &mp.mp_bh[0]
as an argument. mp.mp_bh are filled with zero at the beginning
of gfs2_block_map.

If gfs2_meta_inode_buffer returns non-zero value, gfs2_block_map
calls release_metapath to free buffers chained to mp.mp_bh.
release_metapath checks each slot of mp.mp_bh[i] and
free(with brelse) unless the slot is filled with NULL.

&mp.mp_bh[0] passed to gfs2_meta_inode_buffer is filled at
gfs2_meta_read. gfs2_meta_read is filled a buffer allocated with
gfs2_getbuf even if EIO occurs. When EIO occurs, the allocated buffer
is brelse'ed though the pointer(wrong poiner) points the brelse'ed is
passed back to caller via an argument bhp.

gfs2_meta_indirect_buffer, the caller also pass the wrong pointer
to its caller with EIO. Finally gfs2_block_map gets both EIO and
&mp.mp_bh[0] filled with the wrong pointer. release_metapath
calls brelse again on the wrong pointer.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
2012-06-28 15:35:47 +01:00
..
acl.c GFS2: Fix sgid propagation when using ACLs 2012-05-04 14:33:06 +01:00
acl.h fs: take the ACL checks to common code 2011-07-25 14:30:23 -04:00
aops.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
bmap.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
bmap.h
dentry.c
dir.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
dir.h GFS2: Add readahead to sequential directory traversal 2011-11-08 09:52:12 +00:00
export.c ->encode_fh() API change 2012-05-29 23:28:33 -04:00
file.c GFS2: Add "top dir" flag support 2012-06-06 11:27:36 +01:00
gfs2.h
glock.c GFS2: Size seq_file buffer more carefully 2012-06-11 13:49:47 +01:00
glock.h GFS2: dlm based recovery coordination 2012-01-11 09:23:05 +00:00
glops.c GFS2: Remove redundant metadata block type check 2012-05-08 16:18:55 +01:00
glops.h GFS2: Fix AIL flush issue during fsync 2011-10-21 12:39:41 +01:00
incore.h GFS2: Use lvbs for storing rgrp information with mount option 2012-06-08 11:50:01 +01:00
inode.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
inode.h GFS2: Remove unused argument from gfs2_internal_read 2012-04-24 16:44:37 +01:00
Kconfig GFS2: use depends instead of select in kconfig 2012-03-26 09:18:02 +01:00
lock_dlm.c dlm: fixes for nodir mode 2012-05-02 14:15:27 -05:00
log.c GFS2: eliminate log elements and simplify 2012-05-02 09:14:36 +01:00
log.h GFS2: Clean up log write code path 2012-04-24 16:44:34 +01:00
lops.c GFS2: Fix error handling when reading an invalid block from the journal 2012-06-06 11:27:49 +01:00
lops.h GFS2: eliminate log elements and simplify 2012-05-02 09:14:36 +01:00
main.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
Makefile GFS2: Rename ops_inode.c to inode.c 2011-05-10 13:12:49 +01:00
meta_io.c GFS2: Fixing double brelse'ing bh allocated in gfs2_meta_read when EIO occurs 2012-06-28 15:35:47 +01:00
meta_io.h GFS2: Eliminate unused "new" parameter to gfs2_meta_indirect_buffer 2012-05-11 10:19:23 +01:00
ops_fstype.c GFS2: Add kobject release method 2012-06-13 15:59:48 +01:00
quota.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
quota.h vmscan: change shrinker API by passing shrink_control struct 2011-05-25 08:39:26 -07:00
recovery.c GFS2: fail mount if journal recovery fails 2012-01-11 09:24:48 +00:00
recovery.h
rgrp.c GFS2: Combine functions get_local_rgrp and gfs2_inplace_reserve 2012-06-14 09:58:40 +01:00
rgrp.h GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
super.c GFS2: Use lvbs for storing rgrp information with mount option 2012-06-08 11:50:01 +01:00
super.h
sys.c GFS2: Add kobject release method 2012-06-13 15:59:48 +01:00
sys.h GFS2: dlm based recovery coordination 2012-01-11 09:23:05 +00:00
trace_gfs2.h GFS2: Add rgrp information to block_alloc trace point 2012-05-11 10:31:34 +01:00
trans.c GFS2: eliminate log elements and simplify 2012-05-02 09:14:36 +01:00
trans.h GFS2: Extend the life of the reservations 2012-06-06 11:17:59 +01:00
util.c GFS2: Clean up log write code path 2012-04-24 16:44:34 +01:00
util.h GFS2: Fix error handling when reading an invalid block from the journal 2012-06-06 11:27:49 +01:00
xattr.c GFS2: Fold quota data into the reservations struct 2012-06-06 11:20:22 +01:00
xattr.h