xfs: small bugfixes
cover xfs: small bugfixes
These are 2 patches which were already sent for kernel & userspace; they made it to userspace, but I don't see them in for-next, so resending.
Thanks,
-Eric
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH 1/2 xfs: don't send null bp to xfs_trans_brelse()
In this case, if bp is NULL, error is set, and we send a NULL bp to xfs_trans_brelse, which will try to dereference it.
Test whether we actually have a buffer before we try to free it.
Coverity spotted this.
---
fs/xfs/libxfs/xfs_da_btree.c +2 -1
@@ -2563,7 +2563,8 @@ xfs_da_get_buf( mapp, nmap, 0); error = bp ? bp->b_error : -EIO ;if (error) { -xfs_trans_brelse (trans, bp); +if (bp) +xfs_trans_brelse (trans, bp); goto out_free; }
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
PATCH 2/2 xfs: fix crc field handling in xfs_sb_to/from_disk
In reply to Eric SandeenI discovered this in userspace, but the same change applies to the kernel.
If we xfs_mdrestore an image from a non-crc filesystem, lo and behold the restored image has gained a CRC:
# db/xfs_metadump.sh -o /dev/sdc1 - | xfs_mdrestore - test.img # xfs_db -c "sb 0" -c "p crc" /dev/sdc1 crc = 0 (correct) # xfs_db -c "sb 0" -c "p crc" test.img crc = 0xb6f8d6a0 (correct)
This is because xfs_sb_from_disk doesn't fill in sb_crc, but xfs_sb_to_disk(XFS_SB_ALL_BITS) does write the in-memory CRC to disk - so we get uninitialized memory on disk.
Fix this by always initializing sb_crc to 0 when we read the superblock, and masking out the CRC bit from ALL_BITS when we write it.
---
fs/xfs/libxfs/xfs_sb.c +5 -0
@@ -445,6 +445,8 @@ __xfs_sb_from_disk( to->sb_features_incompat =be32_to_cpu (from->sb_features_incompat); to->sb_features_log_incompat =be32_to_cpu (from->sb_features_log_incompat); +/* crc is only used on disk, not in memory; just init to 0 here. */ + to->sb_crc =0 ; to->sb_pad =0 ; to->sb_pquotino =be64_to_cpu (from->sb_pquotino); to->sb_lsn =be64_to_cpu (from->sb_lsn);
@@ -550,6 +552,9 @@ xfs_sb_to_disk(if (!fields)return ; +/* We should never write the crc here, it's updated in the IO path */ + fields &= ~XFS_SB_CRC ; +xfs_sb_quota_to_disk (to, from, &fields);while (fields) { f = (xfs_sb_field_t )xfs_lowbit64 ((__uint64_t )fields);
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 1/2] xfs: don't send null bp to xfs_trans_brelse()
In reply to Eric SandeenQuoted 9 lines · Eric Sandeen
In this case, if bp is NULL, error is set, and we send a NULL bp to
xfs_trans_brelse, which will try to dereference it.Test whether we actually have a buffer before we try to free it.
Coverity spotted this.
Signed-off-by Eric Sandeen <[email protected]>
Looks good,
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 2/2] xfs: fix crc field handling in xfs_sb_to/from_disk
In reply to Eric SandeenLooks good (although it will conflict with Dave's sb_to_disk rework..)
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH 2/2] xfs: fix crc field handling in xfs_sb_to/from_disk
Quoted 1 line · Christoph Hellwig
Looks good (although it will conflict with Dave's
sb_to_diskrework..)
That's ok. I'm slipping that superblock logging change to the next merge window as I haven't had a chance to look at the problems you reported yet and it's too close to the next merge window to be debugging changes to on-disk format handling code...
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs