X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_oi.c;h=ae3d5c10a6cc829f2ad40d9cbd2c5949eef61f94;hb=8813fdf2a4f2055e4867df653644f12ac4c78b15;hp=b4bfb9a34549e65a8d2286a9e73fb7a78dd819a1;hpb=9e3436c298d65a5867920b0de0d3920972465407;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_oi.c b/lustre/osd-ldiskfs/osd_oi.c index b4bfb9a..ae3d5c1 100644 --- a/lustre/osd-ldiskfs/osd_oi.c +++ b/lustre/osd-ldiskfs/osd_oi.c @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2013, Intel Corporation. + * Copyright (c) 2012, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,7 +40,7 @@ * Author: Nikita Danilov */ -#define DEBUG_SUBSYSTEM S_MDS +#define DEBUG_SUBSYSTEM S_OSD #include @@ -139,6 +139,9 @@ static int osd_oi_index_create_one(struct osd_thread_info *info, return PTR_ERR(inode); } + ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NOSCRUB); + unlock_new_inode(inode); + if (feat->dif_flags & DT_IND_VARKEY) rc = iam_lvar_create(inode, feat->dif_keysize_max, feat->dif_ptrsize, feat->dif_recsize_max, @@ -148,7 +151,7 @@ static int osd_oi_index_create_one(struct osd_thread_info *info, feat->dif_ptrsize, feat->dif_recsize_max, jh); dentry = osd_child_dentry_by_inode(env, dir, name, strlen(name)); - rc = osd_ldiskfs_add_entry(jh, dentry, inode, NULL); + rc = osd_ldiskfs_add_entry(info, jh, dentry, inode, NULL); ldiskfs_journal_stop(jh); iput(inode); return rc; @@ -228,7 +231,6 @@ static int osd_oi_open(struct osd_thread_info *info, struct osd_device *osd, if (IS_ERR(inode)) RETURN(PTR_ERR(inode)); - ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI); /* 'What the @fid is' is not imporatant, because these objects * have no OI mappings, and only are visible inside the OSD.*/ lu_igif_build(&info->oti_fid, inode->i_ino, inode->i_generation); @@ -336,7 +338,54 @@ osd_oi_table_open(struct osd_thread_info *info, struct osd_device *osd, RETURN(count); } -int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd) +static int osd_remove_oi_one(struct dentry *parent, const char *name, + int namelen) +{ + struct dentry *child; + int rc; + + child = ll_lookup_one_len(name, parent, namelen); + if (IS_ERR(child)) { + rc = PTR_ERR(child); + } else { + rc = ll_vfs_unlink(parent->d_inode, child); + dput(child); + } + + return rc == -ENOENT ? 0 : rc; +} + +static int osd_remove_ois(struct osd_thread_info *info, struct osd_device *osd) +{ + char name[16]; + int namelen; + int rc; + int i; + + for (i = 0; i < osd->od_scrub.os_file.sf_oi_count; i++) { + namelen = snprintf(name, sizeof(name), "%s.%d", + OSD_OI_NAME_BASE, i); + rc = osd_remove_oi_one(osd_sb(osd)->s_root, name, namelen); + if (rc != 0) { + CERROR("%.16s: fail to remove the stale OI file %s: " + "rc = %d\n", + LDISKFS_SB(osd_sb(osd))->s_es->s_volume_name, + name, rc); + return rc; + } + } + + namelen = snprintf(name, sizeof(name), "%s", OSD_OI_NAME_BASE); + rc = osd_remove_oi_one(osd_sb(osd)->s_root, name, namelen); + if (rc != 0) + CERROR("%.16s: fail to remove the stale OI file %s: rc = %d\n", + LDISKFS_SB(osd_sb(osd))->s_es->s_volume_name, name, rc); + + return rc; +} + +int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd, + bool restored) { struct osd_scrub *scrub = &osd->od_scrub; struct scrub_file *sf = &scrub->os_file; @@ -344,6 +393,12 @@ int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd) int rc; ENTRY; + if (restored) { + rc = osd_remove_ois(info, osd); + if (rc != 0) + return rc; + } + OBD_ALLOC(oi, sizeof(*oi) * OSD_OI_FID_NR_MAX); if (oi == NULL) RETURN(-ENOMEM); @@ -512,6 +567,9 @@ int fid_is_on_ost(struct osd_thread_info *info, struct osd_device *osd, if (!(flags & OI_CHECK_FLD)) RETURN(0); + if (osd_seq_site(osd)->ss_server_fld == NULL) + RETURN(0); + rc = osd_fld_lookup(info->oti_env, osd, fid_seq(fid), range); if (rc != 0) { if (rc != -ENOENT) @@ -642,7 +700,7 @@ int osd_oi_insert(struct osd_thread_info *info, struct osd_device *osd, return rc; if (unlikely(osd_id_eq(id, oi_id))) - return 0; + return 1; /* Check whether the mapping for oi_id is valid or not. */ inode = osd_iget(info, osd, oi_id); @@ -653,6 +711,13 @@ int osd_oi_insert(struct osd_thread_info *info, struct osd_device *osd, 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, lma); iput(inode); if (rc == -ENODATA)