rpms/kernel/devel linux-2.6-xfs_attr2.patch, NONE, 1.1 kernel-2.6.spec, 1.2922, 1.2923
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Mon Feb 5 23:20:14 UTC 2007
Author: davej
Update of /cvs/dist/rpms/kernel/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv27431
Modified Files:
kernel-2.6.spec
Added Files:
linux-2.6-xfs_attr2.patch
Log Message:
* Mon Feb 5 2007 Dave Jones <davej at redhat.com>
- Fix attr2 corruption with btree data extents
linux-2.6-xfs_attr2.patch:
xfs_attr.c | 19 +++++++++++--------
xfs_attr_leaf.c | 45 ++++++++++++++++++++++++++++++++++++++++++---
xfs_bmap.c | 1 +
3 files changed, 54 insertions(+), 11 deletions(-)
--- NEW FILE linux-2.6-xfs_attr2.patch ---
Log:
Fix attr2 corruption with btree data extents
Merge of xfs-linux-melb:xfs-kern:27792a by kenmcd.
-------------------------------------------------
Fix up initial creation of shortform attributes
Members:
xfs_attr.c:1.140->1.141
-------------------------------------------------
Lock forkoff when data extent is in btree form.
Members:
xfs_bmap.c:1.359->1.360
-------------------------------------------------
Lock forkoff when data extent is in btree form. Also allow more space for
attr if extents must convert to btree form.
Members:
xfs_attr_leaf.c:1.104->1.105
Signed-off-by: Barry Naujok <bnaujok at melbourne.sgi.com>
Signed-off-by: Timothy Shimmin <tes at sgi.com>
Signed-off-by: Russell Cattelan <cattelan at xfs.org>
Signed-off-by: Eric Sandeen <sandeen at sandeen.net>
Index: linux-2.6.18.noarch/fs/xfs/xfs_attr.c
===================================================================
--- linux-2.6.18.noarch.orig/fs/xfs/xfs_attr.c 2006-09-19 23:42:06.000000000 -0400
+++ linux-2.6.18.noarch/fs/xfs/xfs_attr.c 2006-12-21 18:34:12.864403389 -0500
@@ -200,18 +200,14 @@ xfs_attr_set_int(xfs_inode_t *dp, const
return (error);
/*
- * Determine space new attribute will use, and if it would be
- * "local" or "remote" (note: local != inline).
- */
- size = xfs_attr_leaf_newentsize(namelen, valuelen,
- mp->m_sb.sb_blocksize, &local);
-
- /*
* If the inode doesn't have an attribute fork, add one.
* (inode must not be locked when we call this routine)
*/
if (XFS_IFORK_Q(dp) == 0) {
- if ((error = xfs_bmap_add_attrfork(dp, size, rsvd)))
+ int sf_size = sizeof(xfs_attr_sf_hdr_t) +
+ XFS_ATTR_SF_ENTSIZE_BYNAME(namelen, valuelen);
+
+ if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd)))
return(error);
}
@@ -232,6 +228,13 @@ xfs_attr_set_int(xfs_inode_t *dp, const
args.addname = 1;
args.oknoent = 1;
+ /*
+ * Determine space new attribute will use, and if it would be
+ * "local" or "remote" (note: local != inline).
+ */
+ size = xfs_attr_leaf_newentsize(namelen, valuelen,
+ mp->m_sb.sb_blocksize, &local);
+
nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK);
if (local) {
if (size > (mp->m_sb.sb_blocksize >> 1)) {
Index: linux-2.6.18.noarch/fs/xfs/xfs_attr_leaf.c
===================================================================
--- linux-2.6.18.noarch.orig/fs/xfs/xfs_attr_leaf.c 2006-09-19 23:42:06.000000000 -0400
+++ linux-2.6.18.noarch/fs/xfs/xfs_attr_leaf.c 2006-12-21 18:34:12.936404440 -0500
@@ -113,6 +113,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t
int offset;
int minforkoff; /* lower limit on valid forkoff locations */
int maxforkoff; /* upper limit on valid forkoff locations */
+ int dsize;
xfs_mount_t *mp = dp->i_mount;
offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */
@@ -132,8 +133,43 @@ xfs_attr_shortform_bytesfit(xfs_inode_t
return 0;
}
- /* data fork btree root can have at least this many key/ptr pairs */
- minforkoff = MAX(dp->i_df.if_bytes, XFS_BMDR_SPACE_CALC(MINDBTPTRS));
+ dsize = dp->i_df.if_bytes;
+
+ switch (dp->i_d.di_format) {
+ case XFS_DINODE_FMT_EXTENTS:
+ /*
+ * If there is no attr fork and the data fork is extents,
+ * determine if creating the default attr fork will result
+ * in the extents form migrating to btree. If so, the
+ * minimum offset only needs to be the space required for
+ * the btree root.
+ */
+ if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset)
+ dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS);
+ break;
+
+ case XFS_DINODE_FMT_BTREE:
+ /*
+ * If have data btree then keep forkoff if we have one,
+ * otherwise we are adding a new attr, so then we set
+ * minforkoff to where the btree root can finish so we have
+ * plenty of room for attrs
+ */
+ if (dp->i_d.di_forkoff) {
+ if (offset < dp->i_d.di_forkoff)
+ return 0;
+ else
+ return dp->i_d.di_forkoff;
+ } else
+ dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot);
+ break;
+ }
+
+ /*
+ * A data fork btree root must have space for at least
+ * MINDBTPTRS key/ptr pairs if the data fork is small or empty.
+ */
+ minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS));
minforkoff = roundup(minforkoff, 8) >> 3;
/* attr fork btree root can have at least this many key/ptr pairs */
@@ -308,7 +344,8 @@ xfs_attr_shortform_remove(xfs_da_args_t
*/
totsize -= size;
if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname &&
- (mp->m_flags & XFS_MOUNT_ATTR2)) {
+ (mp->m_flags & XFS_MOUNT_ATTR2) &&
+ (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) {
/*
* Last attribute now removed, revert to original
* inode format making all literal area available
@@ -729,6 +766,7 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *b
+ be16_to_cpu(name_loc->valuelen);
}
if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) &&
+ (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
(bytes == sizeof(struct xfs_attr_sf_hdr)))
return(-1);
return(xfs_attr_shortform_bytesfit(dp, bytes));
@@ -767,6 +805,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *
if (forkoff == -1) {
ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2);
+ ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE);
/*
* Last attribute was removed, revert to original
Index: linux-2.6.18.noarch/fs/xfs/xfs_bmap.c
===================================================================
--- linux-2.6.18.noarch.orig/fs/xfs/xfs_bmap.c 2006-09-19 23:42:06.000000000 -0400
+++ linux-2.6.18.noarch/fs/xfs/xfs_bmap.c 2006-12-21 18:34:12.932404381 -0500
@@ -3541,6 +3541,7 @@ xfs_bmap_forkoff_reset(
if (whichfork == XFS_ATTR_FORK &&
(ip->i_d.di_format != XFS_DINODE_FMT_DEV) &&
(ip->i_d.di_format != XFS_DINODE_FMT_UUID) &&
+ (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) {
ip->i_d.di_forkoff = mp->m_attroffset >> 3;
ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) /
Index: kernel-2.6.spec
===================================================================
RCS file: /cvs/dist/rpms/kernel/devel/kernel-2.6.spec,v
retrieving revision 1.2922
retrieving revision 1.2923
diff -u -r1.2922 -r1.2923
--- kernel-2.6.spec 4 Feb 2007 22:57:30 -0000 1.2922
+++ kernel-2.6.spec 5 Feb 2007 23:20:11 -0000 1.2923
@@ -426,6 +426,7 @@
Patch1620: linux-2.6-serial-tickle-nmi.patch
Patch1650: linux-2.6-serial-460800.patch
Patch1681: linux-2.6-xfs-umount-fix.patch
+Patch1682: linux-2.6-xfs_attr2.patch
Patch1690: linux-2.6-PT_LOAD-align.patch
Patch1720: linux-2.6-proc-self-maps-fix.patch
Patch1740: linux-2.6-softlockup-disable.patch
@@ -979,6 +980,8 @@
%patch1650 -p1
# Fix XFS umount bug.
%patch1681 -p1
+# Fix attr2 corruption with btree data extents
+%patch1682 -p1
# Align kernel data segment to page boundary.
%patch1690 -p1
# setuid /proc/self/maps fix.
@@ -1992,6 +1995,9 @@
# - tux.
%changelog
+* Mon Feb 5 2007 Dave Jones <davej at redhat.com>
+- Fix attr2 corruption with btree data extents
+
* Sun Feb 4 2007 Dave Jones <davej at redhat.com>
- 2.6.20
- Move xen sources out of kernel-xen-devel. (Don Zickus)
More information about the fedora-cvs-commits
mailing list