GOTO(out, rc);
}
- /*
- * The EA inode should NOT be in OI, old OI scrub may added
- * such OI mapping by wrong, replace it.
- */
- if (unlikely(osd_is_ea_inode(inode))) {
- iput(inode);
- goto update;
- }
-
rc = osd_get_lma(info, inode, dentry, &info->oti_ost_attrs);
if (rc == -ENODATA) {
rc = osd_get_idif(info, inode, dentry, oi_fid);
iput(inode);
inode = ERR_PTR(-ESTALE);
} else if (is_bad_inode(inode)) {
- rc = -ENOENT;
CWARN("%s: bad inode: ino = %u: rc = %d\n",
- osd_dev2name(dev), id->oii_ino, rc);
+ osd_dev2name(dev), id->oii_ino, -ENOENT);
iput(inode);
- inode = ERR_PTR(rc);
+ inode = ERR_PTR(-ENOENT);
+ } else if (osd_is_ea_inode(inode)) {
+ /*
+ * EA inode is internal ldiskfs object, should don't visible
+ * on osd
+ */
+ CDEBUG(D_INODE, "EA inode: ino = %u\n", id->oii_ino);
+ iput(inode);
+ inode = ERR_PTR(-ENOENT);
} else if ((rc = osd_attach_jinode(inode))) {
iput(inode);
inode = ERR_PTR(rc);
*/
again:
- inode = osd_ldiskfs_iget(osd_sb(dev), id->oii_ino);
+ inode = osd_iget(info, dev, id);
if (IS_ERR(inode)) {
rc = PTR_ERR(inode);
if (!trusted && (rc == -ENOENT || rc == -ESTALE))
GOTO(put, rc);
}
- if (is_bad_inode(inode)) {
- rc = -ENOENT;
- if (!trusted)
- goto check_oi;
-
- CDEBUG(D_INODE, "bad inode for FID: "DFID", ino = %u\n",
- PFID(fid), id->oii_ino);
- GOTO(put, rc);
- }
-
- if (id->oii_gen != OSD_OII_NOGEN &&
- inode->i_generation != id->oii_gen) {
- rc = -ESTALE;
- if (!trusted)
- goto check_oi;
-
- CDEBUG(D_INODE, "unmatched inode for FID: "DFID", ino = %u, "
- "oii_gen = %u, i_generation = %u\n", PFID(fid),
- id->oii_ino, id->oii_gen, inode->i_generation);
- GOTO(put, rc);
- }
-
- if (inode->i_nlink == 0) {
- rc = -ENOENT;
- if (!trusted)
- goto check_oi;
-
- CDEBUG(D_INODE, "stale inode for FID: "DFID", ino = %u\n",
- PFID(fid), id->oii_ino);
- GOTO(put, rc);
- }
-
- ldiskfs_clear_inode_state(inode, LDISKFS_STATE_LUSTRE_DESTROY);
-
check_oi:
if (rc != 0) {
__u32 saved_ino = id->oii_ino;
rc = -ENOENT;
else
rc = -EREMCHG;
- } else {
- if (id->oii_gen == OSD_OII_NOGEN)
- osd_id_gen(id, inode->i_ino, inode->i_generation);
-
- /*
- * Do not update file c/mtime in ldiskfs.
- * NB: we don't have any lock to protect this because we don't
- * have reference on osd_object now, but contention with
- * another lookup + attr_set can't happen in the tiny window
- * between if (...) and set S_NOCMTIME.
- */
- if (!(inode->i_flags & S_NOCMTIME))
- inode->i_flags |= S_NOCMTIME;
}
GOTO(put, rc);
/* Search order: 3. OI files. */
result = osd_oi_lookup(info, dev, fid, id, OI_CHECK_FLD);
if (result == -ENOENT) {
- if (!(fid_is_norm(fid) || fid_is_igif(fid)) ||
+ if (!fid_is_norm(fid) ||
fid_is_on_ost(info, dev, fid, OI_CHECK_FLD) ||
!ldiskfs_test_bit(osd_oi_fid2idx(dev, fid),
sf->sf_oi_bitmap))
return rc;
}
- /* The EA inode should NOT be in OI, old OI scrub may added
- * such OI mapping by wrong, replace it.
- */
- if (unlikely(osd_is_ea_inode(inode))) {
- iput(inode);
- goto update;
- }
-
rc = osd_get_lma(info, inode, &info->oti_obj_dentry,
&info->oti_ost_attrs);
iput(inode);
GOTO(out, rc);
}
- /* The inode has been reused as EA inode, ignore it. */
- if (unlikely(osd_is_ea_inode(inode)))
- GOTO(out, rc = 0);
-
sf->sf_flags |= SF_UPGRADE;
sf->sf_internal_flags &= ~SIF_NO_HANDLE_OLD_FID;
dev->od_check_ff = 1;
rc = 0;
GOTO(out, rc);
}
-
- /* The inode has been reused as EA inode, ignore it. */
- if (unlikely(osd_is_ea_inode(inode)))
- GOTO(out, rc = 0);
}
switch (val) {
if (dev->od_is_ost && S_ISREG(inode->i_mode) && inode->i_nlink > 1)
dev->od_scrub.os_scrub.os_has_ml_file = 1;
- /* It is an EA inode, no OI mapping for it, skip it. */
- if (osd_is_ea_inode(inode))
- GOTO(put, rc = SCRUB_NEXT_CONTINUE);
-
if (scrub &&
ldiskfs_test_inode_state(inode, LDISKFS_STATE_LUSTRE_NOSCRUB)) {
/* Only skip it for the first OI scrub accessing. */
}
run_test 60 "check mkfs.lustre --mkfsoptions -E -O options setting"
-test_61() { # LU-80
+test_61a() { # LU-80
local lxattr=$(large_xattr_enabled)
[ "$MDS1_VERSION" -ge $(version_code 2.1.53) ] ||
rm -f $file
cleanup || error "stopping systems failed"
}
-run_test 61 "large xattr"
+run_test 61a "large xattr"
+
+test_61b() { # LU-80
+ local lxattr=$(large_xattr_enabled)
+
+ [ "$MDS1_VERSION" -ge $(version_code 2.1.53) ] ||
+ skip "Need MDS version at least 2.1.53"
+
+ if [ "$mds1_FSTYPE" != ldiskfs ]; then
+ skip "ldiskfs specific bug"
+ fi
+
+ if ! large_xattr_enabled; then
+ lxattr=true
+
+ for num in $(seq $MDSCOUNT); do
+ do_facet mds${num} $TUNE2FS -O ea_inode \
+ $(mdsdevname $num) ||
+ error "tune2fs on mds $num failed"
+ done
+ fi
+
+ setup || error "setting up the filesystem failed"
+ client_up || error "starting client failed"
+
+ local _file=$MOUNT/panda
+ local large_value="$(generate_string $(max_xattr_size))"
+ local name="trusted.big"
+
+ touch ${_file} || error "touch ${_file} failed"
+ setfattr -n $name -v $large_value ${_file} ||
+ error "saving $name on $file failed"
+
+ MDT_DEV="${FSNAME}-MDT0000"
+ MDT_DEVNAME=$(mdsdevname ${SINGLEMDS//mds/})
+
+ stopall || error "stopping for e2fsck run"
+
+
+ ino=$(do_facet $SINGLEMDS "$DEBUGFS -R 'stat /ROOT/panda' \
+ ${MDT_DEVNAME} | grep trusted.big")
+ ino=$(echo "${ino}" | awk '{print $2;}')
+ echo "large ea "${ino}
+
+ do_facet $SINGLEMDS "$DEBUGFS -w -R \\\"ln $ino /lost+found\\\" \
+ ${MDT_DEVNAME}"
+
+ setup_noconfig || error "remounting the filesystem failed"
+
+ do_facet $SINGLEMDS $LCTL lfsck_start -M ${MDT_DEV} -t namespace || {
+ error "can't start lfsck namespace"
+ }
+
+ sleep 5
+ wait_update_facet $SINGLEMDS "$LCTL get_param -n \
+ mdd.${MDT_DEV}.lfsck_namespace |
+ awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+ error "(2) unexpected status"
+ }
+
+ stopall || error "stopping for e2fsck run"
+ for num in $(seq $MDSCOUNT); do
+ run_e2fsck $(facet_active_host mds$num) \
+ $(mdsdevname $num) "-y" ||
+ error "e2fsck MDT$num failed"
+ done
+ setup_noconfig || error "remounting the filesystem failed"
+
+ # need to delete this file to avoid problems in other tests
+ rm -f $file
+ cleanup || error "stopping systems failed"
+}
+run_test 61b "large xattr"
test_62() {
if [ "$mds1_FSTYPE" != ldiskfs ]; then