Whamcloud - gitweb
LU-3569 ofd: packing ost_idx in IDIF
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index 6e276b8..7339837 100644 (file)
@@ -62,6 +62,8 @@
 /* struct ptlrpc_thread */
 #include <lustre_net.h>
 #include <lustre_fid.h>
+/* process_config */
+#include <lustre_param.h>
 
 #include "osd_internal.h"
 #include "osd_dynlocks.h"
@@ -316,6 +318,32 @@ int osd_get_idif(struct osd_thread_info *info, struct inode *inode,
        return rc;
 }
 
+static int osd_lma_self_repair(struct osd_thread_info *info,
+                              struct osd_device *osd, struct inode *inode,
+                              const struct lu_fid *fid, __u32 compat)
+{
+       handle_t *jh;
+       int       rc;
+
+       LASSERT(current->journal_info == NULL);
+
+       jh = osd_journal_start_sb(osd_sb(osd), LDISKFS_HT_MISC,
+                                 osd_dto_credits_noquota[DTO_XATTR_SET]);
+       if (IS_ERR(jh)) {
+               rc = PTR_ERR(jh);
+               CWARN("%s: cannot start journal for lma_self_repair: rc = %d\n",
+                     osd_name(osd), rc);
+               return rc;
+       }
+
+       rc = osd_ea_fid_set(info, inode, fid, compat, 0);
+       if (rc != 0)
+               CWARN("%s: cannot self repair the LMA: rc = %d\n",
+                     osd_name(osd), rc);
+       ldiskfs_journal_stop(jh);
+       return rc;
+}
+
 static int osd_check_lma(const struct lu_env *env, struct osd_object *obj)
 {
        struct osd_thread_info  *info   = osd_oti_get(env);
@@ -324,6 +352,7 @@ static int osd_check_lma(const struct lu_env *env, struct osd_object *obj)
        struct inode            *inode  = obj->oo_inode;
        struct dentry           *dentry = &info->oti_obj_dentry;
        struct lu_fid           *fid    = NULL;
+       const struct lu_fid     *rfid   = lu_object_fid(&obj->oo_dt.do_lu);
        int                      rc;
        ENTRY;
 
@@ -333,40 +362,18 @@ static int osd_check_lma(const struct lu_env *env, struct osd_object *obj)
        CLASSERT(LMA_OLD_SIZE >= sizeof(*lma));
        rc = __osd_xattr_get(inode, dentry, XATTR_NAME_LMA,
                             info->oti_mdt_attrs_old, LMA_OLD_SIZE);
-       if (rc == -ENODATA && !fid_is_igif(lu_object_fid(&obj->oo_dt.do_lu)) &&
-           osd->od_check_ff) {
+       if (rc == -ENODATA && !fid_is_igif(rfid) && osd->od_check_ff) {
                fid = &lma->lma_self_fid;
                rc = osd_get_idif(info, inode, dentry, fid);
                if ((rc > 0) || (rc == -ENODATA && osd->od_lma_self_repair)) {
-                       handle_t *jh;
-
                        /* For the given OST-object, if it has neither LMA nor
                         * FID in XATTR_NAME_FID, then the given FID (which is
                         * contained in the @obj, from client RPC for locating
                         * the OST-object) is trusted. We use it to generate
                         * the LMA. */
-
-                       LASSERT(current->journal_info == NULL);
-
-                       jh = osd_journal_start_sb(osd_sb(osd), LDISKFS_HT_MISC,
-                                       osd_dto_credits_noquota[DTO_XATTR_SET]);
-                       if (IS_ERR(jh)) {
-                               CWARN("%s: cannot start journal for "
-                                     "lma_self_repair: rc = %ld\n",
-                                     osd_name(osd), PTR_ERR(jh));
-                               RETURN(0);
-                       }
-
-                       rc = osd_ea_fid_set(info, inode,
-                               lu_object_fid(&obj->oo_dt.do_lu),
-                               fid_is_on_ost(info, osd,
-                                             lu_object_fid(&obj->oo_dt.do_lu),
-                                             OI_CHECK_FLD) ?
-                               LMAC_FID_ON_OST : 0, 0);
-                       if (rc != 0)
-                               CWARN("%s: cannot self repair the LMA: "
-                                     "rc = %d\n", osd_name(osd), rc);
-                       ldiskfs_journal_stop(jh);
+                       osd_lma_self_repair(info, osd, inode, rfid,
+                               fid_is_on_ost(info, osd, fid, OI_CHECK_FLD) ?
+                               LMAC_FID_ON_OST : 0);
                        RETURN(0);
                }
        }
@@ -385,19 +392,39 @@ static int osd_check_lma(const struct lu_env *env, struct osd_object *obj)
                        CWARN("%s: unsupported incompat LMA feature(s) %#x for "
                              "fid = "DFID", ino = %lu\n", osd_name(osd),
                              lma->lma_incompat & ~LMA_INCOMPAT_SUPP,
-                             PFID(lu_object_fid(&obj->oo_dt.do_lu)),
-                             inode->i_ino);
+                             PFID(rfid), inode->i_ino);
                        rc = -EOPNOTSUPP;
                } else if (!(lma->lma_compat & LMAC_NOT_IN_OI)) {
                        fid = &lma->lma_self_fid;
                }
        }
 
-       if (fid != NULL &&
-           unlikely(!lu_fid_eq(lu_object_fid(&obj->oo_dt.do_lu), fid))) {
+       if (fid != NULL && unlikely(!lu_fid_eq(rfid, fid))) {
+               if (fid_is_idif(rfid) && fid_is_idif(fid)) {
+                       struct ost_id   *oi   = &info->oti_ostid;
+                       struct lu_fid   *fid1 = &info->oti_fid3;
+                       __u32            idx  = fid_idif_ost_idx(rfid);
+
+                       /* For old IDIF, the OST index is not part of the IDIF,
+                        * Means that different OSTs may have the same IDIFs.
+                        * Under such case, we need to make some compatible
+                        * check to make sure to trigger OI scrub properly. */
+                       if (idx != 0 && fid_idif_ost_idx(fid) == 0) {
+                               /* Given @rfid is new, LMA is old. */
+                               fid_to_ostid(fid, oi);
+                               ostid_to_fid(fid1, oi, idx);
+                               if (lu_fid_eq(fid1, rfid)) {
+                                       if (osd->od_lma_self_repair)
+                                               osd_lma_self_repair(info, osd,
+                                                       inode, rfid,
+                                                       LMAC_FID_ON_OST);
+                                       RETURN(0);
+                               }
+                       }
+               }
+
                CDEBUG(D_INODE, "%s: FID "DFID" != self_fid "DFID"\n",
-                      osd_name(osd), PFID(lu_object_fid(&obj->oo_dt.do_lu)),
-                      PFID(&lma->lma_self_fid));
+                      osd_name(osd), PFID(rfid), PFID(fid));
                rc = -EREMCHG;
        }
 
@@ -5509,8 +5536,8 @@ static struct lu_device *osd_device_fini(const struct lu_env *env,
        struct osd_device *o = osd_dev(d);
        ENTRY;
 
-       osd_procfs_fini(o);
        osd_shutdown(env, o);
+       osd_procfs_fini(o);
        osd_scrub_cleanup(env, o);
        osd_obj_map_fini(o);
        osd_umount(env, o);
@@ -5671,23 +5698,32 @@ static struct lu_device *osd_device_free(const struct lu_env *env,
 static int osd_process_config(const struct lu_env *env,
                               struct lu_device *d, struct lustre_cfg *cfg)
 {
-        struct osd_device *o = osd_dev(d);
-        int err;
-        ENTRY;
+       struct osd_device               *o = osd_dev(d);
+       int                             rc;
+       ENTRY;
 
-        switch(cfg->lcfg_command) {
-        case LCFG_SETUP:
-                err = osd_mount(env, o, cfg);
-                break;
-        case LCFG_CLEANUP:
+       switch (cfg->lcfg_command) {
+       case LCFG_SETUP:
+               rc = osd_mount(env, o, cfg);
+               break;
+       case LCFG_CLEANUP:
                lu_dev_del_linkage(d->ld_site, d);
-               err = osd_shutdown(env, o);
+               rc = osd_shutdown(env, o);
                break;
-        default:
-                err = -ENOSYS;
-        }
+       case LCFG_PARAM:
+               LASSERT(&o->od_dt_dev);
+               rc = class_process_proc_param(PARAM_OSD, lprocfs_osd_obd_vars,
+                                             cfg, &o->od_dt_dev);
+               if (rc > 0 || rc == -ENOSYS)
+                       rc = class_process_proc_param(PARAM_OST,
+                                                     lprocfs_osd_obd_vars,
+                                                     cfg, &o->od_dt_dev);
+               break;
+       default:
+               rc = -ENOSYS;
+       }
 
-        RETURN(err);
+       RETURN(rc);
 }
 
 static int osd_recovery_complete(const struct lu_env *env,
@@ -5820,11 +5856,9 @@ static struct obd_ops osd_obd_device_ops = {
 
 static int __init osd_mod_init(void)
 {
-        struct lprocfs_static_vars lvars;
        int rc;
 
        osd_oi_mod_init();
-       lprocfs_osd_init_vars(&lvars);
 
        rc = lu_kmem_init(ldiskfs_caches);
        if (rc)
@@ -5832,7 +5866,7 @@ static int __init osd_mod_init(void)
 
        rc = class_register_type(&osd_obd_device_ops, NULL, NULL,
 #ifndef HAVE_ONLY_PROCFS_SEQ
-                               lvars.module_vars,
+                               lprocfs_osd_module_vars,
 #endif
                                LUSTRE_OSD_LDISKFS_NAME, &osd_device_type);
        if (rc)