#define OBD_FAIL_OSD_OST_EA_FID_SET 0x197
#define OBD_FAIL_OSD_NO_OI_ENTRY 0x198
#define OBD_FAIL_OSD_INDEX_CRASH 0x199
-
#define OBD_FAIL_OSD_TXN_START 0x19a
-
#define OBD_FAIL_OSD_DUPLICATE_MAP 0x19b
+#define OBD_FAIL_OSD_REF_DEL 0x19c
#define OBD_FAIL_OFD_SET_OID 0x1e0
}
}
-/*
- * Concurrency: no concurrent access is possible that late in object
- * life-cycle (for all existing callers, that is. New callers have to provide
- * their own locking.)
- */
-static int osd_inode_unlinked(const struct inode *inode)
-{
- return inode->i_nlink == 0;
-}
-
enum {
OSD_TXN_OI_DELETE_CREDITS = 20,
OSD_TXN_INODE_DELETE_CREDITS = 20
}
if (S_ISDIR(inode->i_mode)) {
- LASSERT(osd_inode_unlinked(inode) || inode->i_nlink == 1 ||
- inode->i_nlink == 2);
+ if (inode->i_nlink > 2)
+ CERROR("%s: directory "DFID" ino %lu link count is %u at unlink. run e2fsck to repair\n",
+ osd_name(osd), PFID(fid), inode->i_ino,
+ inode->i_nlink);
spin_lock(&obj->oo_guard);
clear_nlink(inode);
LASSERT(osd_is_write_locked(env, obj));
LASSERT(th != NULL);
+ if (OBD_FAIL_CHECK(OBD_FAIL_OSD_REF_DEL))
+ return -EIO;
+
oh = container_of(th, struct osd_thandle, ot_super);
LASSERT(oh->ot_handle != NULL);
}
run_test 48e "Access to recreated parent subdir (should return errors)"
+test_48f() {
+ [[ $MDS1_VERSION -ge $(version_code 2.13.55) ]] ||
+ skip "need MDS >= 2.13.55"
+ [[ $MDSCOUNT -ge 2 ]] || skip "needs >= 2 MDTs"
+ [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] ||
+ skip "needs different host for mdt1 mdt2"
+ [[ $(facet_fstype mds1) == ldiskfs ]] || skip "ldiskfs only"
+
+ $LFS mkdir -i0 $DIR/$tdir
+ $LFS mkdir -i 1 $DIR/$tdir/sub1 $DIR/$tdir/sub2 $DIR/$tdir/sub3
+
+ for d in sub1 sub2 sub3; do
+ #define OBD_FAIL_OSD_REF_DEL 0x19c
+ do_facet mds1 $LCTL set_param fail_loc=0x8000019c
+ rm -rf $DIR/$tdir/$d && error "rm $d should fail"
+ done
+
+ rm -d --interactive=never $DIR/$tdir || error "rm $tdir fail"
+}
+run_test 48f "non-zero nlink dir unlink won't LBUG()"
+
test_49() { # LU-1030
[ $PARALLEL == "yes" ] && skip "skip parallel run"
remote_ost_nodsh && skip "remote OST with nodsh"