Whamcloud - gitweb
LU-6846 osd: reset do_body_ops after creation
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index 6bce54c..8c2486c 100644 (file)
@@ -1898,8 +1898,9 @@ static int osd_mkfile(struct osd_thread_info *info, struct osd_object *obj,
         oth = container_of(th, struct osd_thandle, ot_super);
         LASSERT(oth->ot_handle->h_transaction != NULL);
 
-        if (hint && hint->dah_parent)
-                parent = hint->dah_parent;
+       if (hint != NULL && hint->dah_parent != NULL &&
+           !dt_object_remote(hint->dah_parent))
+               parent = hint->dah_parent;
 
         inode = ldiskfs_create_inode(oth->ot_handle,
                                      parent ? osd_dt_obj(parent)->oo_inode :
@@ -2234,8 +2235,13 @@ static int osd_declare_object_create(const struct lu_env *env,
        oh = container_of0(handle, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle == NULL);
 
+       /* EA object consumes more credits than regular object: osd_mk_index
+        * vs. osd_mkreg: osd_mk_index will create 2 blocks for root_node and
+        * leaf_node, could involves the block, block bitmap, groups, GDT
+        * change for each block, so add 4 * 2 credits in that case. */
        osd_trans_declare_op(env, oh, OSD_OT_CREATE,
-                            osd_dto_credits_noquota[DTO_OBJECT_CREATE]);
+                            osd_dto_credits_noquota[DTO_OBJECT_CREATE] +
+                            (dof->dof_type == DFT_INDEX) ? 4 * 2 : 0);
        /* Reuse idle OI block may cause additional one OI block
         * to be changed. */
        osd_trans_declare_op(env, oh, OSD_OT_INSERT,
@@ -2277,9 +2283,11 @@ static int osd_object_create(const struct lu_env *env, struct dt_object *dt,
                RETURN(-EPERM);
 
        result = __osd_object_create(info, obj, attr, hint, dof, th);
-       if (result == 0)
+       if (result == 0) {
                result = __osd_oi_insert(env, obj, fid, th);
-
+               if (obj->oo_dt.do_body_ops == &osd_body_ops_new)
+                       obj->oo_dt.do_body_ops = &osd_body_ops;
+       }
        LASSERT(ergo(result == 0,
                dt_object_exists(dt) && !dt_object_remote(dt)));
 
@@ -2370,6 +2378,7 @@ static int osd_object_destroy(const struct lu_env *env,
 
        /* not needed in the cache anymore */
        set_bit(LU_OBJECT_HEARD_BANSHEE, &dt->do_lu.lo_header->loh_flags);
+       obj->oo_destroyed = 1;
 
        RETURN(0);
 }
@@ -2490,8 +2499,9 @@ static int osd_add_dot_dotdot_internal(struct osd_thread_info *info,
 
        dot_ldp = (struct ldiskfs_dentry_param *)info->oti_ldp;
        dot_ldp->edp_magic = 0;
+
        return ldiskfs_add_dot_dotdot(oth->ot_handle, parent_dir,
-                                       dir, dot_ldp, dot_dot_ldp);
+                                     dir, dot_ldp, dot_dot_ldp);
 }
 
 /**
@@ -2628,6 +2638,8 @@ static int osd_object_ea_create(const struct lu_env *env, struct dt_object *dt,
                                              fid, OI_CHECK_FLD) ?
                                LMAC_FID_ON_OST : 0, 0);
                }
+               if (obj->oo_dt.do_body_ops == &osd_body_ops_new)
+                       obj->oo_dt.do_body_ops = &osd_body_ops;
        }
 
        if (result == 0)
@@ -2847,15 +2859,20 @@ static int osd_declare_xattr_set(const struct lu_env *env,
        oh = container_of0(handle, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle == NULL);
 
-       /* optimistic optimization: LMA is set first and usually fit inode */
        if (strcmp(name, XATTR_NAME_LMA) == 0) {
-               if (dt_object_exists(dt))
+               /* For non-upgrading case, the LMA is set first and
+                * usually fit inode. But for upgrade case, the LMA
+                * may be in another separated EA block. */
+               if (!dt_object_exists(dt))
                        credits = 0;
-               else
+               else if (fl == LU_XATTR_REPLACE)
                        credits = 1;
+               else
+                       goto upgrade;
        } else if (strcmp(name, XATTR_NAME_VERSION) == 0) {
                credits = 1;
        } else {
+upgrade:
                credits = osd_dto_credits_noquota[DTO_XATTR_SET];
                if (buf && buf->lb_len > sb->s_blocksize) {
                        credits *= (buf->lb_len + sb->s_blocksize - 1) >>
@@ -3826,13 +3843,6 @@ static int osd_add_dot_dotdot(struct osd_thread_info *info,
                        dir->oo_compat_dotdot_created = 1;
        }
 
-       /* ldiskfs_init_new_dir() doesn't call ldiskfs_mark_inode_dirty()
-        * this seem as an optimization as usually it's called
-        * later to refresh mtime of the parent. Lustre does not
-        * update mtime in few cases (e.g. PENDING, .lustre)
-        * we still need to transfer i_size/etc to the buffer cache */
-       ldiskfs_mark_inode_dirty(oth->ot_handle, dir->oo_inode);
-
        return result;
 }
 
@@ -4660,7 +4670,7 @@ static struct dt_it *osd_it_ea_init(const struct lu_env *env,
        struct dentry           *obj_dentry;
        ENTRY;
 
-       if (!dt_object_exists(dt))
+       if (!dt_object_exists(dt) || obj->oo_destroyed)
                RETURN(ERR_PTR(-ENOENT));
 
        OBD_SLAB_ALLOC_PTR_GFP(oie, osd_itea_cachep, GFP_NOFS);