]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: use local variables for name and value length in _attri_commit_pass2
authorDarrick J. Wong <djwong@kernel.org>
Mon, 22 Apr 2024 16:47:32 +0000 (09:47 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 23 Apr 2024 14:46:54 +0000 (07:46 -0700)
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>
fs/xfs/xfs_attr_item.c

index 8a13e2840692c962092b63eb714b9c2f84ba286c..59723e5f483e2c00a310ab05d44a1a89cf9ef403 100644 (file)
@@ -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);