if (IS_ERR(obj))
GOTO(out, rc = PTR_ERR(obj));
+
if (mdt_object_exists(obj) && !mdt_object_remote(obj)) {
- layout_size = mdt_attr_get_eabuf_size(info, obj);
- if (layout_size < 0)
- GOTO(out_obj, rc = layout_size);
+ /* if layout is going to be changed don't use the current EA
+ * size but the maximum one. That buffer will be shrinked
+ * to the actual size in req_capsule_shrink() before reply.
+ */
+ if (layout.mlc_opc == MD_LAYOUT_WRITE) {
+ layout_size = info->mti_mdt->mdt_max_mdsize;
+ } else {
+ layout_size = mdt_attr_get_eabuf_size(info, obj);
+ if (layout_size < 0)
+ GOTO(out_obj, rc = layout_size);
- if (layout_size > info->mti_mdt->mdt_max_mdsize)
- info->mti_mdt->mdt_max_mdsize = layout_size;
+ if (layout_size > info->mti_mdt->mdt_max_mdsize)
+ info->mti_mdt->mdt_max_mdsize = layout_size;
+ }
}
/*
if (buf->lb_len > 0)
mdt_fix_lov_magic(info, buf->lb_buf);
}
-
/*
* Instantiate some layout components, if @buf contains
* lovea, then it's a replay of the layout intent write
if (rc > 0) {
struct lu_buf *lmm = NULL;
if (lvblen < rc) {
- CERROR("%s: expected %d actual %d.\n",
- mdt_obd_name(mdt), rc, lvblen);
- /* if layout size is bigger then update max_mdsize */
- if (rc > info->mti_mdt->mdt_max_mdsize)
+ int level;
+
+ /* The layout EA may be larger than mdt_max_mdsize
+ * and in that case mdt_max_mdsize is just updated
+ * but if EA size is less than mdt_max_mdsize then
+ * it is an error in lvblen value provided. */
+ if (rc > info->mti_mdt->mdt_max_mdsize) {
info->mti_mdt->mdt_max_mdsize = rc;
+ level = D_INFO;
+ } else {
+ level = D_ERROR;
+ }
+ CDEBUG_LIMIT(level, "%s: small buffer size %d for EA "
+ "%d (max_mdsize %d): rc = %d\n",
+ mdt_obd_name(mdt), lvblen, rc,
+ info->mti_mdt->mdt_max_mdsize, -ERANGE);
GOTO(out, rc = -ERANGE);
}
lmm = &info->mti_buf;