Tao Ma
2008-Nov-19 08:48 UTC
[Ocfs2-devel] [PATCH] 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.
Reported-by: Tiger Yang <tiger.yang at oracle.com>
Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
fs/ocfs2/xattr.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index 8195450..1504c6b 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -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 {
/*
--
1.5.5
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.
Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
fs/ocfs2/xattr.c | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index 1504c6b..7d6307f 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -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;
--
1.5.5
Tao Ma
2008-Nov-19 08:52 UTC
[Ocfs2-devel] [PATCH 0/2] 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
Tiger Yang
2008-Nov-19 14:25 UTC
[Ocfs2-devel] [PATCH] 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 Tao Ma wrote:> 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. > > Signed-off-by: Tao Ma <tao.ma at oracle.com> > --- > fs/ocfs2/xattr.c | 6 +++++- > 1 files changed, 5 insertions(+), 1 deletions(-) > > diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c > index 1504c6b..7d6307f 100644 > --- a/fs/ocfs2/xattr.c > +++ b/fs/ocfs2/xattr.c > @@ -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;
Mark Fasheh
2008-Nov-19 23:32 UTC
[Ocfs2-devel] [PATCH 0/2] 2 bug fix for xattr set transaction merge.
On Wed, Nov 19, 2008 at 04:52:53PM +0800, Tao Ma wrote:> 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