Whamcloud - gitweb
LU-16464 osp: fix off-by-one errors in oxe_can_hold() 17/49617/4 master
authorNikitas Angelinas <nikitas.angelinas@hpe.com>
Fri, 6 Jan 2023 19:01:52 +0000 (21:01 +0200)
committerOleg Drokin <green@whamcloud.com>
Fri, 27 Jan 2023 00:36:18 +0000 (00:36 +0000)
There are a couple of off-by-one errors when calculating the required
buffer size in oxe_can_hold(), which can cause the xattr entry to be
reallocated unnecessarily.

HPE-bug-id: LUS-11423
Fixes: a1c5adf7f466 ("LU-14607 osp: separate buffer for large XATTR")
Change-Id: I486963066d7f8783ad64f1ea110fb73db0a8274b
Signed-off-by: Nikitas Angelinas <nikitas.angelinas@hpe.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/49617
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osp/osp_object.c

index a2f245b..078b1e3 100644 (file)
@@ -340,13 +340,21 @@ osp_oac_xattr_find_or_add(struct osp_object *obj, const char *name, size_t len)
        return oxe;
 }
 
-/* whether \a oxe is large enough to hold XATTR value */
+/**
+ * Check whether \a oxe is large enough to hold the xattr value
+ *
+ * \param[in] oxe      pointer to the OSP object attributes cache xattr entry
+ * \param[in] len      xattr value size in bytes
+ *
+ * \retval             true if xattr can fit in \a oxe
+ * \retval             false if xattr can not fit in \a oxe
+ */
 static inline bool oxe_can_hold(struct osp_xattr_entry *oxe, size_t len)
 {
        if (unlikely(oxe->oxe_largebuf))
-               return oxe->oxe_buflen > len;
+               return oxe->oxe_buflen >= len;
 
-       return oxe->oxe_buflen - oxe->oxe_namelen - 1 - sizeof(*oxe) > len;
+       return oxe->oxe_buflen - oxe->oxe_namelen - 1 - sizeof(*oxe) >= len;
 }
 
 /**