Whamcloud - gitweb
LU-2211 quota: cap how long a thread can wait for quota
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_handler.c
index e5797c3..819d963 100644 (file)
@@ -72,8 +72,7 @@
 
 /* llo_* api support */
 #include <md_object.h>
-/* dt_acct_features */
-#include <lquota.h>
+#include <lustre_quota.h>
 
 #ifdef HAVE_LDISKFS_PDO
 int ldiskfs_pdo = 1;
@@ -151,11 +150,7 @@ static struct lu_object *osd_object_alloc(const struct lu_env *env,
 
                 l = &mo->oo_dt.do_lu;
                 dt_object_init(&mo->oo_dt, NULL, d);
-                if (osd_dev(d)->od_iop_mode)
-                        mo->oo_dt.do_ops = &osd_obj_ea_ops;
-                else
-                        mo->oo_dt.do_ops = &osd_obj_ops;
-
+               mo->oo_dt.do_ops = &osd_obj_ea_ops;
                 l->lo_ops = &osd_lu_obj_ops;
                 cfs_init_rwsem(&mo->oo_sem);
                 cfs_init_rwsem(&mo->oo_ext_idx_sem);
@@ -288,7 +283,7 @@ osd_iget_verify(struct osd_thread_info *info, struct osd_device *dev,
                CDEBUG(D_LFSCK, "inconsistent obj: "DFID", %lu, "DFID"\n",
                       PFID(&lma->lma_self_fid), inode->i_ino, PFID(fid));
                iput(inode);
-               return ERR_PTR(EREMCHG);
+               return ERR_PTR(-EREMCHG);
        }
 
        return inode;
@@ -320,15 +315,18 @@ static int osd_fid_lookup(const struct lu_env *env, struct osd_object *obj,
        info = osd_oti_get(env);
        LASSERT(info);
        oic = &info->oti_cache;
-       id  = &oic->oic_lid;
 
        if (OBD_FAIL_CHECK(OBD_FAIL_OST_ENOENT))
                RETURN(-ENOENT);
 
        /* Search order: 1. per-thread cache. */
        if (lu_fid_eq(fid, &oic->oic_fid)) {
+               id = &oic->oic_lid;
                goto iget;
-       } else if (!cfs_list_empty(&scrub->os_inconsistent_items)) {
+       }
+
+       id = &info->oti_id;
+       if (!cfs_list_empty(&scrub->os_inconsistent_items)) {
                /* Search order: 2. OI scrub pending list. */
                result = osd_oii_lookup(dev, fid, id);
                if (result == 0)
@@ -395,10 +393,9 @@ trigger:
 
         obj->oo_inode = inode;
         LASSERT(obj->oo_inode->i_sb == osd_sb(dev));
-        if (dev->od_iop_mode) {
-                obj->oo_compat_dot_created = 1;
-                obj->oo_compat_dotdot_created = 1;
-        }
+
+       obj->oo_compat_dot_created = 1;
+       obj->oo_compat_dotdot_created = 1;
 
         if (!S_ISDIR(inode->i_mode) || !ldiskfs_pdo) /* done */
                GOTO(out, result = 0);
@@ -589,12 +586,12 @@ static void __osd_th_check_slow(void *oth, struct osd_device *dev,
 /*
  * Concurrency: doesn't access mutable data.
  */
-static int osd_param_is_sane(const struct osd_device *dev,
-                             const struct thandle *th)
+static int osd_param_is_not_sane(const struct osd_device *dev,
+                                const struct thandle *th)
 {
-        struct osd_thandle *oh;
-        oh = container_of0(th, struct osd_thandle, ot_super);
-        return oh->ot_credits <= osd_journal(dev)->j_max_transaction_buffers;
+       struct osd_thandle *oh = container_of(th, typeof(*oh), ot_super);
+
+       return oh->ot_credits > osd_journal(dev)->j_max_transaction_buffers;
 }
 
 /*
@@ -690,30 +687,48 @@ int osd_trans_start(const struct lu_env *env, struct dt_device *d,
         if (rc != 0)
                 GOTO(out, rc);
 
-        if (!osd_param_is_sane(dev, th)) {
+       if (unlikely(osd_param_is_not_sane(dev, th))) {
+               static unsigned long last_printed;
+               static int last_credits;
+
                CWARN("%.16s: too many transaction credits (%d > %d)\n",
                      LDISKFS_SB(osd_sb(dev))->s_es->s_volume_name,
                      oh->ot_credits,
                      osd_journal(dev)->j_max_transaction_buffers);
-                /* XXX Limit the credits to 'max_transaction_buffers', and
-                 *     let the underlying filesystem to catch the error if
-                 *     we really need so many credits.
-                 *
-                 *     This should be removed when we can calculate the
-                 *     credits precisely. */
-                oh->ot_credits = osd_journal(dev)->j_max_transaction_buffers;
 #ifdef OSD_TRACK_DECLARES
-                CERROR("  attr_set: %d, punch: %d, xattr_set: %d,\n",
-                       oh->ot_declare_attr_set, oh->ot_declare_punch,
-                       oh->ot_declare_xattr_set);
-                CERROR("  create: %d, ref_add: %d, ref_del: %d, write: %d\n",
-                       oh->ot_declare_create, oh->ot_declare_ref_add,
-                       oh->ot_declare_ref_del, oh->ot_declare_write);
-                CERROR("  insert: %d, delete: %d, destroy: %d\n",
-                       oh->ot_declare_insert, oh->ot_declare_delete,
-                       oh->ot_declare_destroy);
+               CWARN("  create: %u/%u, delete: %u/%u, destroy: %u/%u\n",
+                     oh->ot_declare_create, oh->ot_declare_create_cred,
+                     oh->ot_declare_delete, oh->ot_declare_delete_cred,
+                     oh->ot_declare_destroy, oh->ot_declare_destroy_cred);
+               CWARN("  attr_set: %u/%u, xattr_set: %u/%u\n",
+                     oh->ot_declare_attr_set, oh->ot_declare_attr_set_cred,
+                     oh->ot_declare_xattr_set, oh->ot_declare_xattr_set_cred);
+               CWARN("  write: %u/%u, punch: %u/%u, quota %u/%u\n",
+                     oh->ot_declare_write, oh->ot_declare_write_cred,
+                     oh->ot_declare_punch, oh->ot_declare_punch_cred,
+                     oh->ot_declare_quota, oh->ot_declare_quota_cred);
+               CWARN("  insert: %u/%u, delete: %u/%u\n",
+                     oh->ot_declare_insert, oh->ot_declare_insert_cred,
+                     oh->ot_declare_delete, oh->ot_declare_destroy_cred);
+               CWARN("  ref_add: %u/%u, ref_del: %u/%u\n",
+                     oh->ot_declare_ref_add, oh->ot_declare_ref_add_cred,
+                     oh->ot_declare_ref_del, oh->ot_declare_ref_del_cred);
+
+               if (last_credits != oh->ot_credits &&
+                   time_after(jiffies, last_printed + 60 * HZ)) {
+                       libcfs_debug_dumpstack(NULL);
+                       last_credits = oh->ot_credits;
+                       last_printed = jiffies;
+               }
 #endif
-        }
+               /* XXX Limit the credits to 'max_transaction_buffers', and
+                *     let the underlying filesystem to catch the error if
+                *     we really need so many credits.
+                *
+                *     This should be removed when we can calculate the
+                *     credits precisely. */
+               oh->ot_credits = osd_journal(dev)->j_max_transaction_buffers;
+       }
 
         /*
          * XXX temporary stuff. Some abstraction layer should
@@ -837,8 +852,24 @@ 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;
+
                 iput(inode);
                 obj->oo_inode = NULL;
+
+               if (qsd != NULL) {
+                       struct osd_thread_info  *info = osd_oti_get(env);
+                       struct lquota_id_info   *qi = &info->oti_qi;
+
+                       /* Release granted quota to master if necessary */
+                       qi->lqi_id.qid_uid = uid;
+                       qsd_op_adjust(env, qsd, &qi->lqi_id, USRQUOTA);
+
+                       qi->lqi_id.qid_uid = gid;
+                       qsd_op_adjust(env, qsd, &qi->lqi_id, GRPQUOTA);
+               }
         }
 }
 
@@ -1361,8 +1392,8 @@ static int osd_declare_attr_set(const struct lu_env *env,
        oh = container_of0(handle, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle == NULL);
 
-       OSD_DECLARE_OP(oh, attr_set);
-       oh->ot_credits += osd_dto_credits_noquota[DTO_ATTR_SET_BASE];
+       OSD_DECLARE_OP(oh, attr_set,
+                      osd_dto_credits_noquota[DTO_ATTR_SET_BASE]);
 
        if (attr == NULL || obj->oo_inode == NULL)
                RETURN(rc);
@@ -1570,6 +1601,7 @@ static int osd_attr_set(const struct lu_env *env,
         OSD_EXEC_OP(handle, attr_set);
 
         inode = obj->oo_inode;
+       ll_vfs_dq_init(inode);
 
        rc = osd_quota_transfer(inode, attr);
        if (rc)
@@ -1653,7 +1685,6 @@ static int osd_mkdir(struct osd_thread_info *info, struct osd_object *obj,
 {
         int result;
         struct osd_thandle *oth;
-        struct osd_device *osd = osd_obj2dev(obj);
         __u32 mode = (attr->la_mode & (S_IFMT | S_IRWXUGO | S_ISVTX));
 
         LASSERT(S_ISDIR(attr->la_mode));
@@ -1661,16 +1692,7 @@ static int osd_mkdir(struct osd_thread_info *info, struct osd_object *obj,
         oth = container_of(th, struct osd_thandle, ot_super);
         LASSERT(oth->ot_handle->h_transaction != NULL);
         result = osd_mkfile(info, obj, mode, hint, th);
-        if (result == 0 && osd->od_iop_mode == 0) {
-                LASSERT(obj->oo_inode != NULL);
-                /*
-                 * XXX uh-oh... call low-level iam function directly.
-                 */
 
-                result = iam_lvar_create(obj->oo_inode, OSD_NAME_LEN, 4,
-                                         sizeof (struct osd_fid_pack),
-                                         oth->ot_handle);
-        }
         return result;
 }
 
@@ -1897,42 +1919,40 @@ static int __osd_oi_insert(const struct lu_env *env, struct osd_object *obj,
 }
 
 static int osd_declare_object_create(const struct lu_env *env,
-                                     struct dt_object *dt,
-                                     struct lu_attr *attr,
-                                     struct dt_allocation_hint *hint,
-                                     struct dt_object_format *dof,
-                                     struct thandle *handle)
+                                    struct dt_object *dt,
+                                    struct lu_attr *attr,
+                                    struct dt_allocation_hint *hint,
+                                    struct dt_object_format *dof,
+                                    struct thandle *handle)
 {
        struct osd_thandle      *oh;
        int                      rc;
        ENTRY;
 
-        LASSERT(handle != NULL);
+       LASSERT(handle != NULL);
 
-        oh = container_of0(handle, struct osd_thandle, ot_super);
-        LASSERT(oh->ot_handle == NULL);
+       oh = container_of0(handle, struct osd_thandle, ot_super);
+       LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, create);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_OBJECT_CREATE];
-        /* XXX: So far, only normal fid needs be inserted into the oi,
-         *      things could be changed later. Revise following code then. */
-        if (fid_is_norm(lu_object_fid(&dt->do_lu))) {
-                OSD_DECLARE_OP(oh, insert);
-                oh->ot_credits += osd_dto_credits_noquota[DTO_INDEX_INSERT];
+       OSD_DECLARE_OP(oh, create, osd_dto_credits_noquota[DTO_OBJECT_CREATE]);
+       /* XXX: So far, only normal fid needs be inserted into the oi,
+        *      things could be changed later. Revise following code then. */
+       if (fid_is_norm(lu_object_fid(&dt->do_lu))) {
                /* Reuse idle OI block may cause additional one OI block
                 * to be changed. */
-               oh->ot_credits += 1;
-        }
-        /* If this is directory, then we expect . and .. to be inserted as
-         * well. The one directory block always needs to be created for the
-         * directory, so we could use DTO_WRITE_BASE here (GDT, block bitmap,
-         * block), there is no danger of needing a tree for the first block.
-         */
-        if (attr && S_ISDIR(attr->la_mode)) {
-                OSD_DECLARE_OP(oh, insert);
-                OSD_DECLARE_OP(oh, insert);
-                oh->ot_credits += osd_dto_credits_noquota[DTO_WRITE_BASE];
-        }
+               OSD_DECLARE_OP(oh, insert,
+                              osd_dto_credits_noquota[DTO_INDEX_INSERT] + 1);
+       }
+       /* If this is directory, then we expect . and .. to be inserted as
+        * well. The one directory block always needs to be created for the
+        * directory, so we could use DTO_WRITE_BASE here (GDT, block bitmap,
+        * block), there is no danger of needing a tree for the first block.
+        */
+       if (attr && S_ISDIR(attr->la_mode)) {
+               OSD_DECLARE_OP(oh, insert,
+                              osd_dto_credits_noquota[DTO_WRITE_BASE]);
+               OSD_DECLARE_OP(oh, insert, 0);
+       }
 
        if (!attr)
                RETURN(0);
@@ -1982,40 +2002,36 @@ static int osd_object_create(const struct lu_env *env, struct dt_object *dt,
  * Concurrency: must be locked
  */
 static int osd_declare_object_destroy(const struct lu_env *env,
-                                      struct dt_object *dt,
-                                      struct thandle *th)
+                                     struct dt_object *dt,
+                                     struct thandle *th)
 {
-        struct osd_object  *obj = osd_dt_obj(dt);
-        struct inode       *inode = obj->oo_inode;
-        struct osd_thandle *oh;
-       int                 rc;
-        ENTRY;
+       struct osd_object  *obj = osd_dt_obj(dt);
+       struct inode       *inode = obj->oo_inode;
+       struct osd_thandle *oh;
+       int                 rc;
+       ENTRY;
 
-        oh = container_of0(th, struct osd_thandle, ot_super);
-        LASSERT(oh->ot_handle == NULL);
-        LASSERT(inode);
+       oh = container_of0(th, struct osd_thandle, ot_super);
+       LASSERT(oh->ot_handle == NULL);
+       LASSERT(inode);
 
-        OSD_DECLARE_OP(oh, destroy);
-        OSD_DECLARE_OP(oh, delete);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_OBJECT_DELETE];
-        /* XXX: So far, only normal fid needs to be inserted into the OI,
-         *      so only normal fid needs to be removed from the OI also. */
-        if (fid_is_norm(lu_object_fid(&dt->do_lu))) {
-               oh->ot_credits += osd_dto_credits_noquota[DTO_INDEX_DELETE];
-               /* Recycle idle OI leaf may cause additional three OI blocks
-                * to be changed. */
-               oh->ot_credits += 3;
-        }
+       OSD_DECLARE_OP(oh, delete, osd_dto_credits_noquota[DTO_OBJECT_DELETE]);
+       /* XXX: So far, only normal fid needs to be inserted into the OI,
+        *      so only normal fid needs to be removed from the OI also.
+        * Recycle idle OI leaf may cause additional three OI blocks
+        * to be changed. */
+       OSD_DECLARE_OP(oh, destroy, fid_is_norm(lu_object_fid(&dt->do_lu)) ?
+                       osd_dto_credits_noquota[DTO_INDEX_DELETE] + 3 : 0);
 
        /* one less inode */
-        rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, -1, oh,
+       rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, -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);
-        RETURN(rc);
+       rc = osd_declare_inode_qid(env, inode->i_uid, inode->i_gid, 0, oh,
+                                  true, true, NULL, false);
+       RETURN(rc);
 }
 
 static int osd_object_destroy(const struct lu_env *env,
@@ -2088,6 +2104,7 @@ static int __osd_xattr_set(const struct lu_env *env, struct dt_object *dt,
         if (fl & LU_XATTR_CREATE)
                 fs_flags |= XATTR_CREATE;
 
+       ll_vfs_dq_init(inode);
         dentry->d_inode = inode;
         rc = inode->i_op->setxattr(dentry, name, buf->lb_buf,
                                    buf->lb_len, fs_flags);
@@ -2219,10 +2236,9 @@ static int osd_declare_object_ref_add(const struct lu_env *env,
         oh = container_of0(handle, struct osd_thandle, ot_super);
         LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, ref_add);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_ATTR_SET_BASE];
+       OSD_DECLARE_OP(oh, ref_add, osd_dto_credits_noquota[DTO_ATTR_SET_BASE]);
 
-        return 0;
+       return 0;
 }
 
 /*
@@ -2278,10 +2294,9 @@ static int osd_declare_object_ref_del(const struct lu_env *env,
         oh = container_of0(handle, struct osd_thandle, ot_super);
         LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, ref_del);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_ATTR_SET_BASE];
+       OSD_DECLARE_OP(oh, ref_del, osd_dto_credits_noquota[DTO_ATTR_SET_BASE]);
 
-        return 0;
+       return 0;
 }
 
 /*
@@ -2373,11 +2388,9 @@ static int osd_declare_xattr_set(const struct lu_env *env,
        oh = container_of0(handle, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle == NULL);
 
-       OSD_DECLARE_OP(oh, xattr_set);
-       if (strcmp(name, XATTR_NAME_VERSION) == 0)
-               oh->ot_credits += osd_dto_credits_noquota[DTO_ATTR_SET_BASE];
-       else
-               oh->ot_credits += osd_dto_credits_noquota[DTO_XATTR_SET];
+       OSD_DECLARE_OP(oh, xattr_set, strcmp(name, XATTR_NAME_VERSION) == 0 ?
+                      osd_dto_credits_noquota[DTO_ATTR_SET_BASE] :
+                      osd_dto_credits_noquota[DTO_XATTR_SET]);
 
        return 0;
 }
@@ -2459,10 +2472,9 @@ static int osd_declare_xattr_del(const struct lu_env *env,
         oh = container_of0(handle, struct osd_thandle, ot_super);
         LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, xattr_set);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_XATTR_SET];
+       OSD_DECLARE_OP(oh, xattr_set, osd_dto_credits_noquota[DTO_XATTR_SET]);
 
-        return 0;
+       return 0;
 }
 
 /*
@@ -2488,6 +2500,7 @@ static int osd_xattr_del(const struct lu_env *env, struct dt_object *dt,
 
         OSD_EXEC_OP(handle, xattr_set);
 
+       ll_vfs_dq_init(inode);
         dentry->d_inode = inode;
         rc = inode->i_op->removexattr(dentry, name);
         return rc;
@@ -2675,7 +2688,6 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt,
        int                      result;
        int                      skip_iam = 0;
        struct osd_object       *obj = osd_dt_obj(dt);
-       struct osd_device       *osd = osd_obj2dev(obj);
 
         LINVRNT(osd_invariant(obj));
         LASSERT(dt_object_exists(dt));
@@ -2683,7 +2695,7 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt,
         if (osd_object_is_root(obj)) {
                 dt->do_index_ops = &osd_index_ea_ops;
                 result = 0;
-        } else if (feat == &dt_directory_features && osd->od_iop_mode) {
+       } else if (feat == &dt_directory_features) {
                 dt->do_index_ops = &osd_index_ea_ops;
                 if (S_ISDIR(obj->oo_inode->i_mode))
                         result = 0;
@@ -2832,10 +2844,9 @@ static int osd_index_declare_iam_delete(const struct lu_env *env,
         oh = container_of0(handle, struct osd_thandle, ot_super);
         LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, delete);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_INDEX_DELETE];
+       OSD_DECLARE_OP(oh, delete, osd_dto_credits_noquota[DTO_INDEX_DELETE]);
 
-        return 0;
+       return 0;
 }
 
 /**
@@ -2895,23 +2906,22 @@ static int osd_index_iam_delete(const struct lu_env *env, struct dt_object *dt,
 }
 
 static int osd_index_declare_ea_delete(const struct lu_env *env,
-                                       struct dt_object *dt,
-                                       const struct dt_key *key,
-                                       struct thandle *handle)
+                                      struct dt_object *dt,
+                                      const struct dt_key *key,
+                                      struct thandle *handle)
 {
-        struct osd_thandle *oh;
+       struct osd_thandle *oh;
        struct inode       *inode;
        int                 rc;
        ENTRY;
 
-        LASSERT(dt_object_exists(dt));
-        LASSERT(handle != NULL);
+       LASSERT(dt_object_exists(dt));
+       LASSERT(handle != NULL);
 
-        oh = container_of0(handle, struct osd_thandle, ot_super);
-        LASSERT(oh->ot_handle == NULL);
+       oh = container_of0(handle, struct osd_thandle, ot_super);
+       LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, delete);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_INDEX_DELETE];
+       OSD_DECLARE_OP(oh, delete, osd_dto_credits_noquota[DTO_INDEX_DELETE]);
 
        inode = osd_dt_obj(dt)->oo_inode;
        LASSERT(inode);
@@ -2973,6 +2983,7 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt,
         if (osd_object_auth(env, dt, capa, CAPA_OPC_INDEX_DELETE))
                 RETURN(-EACCES);
 
+       ll_vfs_dq_init(dir);
         dentry = osd_child_dentry_get(env, obj,
                                       (char *)key, strlen((char *)key));
 
@@ -3085,10 +3096,9 @@ static int osd_index_declare_iam_insert(const struct lu_env *env,
         oh = container_of0(handle, struct osd_thandle, ot_super);
         LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, insert);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_INDEX_INSERT];
+       OSD_DECLARE_OP(oh, insert, osd_dto_credits_noquota[DTO_INDEX_INSERT]);
 
-        return 0;
+       return 0;
 }
 
 /**
@@ -3192,6 +3202,8 @@ static int __osd_ea_add_rec(struct osd_thread_info *info,
         } else {
                 child->d_fsdata = NULL;
         }
+       LASSERT(pobj->oo_inode);
+       ll_vfs_dq_init(pobj->oo_inode);
         rc = osd_ldiskfs_add_entry(oth->ot_handle, child, cinode, hlock);
 
         RETURN(rc);
@@ -3307,7 +3319,7 @@ static int osd_ea_add_rec(const struct lu_env *env, struct osd_object *pobj,
         return rc;
 }
 
-static int
+static void
 osd_consistency_check(struct osd_thread_info *oti, struct osd_device *dev,
                      struct osd_idmap_cache *oic)
 {
@@ -3319,15 +3331,15 @@ osd_consistency_check(struct osd_thread_info *oti, struct osd_device *dev,
        ENTRY;
 
        if (!fid_is_norm(fid) && !fid_is_igif(fid))
-               RETURN(0);
+               RETURN_EXIT;
 
 again:
        rc = osd_oi_lookup(oti, dev, fid, id);
        if (rc != 0 && rc != -ENOENT)
-               RETURN(rc);
+               RETURN_EXIT;
 
        if (rc == 0 && osd_id_eq(id, &oic->oic_lid))
-               RETURN(0);
+               RETURN_EXIT;
 
        if (thread_is_running(&scrub->os_thread)) {
                rc = osd_oii_insert(dev, oic, rc == -ENOENT);
@@ -3338,7 +3350,7 @@ again:
                if (unlikely(rc == -EAGAIN))
                        goto again;
 
-               RETURN(rc);
+               RETURN_EXIT;
        }
 
        if (!dev->od_noscrub && ++once == 1) {
@@ -3353,7 +3365,7 @@ again:
                        goto again;
        }
 
-       RETURN(0);
+       EXIT;
 }
 
 /**
@@ -3499,24 +3511,23 @@ static inline void osd_object_put(const struct lu_env *env,
 }
 
 static int osd_index_declare_ea_insert(const struct lu_env *env,
-                                       struct dt_object *dt,
-                                       const struct dt_rec *rec,
-                                       const struct dt_key *key,
-                                       struct thandle *handle)
+                                      struct dt_object *dt,
+                                      const struct dt_rec *rec,
+                                      const struct dt_key *key,
+                                      struct thandle *handle)
 {
-        struct osd_thandle *oh;
+       struct osd_thandle *oh;
        struct inode       *inode;
        int                 rc;
        ENTRY;
 
-        LASSERT(dt_object_exists(dt));
-        LASSERT(handle != NULL);
+       LASSERT(dt_object_exists(dt));
+       LASSERT(handle != NULL);
 
-        oh = container_of0(handle, struct osd_thandle, ot_super);
-        LASSERT(oh->ot_handle == NULL);
+       oh = container_of0(handle, struct osd_thandle, ot_super);
+       LASSERT(oh->ot_handle == NULL);
 
-        OSD_DECLARE_OP(oh, insert);
-        oh->ot_credits += osd_dto_credits_noquota[DTO_INDEX_INSERT];
+       OSD_DECLARE_OP(oh, insert, osd_dto_credits_noquota[DTO_INDEX_INSERT]);
 
        inode = osd_dt_obj(dt)->oo_inode;
        LASSERT(inode);
@@ -3851,6 +3862,7 @@ static const struct dt_index_operations osd_index_iam_ops = {
         }
 };
 
+
 /**
  * Creates or initializes iterator context.
  *
@@ -4138,8 +4150,10 @@ static inline int osd_it_ea_rec(const struct lu_env *env,
 
        if (!fid_is_sane(fid)) {
                rc = osd_ea_fid_get(env, obj, ino, fid, &oic->oic_lid);
-               if (rc != 0)
+               if (rc != 0) {
+                       fid_zero(&oic->oic_fid);
                        RETURN(rc);
+               }
        } else {
                osd_id_gen(&oic->oic_lid, ino, OSD_OII_NOGEN);
        }
@@ -4418,11 +4432,6 @@ static int osd_mount(const struct lu_env *env,
                GOTO(out, rc = -EINVAL);
        }
 
-       if (lmd_flags & LMD_FLG_IAM) {
-                o->od_iop_mode = 0;
-               LCONSOLE_WARN("%s: OSD: IAM mode enabled\n", name);
-        } else
-                o->od_iop_mode = 1;
        if (lmd_flags & LMD_FLG_NOSCRUB)
                o->od_noscrub = 1;
 
@@ -4624,7 +4633,17 @@ static int osd_process_config(const struct lu_env *env,
 static int osd_recovery_complete(const struct lu_env *env,
                                  struct lu_device *d)
 {
-        RETURN(0);
+       struct osd_device       *osd = osd_dev(d);
+       int                      rc = 0;
+       ENTRY;
+
+       if (osd->od_quota_slave == NULL)
+               RETURN(0);
+
+       /* start qsd instance on recovery completion, this notifies the quota
+        * slave code that we are about to process new requests now */
+       rc = qsd_start(env, osd->od_quota_slave);
+       RETURN(rc);
 }
 
 /*