ocfs2: Reset xattr value size after xa_cleanup_value_truncate().
In ocfs2_prepare_xattr_entry, if we fail to grow an existing value, xa_cleanup_value_truncate() will leave the old entry in place. Thus, we reset its value size. However, if we were allocating a new value, we must not reset the value size or we will BUG(). This resolves oss.oracle.com bug 1247. Signed-off-by: Tao Ma <tao.ma@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
@@ -2135,15 +2135,18 @@ alloc_value:
|
|||||||
orig_clusters = ocfs2_xa_value_clusters(loc);
|
orig_clusters = ocfs2_xa_value_clusters(loc);
|
||||||
rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt);
|
rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
/*
|
|
||||||
* If we tried to grow an existing external value,
|
|
||||||
* ocfs2_xa_cleanuP-value_truncate() is going to
|
|
||||||
* let it stand. We have to restore its original
|
|
||||||
* value size.
|
|
||||||
*/
|
|
||||||
loc->xl_entry->xe_value_size = orig_value_size;
|
|
||||||
ocfs2_xa_cleanup_value_truncate(loc, "growing",
|
ocfs2_xa_cleanup_value_truncate(loc, "growing",
|
||||||
orig_clusters);
|
orig_clusters);
|
||||||
|
/*
|
||||||
|
* If we were growing an existing value,
|
||||||
|
* ocfs2_xa_cleanup_value_truncate() won't remove
|
||||||
|
* the entry. We need to restore the original value
|
||||||
|
* size.
|
||||||
|
*/
|
||||||
|
if (loc->xl_entry) {
|
||||||
|
BUG_ON(!orig_value_size);
|
||||||
|
loc->xl_entry->xe_value_size = orig_value_size;
|
||||||
|
}
|
||||||
mlog_errno(rc);
|
mlog_errno(rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user