do this unconditionally. mdd_finish_unlink() can't do this
properly as la_nlink cached in ma greater than 0. this
results in lost inodes (i.e. we still have an entry in OI,
but corresponding inode doesn't exist) and many messages
like:
LustreError: 3458:0:(osd_handler.c:3239:osd_object_ref_del())
lustre-MDT0001-osd: nlink == 0 on [0x240000403:0x53b:0x0],
maybe an upgraded file? (LU-3915)
the patch also adds a sanity check in osd_object_release() to
ensure that nobody is trying to leave non-destroyed object with
nlink = 0.
Change-Id: Iecfae75944854d8e9613431acb68ad17dfea90f0
Signed-off-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-on: http://review.whamcloud.com/18032
Reviewed-by: wangdi <di.wang@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
mdd_write_lock(env, mdd_sobj, MOR_TGT_CHILD);
mdd_write_lock(env, mdd_sobj, MOR_TGT_CHILD);
- /* Increase mod_count to add the source object to the orphan list,
- * so if other clients still send RPC to the old object, then these
- * objects can help the request to find the new object, see
- * mdt_reint_open() */
- mdd_sobj->mod_count++;
- rc = mdd_finish_unlink(env, mdd_sobj, ma, mdd_pobj, lname, handle);
- mdd_sobj->mod_count--;
+ mdd_sobj->mod_flags |= DEAD_OBJ;
+ rc = mdd_mark_orphan_object(env, mdd_sobj, handle, false);
+ if (rc != 0)
+ GOTO(out_unlock, rc);
+
+ rc = __mdd_orphan_add(env, mdd_sobj, handle);
if (rc != 0)
GOTO(out_unlock, rc);
if (rc != 0)
GOTO(out_unlock, rc);
static void osd_object_release(const struct lu_env *env,
struct lu_object *l)
{
static void osd_object_release(const struct lu_env *env,
struct lu_object *l)
{
+ struct osd_object *o = osd_obj(l);
+ /* nobody should be releasing a non-destroyed object with nlink=0
+ * the API allows this, but ldiskfs doesn't like and then report
+ * this inode as deleted */
+ if (unlikely(!o->oo_destroyed && o->oo_inode && o->oo_inode->i_nlink == 0))
+ LBUG();