Skip to contentSkip to conversation

2 bug fix for xattr set transaction merge.

PATCH New Tao Ma 3 participants 5 messages Nov 19, 2008 OCFS2

lore
Share & tools
lore

Tao Ma

author
#0 lore raw

cover 2 bug fix for xattr set transaction merge.

Hi Mark,
The 2 patches are 2 bug fix for my xattr set transaction merge patches.
I don't know why tristan's powerful xattr test can't find it, and I will ask him to include the test case in it. The good news is that the merge patch set is still in your merge_window, so the bug fixes are not too late. They are both straightforward, so please push them to your merge_window.

Regards,
Tao

author
#1 lore raw

PATCH 1/1 ocfs2/xattr: Fix a bug in xattr allocation guess.

When we extend one xattr's value to a large size, in case the old value size is smaller than the size of value root, we still need to guess the metadata allocation.

---
 fs/ocfs2/xattr.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)
fs/ocfs2/xattr.c +3 -1
index 8195450..1504c6b 100644
@@ -2270,6 +2270,7 @@ static int ocfs2_calc_xattr_set_need(struct inode *inode,
 								 value_size);
 			xv = (struct ocfs2_xattr_value_root *)
 			     (base + name_offset + name_len);
+			value_size = OCFS2_XATTR_ROOT_SIZE;
 		} else
 			xv = &def_xv.xv;
 
@@ -2283,7 +2284,8 @@ static int ocfs2_calc_xattr_set_need(struct inode *inode,
 							     &xv->xr_list,
 							     new_clusters -
 							     old_clusters);
-			goto out;
+			if (value_size >= OCFS2_XATTR_ROOT_SIZE)
+				goto out;
 		}
 	} else {
 		/*
Signature · 1 line
1.5.5
author
#2 lore raw

PATCH 1/1 ocfs2/xattr: Restore not_found in xis.

In xattr set, when we move a xattr which was stored in inode to the outside bucket, we have to delete it and it will use the old "xis->not_found", but it is removed by the ocfs2_calc_xattr_set_need. So restore it.

---
 fs/ocfs2/xattr.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)
fs/ocfs2/xattr.c +5 -1
index 1504c6b..7d6307f 100644
@@ -2414,7 +2414,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 				    struct ocfs2_xattr_search *xbs,
 				    struct ocfs2_xattr_set_ctxt *ctxt)
 {
-	int ret = 0, credits;
+	int ret = 0, credits, old_found;
 
 	if (!xi->value) {
 		/* Remove existing extended attribute */
@@ -2433,6 +2433,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 			xi->value = NULL;
 			xi->value_len = 0;
 
+			old_found = xis->not_found;
 			xis->not_found = -ENODATA;
 			ret = ocfs2_calc_xattr_set_need(inode,
 							di,
@@ -2442,6 +2443,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 							NULL,
 							NULL,
 							&credits);
+			xis->not_found = old_found;
 			if (ret) {
 				mlog_errno(ret);
 				goto out;
@@ -2462,6 +2464,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 				if (ret)
 					goto out;
 
+				old_found = xis->not_found;
 				xis->not_found = -ENODATA;
 				ret = ocfs2_calc_xattr_set_need(inode,
 								di,
@@ -2471,6 +2474,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 								NULL,
 								NULL,
 								&credits);
+				xis->not_found = old_found;
 				if (ret) {
 					mlog_errno(ret);
 					goto out;
Signature · 1 line
1.5.5
#3 lore raw

PATCH 1/1 ocfs2/xattr: Restore not_found in xis.

how quickly you solve this problem! I also found this problem with my test script but forgot to tell you when you address the first problem.

thanks,
tiger

Quoted 55 lines · Tao Ma

In xattr set, when we move a xattr which was stored in inode to the outside bucket, we have to delete it and it will use the old "xis->not_found", but it is removed by the ocfs2_calc_xattr_set_need. So restore it.

---
 fs/ocfs2/xattr.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)
fs/ocfs2/xattr.c +5 -1
index 1504c6b..7d6307f 100644
@@ -2414,7 +2414,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 				    struct ocfs2_xattr_search *xbs,
 				    struct ocfs2_xattr_set_ctxt *ctxt)
 {
-	int ret = 0, credits;
+	int ret = 0, credits, old_found;
 
 	if (!xi->value) {
 		/* Remove existing extended attribute */
@@ -2433,6 +2433,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 			xi->value = NULL;
 			xi->value_len = 0;
 
+			old_found = xis->not_found;
 			xis->not_found = -ENODATA;
 			ret = ocfs2_calc_xattr_set_need(inode,
 							di,
@@ -2442,6 +2443,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 							NULL,
 							NULL,
 							&credits);
+			xis->not_found = old_found;
 			if (ret) {
 				mlog_errno(ret);
 				goto out;
@@ -2462,6 +2464,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 				if (ret)
 					goto out;
 
+				old_found = xis->not_found;
 				xis->not_found = -ENODATA;
 				ret = ocfs2_calc_xattr_set_need(inode,
 								di,
@@ -2471,6 +2474,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
 								NULL,
 								NULL,
 								&credits);
+				xis->not_found = old_found;
 				if (ret) {
 					mlog_errno(ret);
 					goto out;
#4 lore raw

cover 2 bug fix for xattr set transaction merge.

In reply to Tao Ma
Quoted 7 lines · Tao Ma

Hi Mark,
The 2 patches are 2 bug fix for my xattr set transaction merge patches. I don't know why tristan's powerful xattr test can't find it, and
I will ask him to include the test case in it. The good news is that the merge patch set is still in your merge_window, so the bug fixes are not too late. They are both straightforward, so please push them to your merge_window.

Yep, looks good. They're in merge_window now.

	--Mark

--
Mark Fasheh