Whamcloud - gitweb
LU-5099 api: transfer object type via dt_insert API
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index 8b2d5b9..e4412fb 100644 (file)
@@ -41,7 +41,7 @@
  *         Pravin Shelar <pravin.shelar@sun.com> : Added fid in dirent
  */
 
-#define DEBUG_SUBSYSTEM S_MDS
+#define DEBUG_SUBSYSTEM S_OSD
 
 #include <linux/module.h>
 
@@ -466,9 +466,6 @@ static int osd_check_lma(const struct lu_env *env, struct osd_object *obj)
        int                      rc;
        ENTRY;
 
-       if (OBD_FAIL_CHECK(OBD_FAIL_OSD_COMPAT_INVALID_ENTRY))
-               RETURN(0);
-
        CLASSERT(LMA_OLD_SIZE >= sizeof(*lma));
        rc = __osd_xattr_get(inode, dentry, XATTR_NAME_LMA,
                             info->oti_mdt_attrs_old, LMA_OLD_SIZE);
@@ -589,7 +586,7 @@ static int osd_fid_lookup(const struct lu_env *env, struct osd_object *obj,
        }
 
        id = &info->oti_id;
-       if (!cfs_list_empty(&scrub->os_inconsistent_items)) {
+       if (!list_empty(&scrub->os_inconsistent_items)) {
                /* Search order: 2. OI scrub pending list. */
                result = osd_oii_lookup(dev, fid, id);
                if (result == 0)
@@ -915,11 +912,11 @@ static void osd_trans_commit_cb(struct super_block *sb,
         dt_txn_hook_commit(th);
 
        /* call per-transaction callbacks if any */
-       cfs_list_for_each_entry_safe(dcb, tmp, &oh->ot_dcb_list, dcb_linkage) {
+       list_for_each_entry_safe(dcb, tmp, &oh->ot_dcb_list, dcb_linkage) {
                LASSERTF(dcb->dcb_magic == TRANS_COMMIT_CB_MAGIC,
                         "commit callback entry: magic=%x name='%s'\n",
                         dcb->dcb_magic, dcb->dcb_name);
-               cfs_list_del_init(&dcb->dcb_linkage);
+               list_del_init(&dcb->dcb_linkage);
                dcb->dcb_func(NULL, th, dcb, error);
        }
 
@@ -957,7 +954,7 @@ static struct thandle *osd_trans_create(const struct lu_env *env,
                atomic_set(&th->th_refc, 1);
                th->th_alloc_size = sizeof(*oh);
                oti->oti_dev = osd_dt_dev(d);
-               CFS_INIT_LIST_HEAD(&oh->ot_dcb_list);
+               INIT_LIST_HEAD(&oh->ot_dcb_list);
                osd_th_alloced(oh);
 
                memset(oti->oti_declare_ops, 0,
@@ -1078,8 +1075,8 @@ static int osd_seq_exists(const struct lu_env *env,
        int                     rc;
        ENTRY;
 
-       if (ss == NULL)
-               RETURN(1);
+       LASSERT(ss != NULL);
+       LASSERT(ss->ss_server_fld != NULL);
 
        rc = osd_fld_lookup(env, osd, seq, range);
        if (rc != 0) {
@@ -1154,6 +1151,7 @@ static int osd_trans_stop(const struct lu_env *env, struct dt_device *dt,
         */
        wait_event(iobuf->dr_wait,
                       atomic_read(&iobuf->dr_numreqs) == 0);
+       osd_fini_iobuf(oti->oti_dev, iobuf);
        if (!rc)
                rc = iobuf->dr_error;
 
@@ -1167,7 +1165,7 @@ static int osd_trans_cb_add(struct thandle *th, struct dt_txn_commit_cb *dcb)
 
        LASSERT(dcb->dcb_magic == TRANS_COMMIT_CB_MAGIC);
        LASSERT(&dcb->dcb_func != NULL);
-       cfs_list_add(&dcb->dcb_linkage, &oh->ot_dcb_list);
+       list_add(&dcb->dcb_linkage, &oh->ot_dcb_list);
 
        return 0;
 }
@@ -1193,8 +1191,8 @@ static void osd_object_delete(const struct lu_env *env, struct lu_object *l)
         osd_index_fini(obj);
         if (inode != NULL) {
                struct qsd_instance     *qsd = osd_obj2dev(obj)->od_quota_slave;
-               qid_t                    uid = inode->i_uid;
-               qid_t                    gid = inode->i_gid;
+               qid_t                    uid = i_uid_read(inode);
+               qid_t                    gid = i_gid_read(inode);
 
                 iput(inode);
                 obj->oo_inode = NULL;
@@ -1689,26 +1687,26 @@ static struct timespec *osd_inode_time(const struct lu_env *env,
 
 
 static void osd_inode_getattr(const struct lu_env *env,
-                              struct inode *inode, struct lu_attr *attr)
-{
-        attr->la_valid      |= LA_ATIME | LA_MTIME | LA_CTIME | LA_MODE |
-                               LA_SIZE | LA_BLOCKS | LA_UID | LA_GID |
-                               LA_FLAGS | LA_NLINK | LA_RDEV | LA_BLKSIZE |
-                              LA_TYPE;
-
-        attr->la_atime      = LTIME_S(inode->i_atime);
-        attr->la_mtime      = LTIME_S(inode->i_mtime);
-        attr->la_ctime      = LTIME_S(inode->i_ctime);
-        attr->la_mode       = inode->i_mode;
-        attr->la_size       = i_size_read(inode);
-        attr->la_blocks     = inode->i_blocks;
-        attr->la_uid        = inode->i_uid;
-        attr->la_gid        = inode->i_gid;
-        attr->la_flags      = LDISKFS_I(inode)->i_flags;
-        attr->la_nlink      = inode->i_nlink;
-        attr->la_rdev       = inode->i_rdev;
-       attr->la_blksize    = 1 << inode->i_blkbits;
-       attr->la_blkbits    = inode->i_blkbits;
+                             struct inode *inode, struct lu_attr *attr)
+{
+       attr->la_valid  |= LA_ATIME | LA_MTIME | LA_CTIME | LA_MODE |
+                          LA_SIZE | LA_BLOCKS | LA_UID | LA_GID |
+                          LA_FLAGS | LA_NLINK | LA_RDEV | LA_BLKSIZE |
+                          LA_TYPE;
+
+       attr->la_atime   = LTIME_S(inode->i_atime);
+       attr->la_mtime   = LTIME_S(inode->i_mtime);
+       attr->la_ctime   = LTIME_S(inode->i_ctime);
+       attr->la_mode    = inode->i_mode;
+       attr->la_size    = i_size_read(inode);
+       attr->la_blocks  = inode->i_blocks;
+       attr->la_uid     = i_uid_read(inode);
+       attr->la_gid     = i_gid_read(inode);
+       attr->la_flags   = LDISKFS_I(inode)->i_flags;
+       attr->la_nlink   = inode->i_nlink;
+       attr->la_rdev    = inode->i_rdev;
+       attr->la_blksize = 1 << inode->i_blkbits;
+       attr->la_blkbits = inode->i_blkbits;
 }
 
 static int osd_attr_get(const struct lu_env *env,
@@ -1739,6 +1737,8 @@ static int osd_declare_attr_set(const struct lu_env *env,
        struct osd_object      *obj;
        struct osd_thread_info *info = osd_oti_get(env);
        struct lquota_id_info  *qi = &info->oti_qi;
+       qid_t                   uid;
+       qid_t                   gid;
        long long               bspace;
        int                     rc = 0;
        bool                    allocated;
@@ -1770,7 +1770,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
         * credits for updating quota accounting files and to trigger quota
         * space adjustment once the operation is completed.*/
        if ((attr->la_valid & LA_UID) != 0 &&
-            attr->la_uid != obj->oo_inode->i_uid) {
+            attr->la_uid != (uid = i_uid_read(obj->oo_inode))) {
                qi->lqi_type = USRQUOTA;
 
                /* inode accounting */
@@ -1787,7 +1787,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
                        RETURN(rc);
 
                /* and one less inode for the current uid */
-               qi->lqi_id.qid_uid = obj->oo_inode->i_uid;
+               qi->lqi_id.qid_uid = uid;
                qi->lqi_space      = -1;
                rc = osd_declare_qid(env, oh, qi, true, NULL);
                if (rc == -EDQUOT || rc == -EINPROGRESS)
@@ -1809,7 +1809,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
                        RETURN(rc);
 
                /* and finally less blocks for the current owner */
-               qi->lqi_id.qid_uid = obj->oo_inode->i_uid;
+               qi->lqi_id.qid_uid = uid;
                qi->lqi_space      = -bspace;
                rc = osd_declare_qid(env, oh, qi, true, NULL);
                if (rc == -EDQUOT || rc == -EINPROGRESS)
@@ -1819,7 +1819,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
        }
 
        if (attr->la_valid & LA_GID &&
-           attr->la_gid != obj->oo_inode->i_gid) {
+           attr->la_gid != (gid = i_gid_read(obj->oo_inode))) {
                qi->lqi_type = GRPQUOTA;
 
                /* inode accounting */
@@ -1836,7 +1836,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
                        RETURN(rc);
 
                /* and one less inode for the current gid */
-               qi->lqi_id.qid_gid = obj->oo_inode->i_gid;
+               qi->lqi_id.qid_gid = gid;
                qi->lqi_space      = -1;
                rc = osd_declare_qid(env, oh, qi, true, NULL);
                if (rc == -EDQUOT || rc == -EINPROGRESS)
@@ -1858,7 +1858,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
                        RETURN(rc);
 
                /* and finally less blocks for the current owner */
-               qi->lqi_id.qid_gid = obj->oo_inode->i_gid;
+               qi->lqi_id.qid_gid = gid;
                qi->lqi_space      = -bspace;
                rc = osd_declare_qid(env, oh, qi, true, NULL);
                if (rc == -EDQUOT || rc == -EINPROGRESS)
@@ -1871,11 +1871,16 @@ static int osd_declare_attr_set(const struct lu_env *env,
 }
 
 static int osd_inode_setattr(const struct lu_env *env,
-                             struct inode *inode, const struct lu_attr *attr)
+                            struct inode *inode, const struct lu_attr *attr)
 {
-        __u64 bits;
+       __u64 bits = attr->la_valid;
+
+       /* Only allow set size for regular file */
+       if (!S_ISREG(inode->i_mode))
+               bits &= ~(LA_SIZE | LA_BLOCKS);
 
-        bits = attr->la_valid;
+       if (bits == 0)
+               return 0;
 
         if (bits & LA_ATIME)
                 inode->i_atime  = *osd_inode_time(env, inode, attr->la_atime);
@@ -1894,17 +1899,17 @@ static int osd_inode_setattr(const struct lu_env *env,
         if (bits & LA_BLOCKS)
                 inode->i_blocks = attr->la_blocks;
 #endif
-        if (bits & LA_MODE)
-                inode->i_mode   = (inode->i_mode & S_IFMT) |
-                        (attr->la_mode & ~S_IFMT);
-        if (bits & LA_UID)
-                inode->i_uid    = attr->la_uid;
-        if (bits & LA_GID)
-                inode->i_gid    = attr->la_gid;
-        if (bits & LA_NLINK)
+       if (bits & LA_MODE)
+               inode->i_mode = (inode->i_mode & S_IFMT) |
+                               (attr->la_mode & ~S_IFMT);
+       if (bits & LA_UID)
+               i_uid_write(inode, attr->la_uid);
+       if (bits & LA_GID)
+               i_gid_write(inode, attr->la_gid);
+       if (bits & LA_NLINK)
                set_nlink(inode, attr->la_nlink);
-        if (bits & LA_RDEV)
-                inode->i_rdev   = attr->la_rdev;
+       if (bits & LA_RDEV)
+               inode->i_rdev = attr->la_rdev;
 
         if (bits & LA_FLAGS) {
                 /* always keep S_NOCMTIME */
@@ -1916,8 +1921,8 @@ static int osd_inode_setattr(const struct lu_env *env,
 
 static int osd_quota_transfer(struct inode *inode, const struct lu_attr *attr)
 {
-       if ((attr->la_valid & LA_UID && attr->la_uid != inode->i_uid) ||
-           (attr->la_valid & LA_GID && attr->la_gid != inode->i_gid)) {
+       if ((attr->la_valid & LA_UID && attr->la_uid != i_uid_read(inode)) ||
+           (attr->la_valid & LA_GID && attr->la_gid != i_gid_read(inode))) {
                struct iattr    iattr;
                int             rc;
 
@@ -1926,8 +1931,8 @@ static int osd_quota_transfer(struct inode *inode, const struct lu_attr *attr)
                        iattr.ia_valid |= ATTR_UID;
                if (attr->la_valid & LA_GID)
                        iattr.ia_valid |= ATTR_GID;
-               iattr.ia_uid = attr->la_uid;
-               iattr.ia_gid = attr->la_gid;
+               iattr.ia_uid = make_kuid(&init_user_ns, attr->la_uid);
+               iattr.ia_gid = make_kgid(&init_user_ns, attr->la_gid);
 
                rc = ll_vfs_dq_transfer(inode, &iattr);
                if (rc) {
@@ -2445,13 +2450,13 @@ static int osd_declare_object_destroy(const struct lu_env *env,
        osd_trans_declare_op(env, oh, OSD_OT_DELETE,
                             osd_dto_credits_noquota[DTO_INDEX_DELETE] + 3);
        /* one less inode */
-       rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, -1, oh,
-                                  false, true, NULL, false);
+       rc = osd_declare_inode_qid(env, i_uid_read(inode), i_gid_read(inode),
+                                  -1, oh, false, true, NULL, false);
        if (rc)
                RETURN(rc);
        /* data to be truncated */
-       rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, 0, oh,
-                                  true, true, NULL, false);
+       rc = osd_declare_inode_qid(env, i_uid_read(inode), i_gid_read(inode),
+                                  0, oh, true, true, NULL, false);
        RETURN(rc);
 }
 
@@ -2566,9 +2571,9 @@ int osd_ea_fid_set(struct osd_thread_info *info, struct inode *inode,
  * its inmemory API.
  */
 void osd_get_ldiskfs_dirent_param(struct ldiskfs_dentry_param *param,
-                                 const struct dt_rec *fid)
+                                 const struct lu_fid *fid)
 {
-       if (!fid_is_namespace_visible((const struct lu_fid *)fid) ||
+       if (!fid_is_namespace_visible(fid) ||
            OBD_FAIL_CHECK(OBD_FAIL_FID_IGIF)) {
                param->edp_magic = 0;
                return;
@@ -2605,9 +2610,9 @@ static int osd_ea_fid_get(const struct lu_env *env, struct osd_object *obj,
 
 static int osd_add_dot_dotdot_internal(struct osd_thread_info *info,
                                        struct inode *dir,
-                                       struct inode  *parent_dir,
-                                       const struct dt_rec *dot_fid,
-                                       const struct dt_rec *dot_dot_fid,
+                                       struct inode *parent_dir,
+                                       const struct lu_fid *dot_fid,
+                                       const struct lu_fid *dot_dot_fid,
                                        struct osd_thandle *oth)
 {
        struct ldiskfs_dentry_param *dot_ldp;
@@ -2629,6 +2634,7 @@ static struct inode *osd_create_local_agent_inode(const struct lu_env *env,
                                                  struct osd_device *osd,
                                                  struct osd_object *pobj,
                                                  const struct lu_fid *fid,
+                                                 __u32 type,
                                                  struct thandle *th)
 {
        struct osd_thread_info  *info = osd_oti_get(env);
@@ -2641,9 +2647,7 @@ static struct inode *osd_create_local_agent_inode(const struct lu_env *env,
        oh = container_of(th, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle->h_transaction != NULL);
 
-       /* FIXME: Insert index api needs to know the mode of
-        * the remote object. Just use S_IFDIR for now */
-       local = ldiskfs_create_inode(oh->ot_handle, pobj->oo_inode, S_IFDIR);
+       local = ldiskfs_create_inode(oh->ot_handle, pobj->oo_inode, type);
        if (IS_ERR(local)) {
                CERROR("%s: create local error %d\n", osd_name(osd),
                       (int)PTR_ERR(local));
@@ -2658,9 +2662,12 @@ static struct inode *osd_create_local_agent_inode(const struct lu_env *env,
                RETURN(ERR_PTR(rc));
        }
 
+       if (!S_ISDIR(type))
+               RETURN(local);
+
        rc = osd_add_dot_dotdot_internal(info, local, pobj->oo_inode,
-               (const struct dt_rec *)lu_object_fid(&pobj->oo_dt.do_lu),
-               (const struct dt_rec *)fid, oh);
+                                        lu_object_fid(&pobj->oo_dt.do_lu),
+                                        fid, oh);
        if (rc != 0) {
                CERROR("%s: "DFID" add dot dotdot error: rc = %d\n",
                        osd_name(osd), PFID(fid), rc);
@@ -2789,6 +2796,8 @@ static int osd_object_ref_add(const struct lu_env *env,
 
        osd_trans_exec_op(env, th, OSD_OT_REF_ADD);
 
+       CDEBUG(D_INODE, DFID" increase nlink %d\n",
+              PFID(lu_object_fid(&dt->do_lu)), inode->i_nlink);
        /*
         * The DIR_NLINK feature allows directories to exceed LDISKFS_LINK_MAX
         * (65000) subdirectories by storing "1" in i_nlink if the link count
@@ -2800,9 +2809,17 @@ static int osd_object_ref_add(const struct lu_env *env,
         * This also has to properly handle the case of inodes with nlink == 0
         * in case they are being linked into the PENDING directory
         */
+#ifdef I_LINKABLE
+       /* This is necessary to increment from i_nlink == 0 */
+       spin_lock(&inode->i_lock);
+       inode->i_state |= I_LINKABLE;
+       spin_unlock(&inode->i_lock);
+#endif
+
        spin_lock(&obj->oo_guard);
        ldiskfs_inc_count(oh->ot_handle, inode);
-       LASSERT(inode->i_nlink <= LDISKFS_LINK_MAX);
+       if (!S_ISDIR(inode->i_mode))
+               LASSERT(inode->i_nlink <= LDISKFS_LINK_MAX);
        spin_unlock(&obj->oo_guard);
 
        ll_dirty_inode(inode, I_DIRTY_DATASYNC);
@@ -2863,6 +2880,9 @@ static int osd_object_ref_del(const struct lu_env *env, struct dt_object *dt,
                return 0;
        }
 
+       CDEBUG(D_INODE, DFID" decrease nlink %d\n",
+              PFID(lu_object_fid(&dt->do_lu)), inode->i_nlink);
+
        ldiskfs_dec_count(oh->ot_handle, inode);
        spin_unlock(&obj->oo_guard);
 
@@ -3008,6 +3028,22 @@ static int osd_xattr_set(const struct lu_env *env, struct dt_object *dt,
        if (fl & LU_XATTR_CREATE)
                fs_flags |= XATTR_CREATE;
 
+       if (strcmp(name, XATTR_NAME_LMV) == 0) {
+               struct lustre_mdt_attrs *lma = &info->oti_mdt_attrs;
+               int                      rc;
+
+               rc = osd_get_lma(info, inode, &info->oti_obj_dentry, lma);
+               if (rc != 0)
+                       RETURN(rc);
+
+               lma->lma_incompat |= LMAI_STRIPED;
+               lustre_lma_swab(lma);
+               rc = __osd_xattr_set(info, inode, XATTR_NAME_LMA, lma,
+                                    sizeof(*lma), XATTR_REPLACE);
+               if (rc != 0)
+                       RETURN(rc);
+       }
+
        return __osd_xattr_set(info, inode, name, buf->lb_buf, buf->lb_len,
                               fs_flags);
 }
@@ -3114,16 +3150,16 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env,
        case LC_ID_NONE:
                RETURN(NULL);
        case LC_ID_PLAIN:
-               capa->lc_uid = obj->oo_inode->i_uid;
-               capa->lc_gid = obj->oo_inode->i_gid;
+               capa->lc_uid = i_uid_read(obj->oo_inode);
+               capa->lc_gid = i_gid_read(obj->oo_inode);
                capa->lc_flags = LC_ID_PLAIN;
                break;
        case LC_ID_CONVERT: {
                __u32 d[4], s[4];
 
-               s[0] = obj->oo_inode->i_uid;
+               s[0] = i_uid_read(obj->oo_inode);
                cfs_get_random_bytes(&(s[1]), sizeof(__u32));
-               s[2] = obj->oo_inode->i_gid;
+               s[2] = i_uid_read(obj->oo_inode);
                cfs_get_random_bytes(&(s[3]), sizeof(__u32));
                rc = capa_encrypt_id(d, s, key->lk_key, CAPA_HMAC_KEY_MAX_LEN);
                if (unlikely(rc))
@@ -3167,7 +3203,8 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env,
        RETURN(oc);
 }
 
-static int osd_object_sync(const struct lu_env *env, struct dt_object *dt)
+static int osd_object_sync(const struct lu_env *env, struct dt_object *dt,
+                          __u64 start, __u64 end)
 {
        struct osd_object       *obj    = osd_dt_obj(dt);
        struct inode            *inode  = obj->oo_inode;
@@ -3184,13 +3221,19 @@ static int osd_object_sync(const struct lu_env *env, struct dt_object *dt)
        file->f_mapping = inode->i_mapping;
        file->f_op = inode->i_fop;
        set_file_inode(file, inode);
-#ifndef HAVE_FILE_FSYNC_4ARGS
+
+#ifdef HAVE_FILE_FSYNC_4ARGS
+       rc = file->f_op->fsync(file, start, end, 0);
+#elif defined(HAVE_FILE_FSYNC_2ARGS)
        mutex_lock(&inode->i_mutex);
-#endif
-       rc = do_fsync(file, 0);
-#ifndef HAVE_FILE_FSYNC_4ARGS
+       rc = file->f_op->fsync(file, 0);
+       mutex_unlock(&inode->i_mutex);
+#else
+       mutex_lock(&inode->i_mutex);
+       rc = file->f_op->fsync(file, dentry, 0);
        mutex_unlock(&inode->i_mutex);
 #endif
+
        RETURN(rc);
 }
 
@@ -3312,7 +3355,8 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt,
                         * recheck under lock.
                         */
                        if (!osd_has_index(obj))
-                               result = osd_iam_container_init(env, obj, dir);
+                               result = osd_iam_container_init(env, obj,
+                                                               obj->oo_dir);
                        else
                                result = 0;
                        up_write(&obj->oo_ext_idx_sem);
@@ -3508,8 +3552,8 @@ static int osd_index_declare_ea_delete(const struct lu_env *env,
        inode = osd_dt_obj(dt)->oo_inode;
        LASSERT(inode);
 
-       rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, 0, oh,
-                                  true, true, NULL, false);
+       rc = osd_declare_inode_qid(env, i_uid_read(inode), i_gid_read(inode),
+                                  0, oh, true, true, NULL, false);
        RETURN(rc);
 }
 
@@ -3527,14 +3571,22 @@ static inline int osd_get_fid_from_dentry(struct ldiskfs_dir_entry_2 *de,
 }
 
 static int osd_remote_fid(const struct lu_env *env, struct osd_device *osd,
-                         struct lu_fid *fid)
+                         const struct lu_fid *fid)
 {
+       struct seq_server_site  *ss = osd_seq_site(osd);
        ENTRY;
 
        /* FID seqs not in FLDB, must be local seq */
        if (unlikely(!fid_seq_in_fldb(fid_seq(fid))))
                RETURN(0);
 
+       /* If FLD is not being initialized yet, it only happens during the
+        * initialization, likely during mgs initialization, and we assume
+        * this is local FID. */
+       if (ss == NULL || ss->ss_server_fld == NULL)
+               RETURN(0);
+
+       /* Only check the local FLDB here */
        if (osd_seq_exists(env, osd, fid_seq(fid)))
                RETURN(0);
 
@@ -3859,9 +3911,9 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt,
  * \retval -ve, on error
  */
 static int __osd_ea_add_rec(struct osd_thread_info *info,
-                            struct osd_object *pobj, struct inode  *cinode,
-                            const char *name, const struct dt_rec *fid,
-                            struct htree_lock *hlock, struct thandle *th)
+                           struct osd_object *pobj, struct inode  *cinode,
+                           const char *name, const struct lu_fid *fid,
+                           struct htree_lock *hlock, struct thandle *th)
 {
         struct ldiskfs_dentry_param *ldp;
         struct dentry               *child;
@@ -3900,11 +3952,11 @@ static int __osd_ea_add_rec(struct osd_thread_info *info,
  * \retval -ve, on error
  */
 static int osd_add_dot_dotdot(struct osd_thread_info *info,
-                              struct osd_object *dir,
-                              struct inode  *parent_dir, const char *name,
-                              const struct dt_rec *dot_fid,
-                              const struct dt_rec *dot_dot_fid,
-                              struct thandle *th)
+                             struct osd_object *dir,
+                             struct inode *parent_dir, const char *name,
+                             const struct lu_fid *dot_fid,
+                             const struct lu_fid *dot_dot_fid,
+                             struct thandle *th)
 {
         struct inode                *inode = dir->oo_inode;
         struct osd_thandle          *oth;
@@ -3932,8 +3984,8 @@ static int osd_add_dot_dotdot(struct osd_thread_info *info,
                }
 
                result = osd_add_dot_dotdot_internal(info, dir->oo_inode,
-                                               parent_dir, dot_fid,
-                                               dot_dot_fid, oth);
+                                                    parent_dir, dot_fid,
+                                                    dot_dot_fid, oth);
                if (result == 0)
                        dir->oo_compat_dotdot_created = 1;
        }
@@ -3947,8 +3999,8 @@ static int osd_add_dot_dotdot(struct osd_thread_info *info,
  * value, return by respective functions.
  */
 static int osd_ea_add_rec(const struct lu_env *env, struct osd_object *pobj,
-                          struct inode *cinode, const char *name,
-                          const struct dt_rec *fid, struct thandle *th)
+                         struct inode *cinode, const char *name,
+                         const struct lu_fid *fid, struct thandle *th)
 {
         struct osd_thread_info *info   = osd_oti_get(env);
         struct htree_lock      *hlock;
@@ -3963,9 +4015,10 @@ static int osd_ea_add_rec(const struct lu_env *env, struct osd_object *pobj,
                                            pobj->oo_inode, 0);
                 } else {
                        down_write(&pobj->oo_ext_idx_sem);
-                }
-                rc = osd_add_dot_dotdot(info, pobj, cinode, name,
-                     (struct dt_rec *)lu_object_fid(&pobj->oo_dt.do_lu),
+               }
+
+               rc = osd_add_dot_dotdot(info, pobj, cinode, name,
+                                       lu_object_fid(&pobj->oo_dt.do_lu),
                                         fid, th);
         } else {
                 if (hlock != NULL) {
@@ -3978,11 +4031,10 @@ static int osd_ea_add_rec(const struct lu_env *env, struct osd_object *pobj,
                if (OBD_FAIL_CHECK(OBD_FAIL_FID_INDIR)) {
                        struct lu_fid *tfid = &info->oti_fid;
 
-                       *tfid = *(const struct lu_fid *)fid;
+                       *tfid = *fid;
                        tfid->f_ver = ~0;
                        rc = __osd_ea_add_rec(info, pobj, cinode, name,
-                                             (const struct dt_rec *)tfid,
-                                             hlock, th);
+                                             tfid, hlock, th);
                } else {
                        rc = __osd_ea_add_rec(info, pobj, cinode, name, fid,
                                              hlock, th);
@@ -4261,21 +4313,14 @@ static int osd_index_declare_ea_insert(const struct lu_env *env,
        osd_trans_declare_op(env, oh, OSD_OT_INSERT,
                             osd_dto_credits_noquota[DTO_INDEX_INSERT]);
 
-       if (osd_dt_obj(dt)->oo_inode == NULL) {
-               const char *name  = (const char *)key;
-               /* Object is not being created yet. Only happens when
-                *     1. declare directory create
-                *     2. declare insert .
-                *     3. declare insert ..
-                */
-               LASSERT(strcmp(name, dotdot) == 0 || strcmp(name, dot) == 0);
-       } else {
+       if (osd_dt_obj(dt)->oo_inode != NULL) {
                struct inode *inode = osd_dt_obj(dt)->oo_inode;
 
                /* We ignore block quota on meta pool (MDTs), so needn't
                 * calculate how many blocks will be consumed by this index
                 * insert */
-               rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, 0,
+               rc = osd_declare_inode_qid(env, i_uid_read(inode),
+                                          i_gid_read(inode), 0,
                                           oh, true, true, NULL, false);
        }
 
@@ -4316,7 +4361,8 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt,
 {
        struct osd_object       *obj = osd_dt_obj(dt);
        struct osd_device       *osd = osd_dev(dt->do_lu.lo_dev);
-       struct lu_fid           *fid = (struct lu_fid *) rec;
+       struct dt_insert_rec    *rec1   = (struct dt_insert_rec *)rec;
+       const struct lu_fid     *fid    = rec1->rec_fid;
        const char              *name = (const char *)key;
        struct osd_thread_info  *oti   = osd_oti_get(env);
        struct osd_inode_id     *id    = &oti->oti_id;
@@ -4325,14 +4371,14 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt,
        int                     rc;
        ENTRY;
 
-        LASSERT(osd_invariant(obj));
+       LASSERT(osd_invariant(obj));
        LASSERT(dt_object_exists(dt) && !dt_object_remote(dt));
-        LASSERT(th != NULL);
+       LASSERT(th != NULL);
 
        osd_trans_exec_op(env, th, OSD_OT_INSERT);
 
-        if (osd_object_auth(env, dt, capa, CAPA_OPC_INDEX_INSERT))
-                RETURN(-EACCES);
+       if (osd_object_auth(env, dt, capa, CAPA_OPC_INDEX_INSERT))
+               RETURN(-EACCES);
 
        LASSERTF(fid_is_sane(fid), "fid"DFID" is insane!", PFID(fid));
 
@@ -4363,8 +4409,7 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt,
                        child_inode = igrab(omm->omm_remote_parent->d_inode);
                } else {
                        child_inode = osd_create_local_agent_inode(env, osd,
-                                                                  obj, fid,
-                                                                  th);
+                                       obj, fid, rec1->rec_type & S_IFMT, th);
                        if (IS_ERR(child_inode))
                                RETURN(PTR_ERR(child_inode));
                }
@@ -4381,7 +4426,10 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt,
                child_inode = igrab(child->oo_inode);
        }
 
-       rc = osd_ea_add_rec(env, obj, child_inode, name, rec, th);
+       rc = osd_ea_add_rec(env, obj, child_inode, name, fid, th);
+
+       CDEBUG(D_INODE, "parent %lu insert %s:%lu rc = %d\n",
+              obj->oo_inode->i_ino, name, child_inode->i_ino, rc);
 
        iput(child_inode);
        if (child != NULL)
@@ -4839,6 +4887,7 @@ static int osd_ldiskfs_filldir(void *buf, const char *name, int namelen,
  *
  * \retval   0 on success
  * \retval -ve on error
+ * \retval +1 reach the end of entry
  */
 static int osd_ldiskfs_it_fill(const struct lu_env *env,
                                const struct dt_it *di)
@@ -4885,6 +4934,8 @@ static int osd_ldiskfs_it_fill(const struct lu_env *env,
                /*If it does not get any dirent, it means it has been reached
                 *to the end of the dir */
                it->oie_file.f_pos = ldiskfs_get_htree_eof(&it->oie_file);
+               if (rc == 0)
+                       rc = 1;
        } else {
                it->oie_dirent = it->oie_buf;
                it->oie_it_dirent = 1;
@@ -4970,22 +5021,12 @@ osd_dirent_update(handle_t *jh, struct super_block *sb,
        LASSERT(de->rec_len >= de->name_len + sizeof(struct osd_fid_pack));
 
        rc = ldiskfs_journal_get_write_access(jh, bh);
-       if (rc != 0) {
-               CERROR("%.16s: fail to write access for update dirent: "
-                      "name = %.*s, rc = %d\n",
-                      LDISKFS_SB(sb)->s_es->s_volume_name,
-                      ent->oied_namelen, ent->oied_name, rc);
+       if (rc != 0)
                RETURN(rc);
-       }
 
        rec = (struct osd_fid_pack *)(de->name + de->name_len + 1);
        fid_cpu_to_be((struct lu_fid *)rec->fp_area, fid);
        rc = ldiskfs_journal_dirty_metadata(jh, bh);
-       if (rc != 0)
-               CERROR("%.16s: fail to dirty metadata for update dirent: "
-                      "name = %.*s, rc = %d\n",
-                      LDISKFS_SB(sb)->s_es->s_volume_name,
-                      ent->oied_namelen, ent->oied_name, rc);
 
        RETURN(rc);
 }
@@ -5034,13 +5075,8 @@ osd_dirent_reinsert(const struct lu_env *env, handle_t *jh,
        if (osd_dirent_has_space(de->rec_len, ent->oied_namelen,
                                 dir->i_sb->s_blocksize)) {
                rc = ldiskfs_journal_get_write_access(jh, bh);
-               if (rc != 0) {
-                       CERROR("%.16s: fail to write access for reinsert "
-                              "dirent: name = %.*s, rc = %d\n",
-                              LDISKFS_SB(inode->i_sb)->s_es->s_volume_name,
-                              ent->oied_namelen, ent->oied_name, rc);
+               if (rc != 0)
                        RETURN(rc);
-               }
 
                de->name[de->name_len] = 0;
                rec = (struct osd_fid_pack *)(de->name + de->name_len + 1);
@@ -5049,38 +5085,29 @@ osd_dirent_reinsert(const struct lu_env *env, handle_t *jh,
                de->file_type |= LDISKFS_DIRENT_LUFID;
 
                rc = ldiskfs_journal_dirty_metadata(jh, bh);
-               if (rc != 0)
-                       CERROR("%.16s: fail to dirty metadata for reinsert "
-                              "dirent: name = %.*s, rc = %d\n",
-                              LDISKFS_SB(inode->i_sb)->s_es->s_volume_name,
-                              ent->oied_namelen, ent->oied_name, rc);
 
                RETURN(rc);
        }
 
        rc = ldiskfs_delete_entry(jh, dir, de, bh);
-       if (rc != 0) {
-               CERROR("%.16s: fail to delete entry for reinsert dirent: "
-                      "name = %.*s, rc = %d\n",
-                      LDISKFS_SB(inode->i_sb)->s_es->s_volume_name,
-                      ent->oied_namelen, ent->oied_name, rc);
+       if (rc != 0)
                RETURN(rc);
-       }
 
        dentry = osd_child_dentry_by_inode(env, dir, ent->oied_name,
                                           ent->oied_namelen);
        ldp = (struct ldiskfs_dentry_param *)osd_oti_get(env)->oti_ldp;
-       osd_get_ldiskfs_dirent_param(ldp, (const struct dt_rec *)fid);
+       osd_get_ldiskfs_dirent_param(ldp, fid);
        dentry->d_fsdata = (void *)ldp;
        ll_vfs_dq_init(dir);
        rc = osd_ldiskfs_add_entry(jh, dentry, inode, hlock);
        /* It is too bad, we cannot reinsert the name entry back.
         * That means we lose it! */
        if (rc != 0)
-               CERROR("%.16s: fail to insert entry for reinsert dirent: "
-                      "name = %.*s, rc = %d\n",
+               CDEBUG(D_LFSCK, "%.16s: fail to reinsert the dirent, "
+                      "dir = %lu/%u, name = %.*s, "DFID": rc = %d\n",
                       LDISKFS_SB(inode->i_sb)->s_es->s_volume_name,
-                      ent->oied_namelen, ent->oied_name, rc);
+                      dir->i_ino, dir->i_generation,
+                      ent->oied_namelen, ent->oied_name, PFID(fid), rc);
 
        RETURN(rc);
 }
@@ -5141,10 +5168,11 @@ again:
                jh = osd_journal_start_sb(sb, LDISKFS_HT_MISC, credits);
                if (IS_ERR(jh)) {
                        rc = PTR_ERR(jh);
-                       CERROR("%.16s: fail to start trans for dirent "
-                              "check_repair: credits %d, name %.*s, rc %d\n",
-                              devname, credits, ent->oied_namelen,
-                              ent->oied_name, rc);
+                       CDEBUG(D_LFSCK, "%.16s: fail to start trans for dirent "
+                              "check_repair, dir = %lu/%u, credits = %d, "
+                              "name = %.*s: rc = %d\n",
+                              devname, dir->i_ino, dir->i_generation, credits,
+                              ent->oied_namelen, ent->oied_name, rc);
                        RETURN(rc);
                }
 
@@ -5188,6 +5216,12 @@ again:
                if (rc == -ENOENT || rc == -ESTALE) {
                        *attr |= LUDA_IGNORE;
                        rc = 0;
+               } else {
+                       CDEBUG(D_LFSCK, "%.16s: fail to iget for dirent "
+                              "check_repair, dir = %lu/%u, name = %.*s: "
+                              "rc = %d\n",
+                              devname, dir->i_ino, dir->i_generation,
+                              ent->oied_namelen, ent->oied_name, rc);
                }
 
                GOTO(out_journal, rc);
@@ -5229,6 +5263,13 @@ again:
                        rc = osd_dirent_update(jh, sb, ent, fid, bh, de);
                        if (rc == 0)
                                *attr |= LUDA_REPAIR;
+                       else
+                               CDEBUG(D_LFSCK, "%.16s: fail to update FID "
+                                      "in the dirent, dir = %lu/%u, "
+                                      "name = %.*s, "DFID": rc = %d\n",
+                                      devname, dir->i_ino, dir->i_generation,
+                                      ent->oied_namelen, ent->oied_name,
+                                      PFID(fid), rc);
                } else {
                        /* Do not repair under dryrun mode. */
                        if (*attr & LUDA_VERIFY_DRYRUN) {
@@ -5255,6 +5296,13 @@ again:
                                                 fid, bh, de, hlock);
                        if (rc == 0)
                                *attr |= LUDA_REPAIR;
+                       else
+                               CDEBUG(D_LFSCK, "%.16s: fail to append FID "
+                                      "after the dirent, dir = %lu/%u, "
+                                      "name = %.*s, "DFID": rc = %d\n",
+                                      devname, dir->i_ino, dir->i_generation,
+                                      ent->oied_namelen, ent->oied_name,
+                                      PFID(fid), rc);
                }
        } else if (rc == -ENODATA) {
                /* Do not repair under dryrun mode. */
@@ -5287,6 +5335,13 @@ again:
                        rc = osd_ea_fid_set(info, inode, fid, 0, 0);
                        if (rc == 0)
                                *attr |= LUDA_REPAIR;
+                       else
+                               CDEBUG(D_LFSCK, "%.16s: fail to set LMA for "
+                                      "update dirent, dir = %lu/%u, "
+                                      "name = %.*s, "DFID": rc = %d\n",
+                                      devname, dir->i_ino, dir->i_generation,
+                                      ent->oied_namelen, ent->oied_name,
+                                      PFID(fid), rc);
                } else {
                        lu_igif_build(fid, inode->i_ino, inode->i_generation);
                        /* It is probably IGIF object. Only aappend the
@@ -5295,6 +5350,13 @@ again:
                                                 fid, bh, de, hlock);
                        if (rc == 0)
                                *attr |= LUDA_UPGRADE;
+                       else
+                               CDEBUG(D_LFSCK, "%.16s: fail to append IGIF "
+                                      "after the dirent, dir = %lu/%u, "
+                                      "name = %.*s, "DFID": rc = %d\n",
+                                      devname, dir->i_ino, dir->i_generation,
+                                      ent->oied_namelen, ent->oied_name,
+                                      PFID(fid), rc);
                }
        }
 
@@ -5398,6 +5460,27 @@ static inline int osd_it_ea_rec(const struct lu_env *env,
 }
 
 /**
+ * Returns the record size size at current position.
+ *
+ * This function will return record(lu_dirent) size in bytes.
+ *
+ * \param[in] env      execution environment
+ * \param[in] di       iterator's in memory structure
+ * \param[in] attr     attribute of the entry, only requires LUDA_TYPE to
+ *                      calculate the lu_dirent size.
+ *
+ * \retval     record size(in bytes & in memory) of the current lu_dirent
+ *              entry.
+ */
+static int osd_it_ea_rec_size(const struct lu_env *env, const struct dt_it *di,
+                             __u32 attr)
+{
+       struct osd_it_ea *it = (struct osd_it_ea *)di;
+
+       return lu_dirent_calc_size(it->oie_dirent->oied_namelen, attr);
+}
+
+/**
  * Returns a cookie for current position of the iterator head, so that
  * user can use this cookie to load/start the iterator next time.
  *
@@ -5432,6 +5515,9 @@ static int osd_it_ea_load(const struct lu_env *env,
         it->oie_file.f_pos = hash;
 
         rc =  osd_ldiskfs_it_fill(env, di);
+       if (rc > 0)
+               rc = -ENODATA;
+
         if (rc == 0)
                 rc = +1;
 
@@ -5472,23 +5558,24 @@ static int osd_index_ea_lookup(const struct lu_env *env, struct dt_object *dt,
  * mode (i.e. to run 2.0 mds on 1.8 disk) (b11826)
  */
 static const struct dt_index_operations osd_index_ea_ops = {
-        .dio_lookup         = osd_index_ea_lookup,
-        .dio_declare_insert = osd_index_declare_ea_insert,
-        .dio_insert         = osd_index_ea_insert,
-        .dio_declare_delete = osd_index_declare_ea_delete,
-        .dio_delete         = osd_index_ea_delete,
-        .dio_it     = {
-                .init     = osd_it_ea_init,
-                .fini     = osd_it_ea_fini,
-                .get      = osd_it_ea_get,
-                .put      = osd_it_ea_put,
-                .next     = osd_it_ea_next,
-                .key      = osd_it_ea_key,
-                .key_size = osd_it_ea_key_size,
-                .rec      = osd_it_ea_rec,
-                .store    = osd_it_ea_store,
-                .load     = osd_it_ea_load
-        }
+       .dio_lookup         = osd_index_ea_lookup,
+       .dio_declare_insert = osd_index_declare_ea_insert,
+       .dio_insert         = osd_index_ea_insert,
+       .dio_declare_delete = osd_index_declare_ea_delete,
+       .dio_delete         = osd_index_ea_delete,
+       .dio_it     = {
+               .init     = osd_it_ea_init,
+               .fini     = osd_it_ea_fini,
+               .get      = osd_it_ea_get,
+               .put      = osd_it_ea_put,
+               .next     = osd_it_ea_next,
+               .key      = osd_it_ea_key,
+               .key_size = osd_it_ea_key_size,
+               .rec      = osd_it_ea_rec,
+               .rec_size = osd_it_ea_rec_size,
+               .store    = osd_it_ea_store,
+               .load     = osd_it_ea_load
+       }
 };
 
 static void *osd_key_init(const struct lu_context *ctx,
@@ -5564,6 +5651,43 @@ static int osd_device_init(const struct lu_env *env, struct lu_device *d,
        return osd_procfs_init(osd, name);
 }
 
+static int osd_fid_init(const struct lu_env *env, struct osd_device *osd)
+{
+       struct seq_server_site  *ss = osd_seq_site(osd);
+       int                     rc;
+       ENTRY;
+
+       if (osd->od_is_ost || osd->od_cl_seq != NULL)
+               RETURN(0);
+
+       if (unlikely(ss == NULL))
+               RETURN(-ENODEV);
+
+       OBD_ALLOC_PTR(osd->od_cl_seq);
+       if (osd->od_cl_seq == NULL)
+               RETURN(-ENOMEM);
+
+       rc = seq_client_init(osd->od_cl_seq, NULL, LUSTRE_SEQ_METADATA,
+                            osd->od_svname, ss->ss_server_seq);
+
+       if (rc != 0) {
+               OBD_FREE_PTR(osd->od_cl_seq);
+               osd->od_cl_seq = NULL;
+       }
+
+       RETURN(rc);
+}
+
+static void osd_fid_fini(const struct lu_env *env, struct osd_device *osd)
+{
+       if (osd->od_cl_seq == NULL)
+               return;
+
+       seq_client_fini(osd->od_cl_seq);
+       OBD_FREE_PTR(osd->od_cl_seq);
+       osd->od_cl_seq = NULL;
+}
+
 static int osd_shutdown(const struct lu_env *env, struct osd_device *o)
 {
        ENTRY;
@@ -5574,6 +5698,8 @@ static int osd_shutdown(const struct lu_env *env, struct osd_device *o)
                o->od_quota_slave = NULL;
        }
 
+       osd_fid_fini(env, o);
+
        RETURN(0);
 }
 
@@ -5673,6 +5799,11 @@ static int osd_mount(const struct lu_env *env,
        if (LDISKFS_HAS_INCOMPAT_FEATURE(o->od_mnt->mnt_sb,
                                         LDISKFS_FEATURE_INCOMPAT_DIRDATA))
                LDISKFS_SB(osd_sb(o))->s_mount_opt |= LDISKFS_MOUNT_DIRDATA;
+       else if (!o->od_is_ost)
+               CWARN("%s: device %s was upgraded from Lustre-1.x without "
+                     "enabling the dirdata feature. If you do not want to "
+                     "downgrade to Lustre-1.x again, you can enable it via "
+                     "'tune2fs -O dirdata device'\n", name, dev);
 #endif
        inode = osd_sb(o)->s_root->d_inode;
        lu_local_obj_fid(fid, OSD_FS_ROOT_OID);
@@ -5743,20 +5874,20 @@ static int osd_device_init0(const struct lu_env *env,
        o->od_writethrough_cache = 1;
        o->od_readcache_max_filesize = OSD_MAX_CACHE_SIZE;
 
-       rc = osd_mount(env, o, cfg);
-       if (rc)
-               GOTO(out_capa, rc);
-
        cplen = strlcpy(o->od_svname, lustre_cfg_string(cfg, 4),
                        sizeof(o->od_svname));
        if (cplen >= sizeof(o->od_svname)) {
                rc = -E2BIG;
-               GOTO(out_mnt, rc);
+               GOTO(out_capa, rc);
        }
 
        if (server_name_is_ost(o->od_svname))
                o->od_is_ost = 1;
 
+       rc = osd_mount(env, o, cfg);
+       if (rc != 0)
+               GOTO(out_capa, rc);
+
        rc = osd_obj_map_init(env, o);
        if (rc != 0)
                GOTO(out_mnt, rc);
@@ -5773,7 +5904,7 @@ static int osd_device_init0(const struct lu_env *env,
        /* self-repair LMA by default */
        o->od_lma_self_repair = 1;
 
-       CFS_INIT_LIST_HEAD(&o->od_ios_list);
+       INIT_LIST_HEAD(&o->od_ios_list);
        /* setup scrub, including OI files initialization */
        rc = osd_scrub_setup(env, o);
        if (rc < 0)
@@ -5879,12 +6010,13 @@ static int osd_process_config(const struct lu_env *env,
                break;
        case LCFG_PARAM:
                LASSERT(&o->od_dt_dev);
-               rc = class_process_proc_param(PARAM_OSD, lprocfs_osd_obd_vars,
-                                             cfg, &o->od_dt_dev);
+               rc = class_process_proc_seq_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);
+                       rc = class_process_proc_seq_param(PARAM_OST,
+                                                         lprocfs_osd_obd_vars,
+                                                         cfg, &o->od_dt_dev);
                break;
        default:
                rc = -ENOSYS;
@@ -5968,13 +6100,26 @@ static int osd_prepare(const struct lu_env *env, struct lu_device *pdev,
        int                result = 0;
        ENTRY;
 
-       if (osd->od_quota_slave != NULL)
+       if (osd->od_quota_slave != NULL) {
                /* set up quota slave objects */
                result = qsd_prepare(env, osd->od_quota_slave);
+               if (result != 0)
+                       RETURN(result);
+       }
+
+       result = osd_fid_init(env, osd);
 
        RETURN(result);
 }
 
+int osd_fid_alloc(const struct lu_env *env, struct obd_export *exp,
+                 struct lu_fid *fid, struct md_op_data *op_data)
+{
+       struct osd_device *osd = osd_dev(exp->exp_obd->obd_lu_dev);
+
+       return seq_client_alloc_fid(env, osd->od_cl_seq, fid);
+}
+
 static const struct lu_object_operations osd_lu_obj_ops = {
         .loo_object_init      = osd_object_init,
         .loo_object_delete    = osd_object_delete,
@@ -6018,7 +6163,8 @@ struct lu_device_type osd_device_type = {
 static struct obd_ops osd_obd_device_ops = {
        .o_owner = THIS_MODULE,
        .o_connect      = osd_obd_connect,
-       .o_disconnect   = osd_obd_disconnect
+       .o_disconnect   = osd_obd_disconnect,
+       .o_fid_alloc    = osd_fid_alloc,
 };
 
 static int __init osd_mod_init(void)
@@ -6031,11 +6177,12 @@ static int __init osd_mod_init(void)
        if (rc)
                return rc;
 
-       rc = class_register_type(&osd_obd_device_ops, NULL, NULL,
+       rc = class_register_type(&osd_obd_device_ops, NULL, true,
+                                lprocfs_osd_module_vars,
 #ifndef HAVE_ONLY_PROCFS_SEQ
-                               lprocfs_osd_module_vars,
+                                NULL,
 #endif
-                               LUSTRE_OSD_LDISKFS_NAME, &osd_device_type);
+                                LUSTRE_OSD_LDISKFS_NAME, &osd_device_type);
        if (rc)
                lu_kmem_fini(ldiskfs_caches);
        return rc;