mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
xfs: use local variables for name and value length in _attri_commit_pass2
We're about to start using tagged unions in the xattr log format, so create a bunch of local variables in the recovery function so we only have to decode the log item fields once. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
0aeeeb7969
commit
c07f018bc0
@ -738,9 +738,11 @@ xlog_recover_attri_commit_pass2(
|
||||
struct xfs_attri_log_item *attrip;
|
||||
struct xfs_attri_log_format *attri_formatp;
|
||||
struct xfs_attri_log_nameval *nv;
|
||||
const void *attr_value = NULL;
|
||||
const void *attr_name;
|
||||
const void *attr_value = NULL;
|
||||
size_t len;
|
||||
unsigned int name_len = 0;
|
||||
unsigned int value_len = 0;
|
||||
unsigned int op, i = 0;
|
||||
|
||||
/* Validate xfs_attri_log_format before the large memory allocation */
|
||||
@ -769,6 +771,8 @@ xlog_recover_attri_commit_pass2(
|
||||
attri_formatp, len);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
name_len = attri_formatp->alfi_name_len;
|
||||
value_len = attri_formatp->alfi_value_len;
|
||||
break;
|
||||
case XFS_ATTRI_OP_FLAGS_REMOVE:
|
||||
/* Log item, attr name */
|
||||
@ -777,6 +781,7 @@ xlog_recover_attri_commit_pass2(
|
||||
attri_formatp, len);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
name_len = attri_formatp->alfi_name_len;
|
||||
break;
|
||||
default:
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||
@ -786,15 +791,14 @@ xlog_recover_attri_commit_pass2(
|
||||
i++;
|
||||
|
||||
/* Validate the attr name */
|
||||
if (item->ri_buf[i].i_len !=
|
||||
xlog_calc_iovec_len(attri_formatp->alfi_name_len)) {
|
||||
if (item->ri_buf[i].i_len != xlog_calc_iovec_len(name_len)) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||
attri_formatp, len);
|
||||
return -EFSCORRUPTED;
|
||||
}
|
||||
|
||||
attr_name = item->ri_buf[i].i_addr;
|
||||
if (!xfs_attr_namecheck(attr_name, attri_formatp->alfi_name_len)) {
|
||||
if (!xfs_attr_namecheck(attr_name, name_len)) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||
attri_formatp, len);
|
||||
return -EFSCORRUPTED;
|
||||
@ -802,8 +806,8 @@ xlog_recover_attri_commit_pass2(
|
||||
i++;
|
||||
|
||||
/* Validate the attr value, if present */
|
||||
if (attri_formatp->alfi_value_len != 0) {
|
||||
if (item->ri_buf[i].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
|
||||
if (value_len != 0) {
|
||||
if (item->ri_buf[i].i_len != xlog_calc_iovec_len(value_len)) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||
item->ri_buf[0].i_addr,
|
||||
item->ri_buf[0].i_len);
|
||||
@ -827,7 +831,7 @@ xlog_recover_attri_commit_pass2(
|
||||
switch (op) {
|
||||
case XFS_ATTRI_OP_FLAGS_REMOVE:
|
||||
/* Regular remove operations operate only on names. */
|
||||
if (attr_value != NULL || attri_formatp->alfi_value_len != 0) {
|
||||
if (attr_value != NULL || value_len != 0) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||
attri_formatp, len);
|
||||
return -EFSCORRUPTED;
|
||||
@ -840,7 +844,7 @@ xlog_recover_attri_commit_pass2(
|
||||
* and do not take a newname. Values are optional for set and
|
||||
* replace.
|
||||
*/
|
||||
if (attr_name == NULL || attri_formatp->alfi_name_len == 0) {
|
||||
if (attr_name == NULL || name_len == 0) {
|
||||
XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
|
||||
attri_formatp, len);
|
||||
return -EFSCORRUPTED;
|
||||
@ -853,9 +857,8 @@ xlog_recover_attri_commit_pass2(
|
||||
* name/value buffer to the recovered incore log item and drop our
|
||||
* reference.
|
||||
*/
|
||||
nv = xfs_attri_log_nameval_alloc(attr_name,
|
||||
attri_formatp->alfi_name_len, attr_value,
|
||||
attri_formatp->alfi_value_len);
|
||||
nv = xfs_attri_log_nameval_alloc(attr_name, name_len,
|
||||
attr_value, value_len);
|
||||
|
||||
attrip = xfs_attri_init(mp, nv);
|
||||
memcpy(&attrip->attri_format, attri_formatp, len);
|
||||
|
Loading…
Reference in New Issue
Block a user