Whamcloud - gitweb
b=19964 SOM EA
[fs/lustre-release.git] / lustre / mdd / mdd_dir.c
index 06561d9..fb0c0f3 100644 (file)
@@ -680,6 +680,7 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj,
         struct thandle *handle;
 #ifdef HAVE_QUOTA_SUPPORT
         struct obd_device *obd = mdd->mdd_obd_dev;
+        struct obd_export *exp = md_quota(env)->mq_exp;
         struct mds_obd *mds = &obd->u.mds;
         unsigned int qids[MAXQUOTAS] = { 0, 0 };
         int quota_opc = 0, rec_pending[MAXQUOTAS] = { 0, 0 };
@@ -698,7 +699,7 @@ static int mdd_link(const struct lu_env *env, struct md_object *tgt_obj,
                         quota_opc = FSFILT_OP_LINK;
                         mdd_quota_wrapper(la_tmp, qids);
                         /* get block quota for parent */
-                        lquota_chkquota(mds_quota_interface_ref, obd,
+                        lquota_chkquota(mds_quota_interface_ref, obd, exp,
                                         qids, rec_pending, 1, NULL,
                                         LQUOTA_FLAGS_BLK, data, 1);
                 }
@@ -903,11 +904,6 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj,
                 }
         }
 #endif
-
-        if (rc == 0)
-                obd_set_info_async(mdd2obd_dev(mdd)->u.mds.mds_osc_exp,
-                                   sizeof(KEY_UNLINKED), KEY_UNLINKED, 0,
-                                   NULL, NULL);
         if (!is_dir)
                 /* old files may not have link ea; ignore errors */
                 mdd_links_rename(env, mdd_cobj, mdo2fid(mdd_pobj),
@@ -971,6 +967,7 @@ static int mdd_name_insert(const struct lu_env *env,
 #ifdef HAVE_QUOTA_SUPPORT
         struct md_ucred *uc = md_ucred(env);
         struct obd_device *obd = mdd->mdd_obd_dev;
+        struct obd_export *exp = md_quota(env)->mq_exp;
         struct mds_obd *mds = &obd->u.mds;
         unsigned int qids[MAXQUOTAS] = { 0, 0 };
         int quota_opc = 0, rec_pending[MAXQUOTAS] = { 0, 0 };
@@ -992,7 +989,7 @@ static int mdd_name_insert(const struct lu_env *env,
                                 mdd_quota_wrapper(la_tmp, qids);
                                 /* get block quota for parent */
                                 lquota_chkquota(mds_quota_interface_ref, obd,
-                                                qids, rec_pending, 1, NULL,
+                                                exp, qids, rec_pending, 1, NULL,
                                                 LQUOTA_FLAGS_BLK, data, 1);
                         }
                 } else {
@@ -1194,6 +1191,7 @@ static int mdd_rename_tgt(const struct lu_env *env,
         struct thandle *handle;
 #ifdef HAVE_QUOTA_SUPPORT
         struct obd_device *obd = mdd->mdd_obd_dev;
+        struct obd_export *exp = md_quota(env)->mq_exp;
         struct mds_obd *mds = &obd->u.mds;
         unsigned int qcids[MAXQUOTAS] = { 0, 0 };
         unsigned int qpids[MAXQUOTAS] = { 0, 0 };
@@ -1214,7 +1212,7 @@ static int mdd_rename_tgt(const struct lu_env *env,
                         quota_popc = FSFILT_OP_LINK;
                         mdd_quota_wrapper(la_tmp, qpids);
                         /* get block quota for target parent */
-                        lquota_chkquota(mds_quota_interface_ref, obd,
+                        lquota_chkquota(mds_quota_interface_ref, obd, exp,
                                         qpids, rec_pending, 1, NULL,
                                         LQUOTA_FLAGS_BLK, data, 1);
                 }
@@ -1592,6 +1590,7 @@ static int mdd_create(const struct lu_env *env,
         int got_def_acl = 0;
 #ifdef HAVE_QUOTA_SUPPORT
         struct obd_device *obd = mdd->mdd_obd_dev;
+        struct obd_export *exp = md_quota(env)->mq_exp;
         struct mds_obd *mds = &obd->u.mds;
         unsigned int qcids[MAXQUOTAS] = { 0, 0 };
         unsigned int qpids[MAXQUOTAS] = { 0, 0 };
@@ -1655,8 +1654,9 @@ static int mdd_create(const struct lu_env *env,
                         mdd_quota_wrapper(&ma->ma_attr, qcids);
                         mdd_quota_wrapper(la_tmp, qpids);
                         /* get file quota for child */
-                        lquota_chkquota(mds_quota_interface_ref, obd, qcids,
-                                        inode_pending, 1, NULL, 0, NULL, 0);
+                        lquota_chkquota(mds_quota_interface_ref, obd, exp,
+                                        qcids, inode_pending, 1, NULL, 0, NULL,
+                                        0);
                         switch (ma->ma_attr.la_mode & S_IFMT) {
                         case S_IFLNK:
                         case S_IFDIR:
@@ -1674,13 +1674,14 @@ static int mdd_create(const struct lu_env *env,
                         /* get block quota for child and parent */
                         if (block_count)
                                 lquota_chkquota(mds_quota_interface_ref, obd,
-                                                qcids, block_pending,
+                                                exp, qcids, block_pending,
                                                 block_count, NULL,
                                                 LQUOTA_FLAGS_BLK, NULL, 0);
                         if (!same)
                                 lquota_chkquota(mds_quota_interface_ref, obd,
-                                                qpids, parent_pending, 1, NULL,
-                                                LQUOTA_FLAGS_BLK, NULL, 0);
+                                                exp, qpids, parent_pending, 1,
+                                                NULL, LQUOTA_FLAGS_BLK, NULL,
+                                                0);
                 }
         }
 #endif
@@ -1972,6 +1973,7 @@ static int mdd_rename(const struct lu_env *env,
 
 #ifdef HAVE_QUOTA_SUPPORT
         struct obd_device *obd = mdd->mdd_obd_dev;
+        struct obd_export *exp = md_quota(env)->mq_exp;
         struct mds_obd *mds = &obd->u.mds;
         unsigned int qspids[MAXQUOTAS] = { 0, 0 };
         unsigned int qtcids[MAXQUOTAS] = { 0, 0 };
@@ -2004,7 +2006,7 @@ static int mdd_rename(const struct lu_env *env,
                                         mdd_quota_wrapper(la_tmp, qtpids);
                                         /* get block quota for target parent */
                                         lquota_chkquota(mds_quota_interface_ref,
-                                                        obd, qtpids,
+                                                        obd, exp, qtpids,
                                                         rec_pending, 1, NULL,
                                                         LQUOTA_FLAGS_BLK,
                                                         data, 1);
@@ -2056,7 +2058,7 @@ static int mdd_rename(const struct lu_env *env,
                 GOTO(cleanup, rc);
 
         /* "mv dir1 dir2" needs "dir1/.." link update */
-        if (is_dir && mdd_sobj) {
+        if (is_dir && mdd_sobj && !lu_fid_eq(spobj_fid, tpobj_fid)) {
                 rc = __mdd_index_delete_only(env, mdd_sobj, dotdot, handle,
                                         mdd_object_capa(env, mdd_sobj));
                 if (rc)
@@ -2064,9 +2066,8 @@ static int mdd_rename(const struct lu_env *env,
 
                 rc = __mdd_index_insert_only(env, mdd_sobj, tpobj_fid, dotdot,
                                       handle, mdd_object_capa(env, mdd_sobj));
-                if (rc) {
+                if (rc)
                         GOTO(fixup_spobj, rc);
-                }
         }
 
         /* Remove target name from target directory
@@ -2458,7 +2459,7 @@ static int mdd_links_rename(const struct lu_env *env,
         lee = (struct link_ea_entry *)(leh + 1); /* link #0 */
 
         /* Find the old record */
-        for(count = 0; count <= leh->leh_reccount; count++) {
+        for(count = 0; count < leh->leh_reccount; count++) {
                 mdd_lee_unpack(lee, &reclen, tmpname, tmpfid);
                 if (tmpname->ln_namelen == oldlname->ln_namelen &&
                     lu_fid_eq(tmpfid, oldpfid) &&
@@ -2467,7 +2468,7 @@ static int mdd_links_rename(const struct lu_env *env,
                         break;
                 lee = (struct link_ea_entry *)((char *)lee + reclen);
         }
-        if (count > leh->leh_reccount) {
+        if ((count + 1) > leh->leh_reccount) {
                 CDEBUG(D_INODE, "Old link_ea name '%.*s' not found\n",
                        oldlname->ln_namelen, oldlname->ln_name);
                 GOTO(out, rc = -ENOENT);