2 bug fix for xattr set transaction merge.
PATCH 1/1 ocfs2/xattr: Fix a bug in xattr allocation guess.
In reply to Tao MaWhen 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
@@ -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
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
@@ -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
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
PATCH 1/1 ocfs2/xattr: Restore not_found in xis.
In reply to Tao Mahow 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 theocfs2_calc_xattr_set_need. So restore it.Signed-off-by Tao Ma <[email protected]>--- fs/ocfs2/xattr.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)fs/ocfs2/xattr.c +5
-1@@ -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;
cover 2 bug fix for xattr set transaction merge.
In reply to Tao MaQuoted 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 yourmerge_window, so the bug fixes are not too late. They are both straightforward, so please push them to yourmerge_window.
Yep, looks good. They're in merge_window now.
--Mark
--
Mark Fasheh