Whamcloud - gitweb
LU-5396 lod: (and mdt, mgs) make some symbols static
[fs/lustre-release.git] / lustre / mdt / mdt_reint.c
index 0b508d6..62538bc 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -46,6 +46,7 @@
 
 #define DEBUG_SUBSYSTEM S_MDS
 
+#include <lprocfs_status.h>
 #include "mdt_internal.h"
 #include <lustre_lmv.h>
 
@@ -219,9 +220,10 @@ int mdt_version_get_check_save(struct mdt_thread_info *info,
  * This checks version of 'name'. Many reint functions uses 'name' for child not
  * FID, therefore we need to get object by name and check its version.
  */
-int mdt_lookup_version_check(struct mdt_thread_info *info,
-                            struct mdt_object *p, const struct lu_name *lname,
-                            struct lu_fid *fid, int idx)
+static int mdt_lookup_version_check(struct mdt_thread_info *info,
+                                   struct mdt_object *p,
+                                   const struct lu_name *lname,
+                                   struct lu_fid *fid, int idx)
 {
         int rc, vbrc;
 
@@ -312,8 +314,13 @@ static int mdt_remote_permission(struct mdt_thread_info *info,
                return -ENOTSUPP;
 
        if (S_ISDIR(attr->la_mode) && spec->u.sp_ea.eadata != NULL &&
-           spec->u.sp_ea.eadatalen != 0 && !mdt_is_striped_client(exp))
-               return -ENOTSUPP;
+           spec->u.sp_ea.eadatalen != 0) {
+               const struct lmv_user_md *lum = spec->u.sp_ea.eadata;
+
+               if (le32_to_cpu(lum->lum_stripe_count) > 1 &&
+                   !mdt_is_striped_client(exp))
+                       return -ENOTSUPP;
+       }
 
        return 0;
 }
@@ -664,8 +671,8 @@ static int mdt_reint_setattr(struct mdt_thread_info *info,
         DEBUG_REQ(D_INODE, req, "setattr "DFID" %x", PFID(rr->rr_fid1),
                   (unsigned int)ma->ma_attr.la_valid);
 
-        if (info->mti_dlm_req)
-                ldlm_request_cancel(req, info->mti_dlm_req, 0);
+       if (info->mti_dlm_req)
+               ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
 
        repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
         mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
@@ -827,8 +834,9 @@ static int mdt_reint_create(struct mdt_thread_info *info,
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_CREATE))
                 RETURN(err_serious(-ESTALE));
 
-        if (info->mti_dlm_req)
-                ldlm_request_cancel(mdt_info_req(info), info->mti_dlm_req, 0);
+       if (info->mti_dlm_req)
+               ldlm_request_cancel(mdt_info_req(info),
+                                   info->mti_dlm_req, 0, LATF_SKIP);
 
        if (!lu_name_is_valid(&info->mti_rr.rr_name))
                RETURN(-EPROTO);
@@ -882,8 +890,8 @@ static int mdt_reint_unlink(struct mdt_thread_info *info,
        DEBUG_REQ(D_INODE, req, "unlink "DFID"/"DNAME"", PFID(rr->rr_fid1),
                  PNAME(&rr->rr_name));
 
-        if (info->mti_dlm_req)
-                ldlm_request_cancel(req, info->mti_dlm_req, 0);
+       if (info->mti_dlm_req)
+               ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
 
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNLINK))
                 RETURN(err_serious(-ENOENT));
@@ -1105,8 +1113,8 @@ static int mdt_reint_link(struct mdt_thread_info *info,
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK))
                 RETURN(err_serious(-ENOENT));
 
-        if (info->mti_dlm_req)
-                ldlm_request_cancel(req, info->mti_dlm_req, 0);
+       if (info->mti_dlm_req)
+               ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
 
         /* Invalid case so return error immediately instead of
          * processing it */
@@ -1986,7 +1994,7 @@ static int mdt_reint_rename_or_migrate(struct mdt_thread_info *info,
        ENTRY;
 
        if (info->mti_dlm_req)
-               ldlm_request_cancel(req, info->mti_dlm_req, 0);
+               ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
 
        if (!fid_is_md_operative(rr->rr_fid1) ||
            !fid_is_md_operative(rr->rr_fid2))
@@ -2022,28 +2030,68 @@ static int mdt_reint_migrate(struct mdt_thread_info *info,
        return mdt_reint_rename_or_migrate(info, lhc, MRL_MIGRATE);
 }
 
-typedef int (*mdt_reinter)(struct mdt_thread_info *info,
-                           struct mdt_lock_handle *lhc);
-
-static mdt_reinter reinters[REINT_MAX] = {
-       [REINT_SETATTR]  = mdt_reint_setattr,
-       [REINT_CREATE]   = mdt_reint_create,
-       [REINT_LINK]     = mdt_reint_link,
-       [REINT_UNLINK]   = mdt_reint_unlink,
-       [REINT_RENAME]   = mdt_reint_rename,
-       [REINT_OPEN]     = mdt_reint_open,
-       [REINT_SETXATTR] = mdt_reint_setxattr,
-       [REINT_RMENTRY]  = mdt_reint_unlink,
-       [REINT_MIGRATE]   = mdt_reint_migrate,
+struct mdt_reinter {
+       int (*mr_handler)(struct mdt_thread_info *, struct mdt_lock_handle *);
+       enum lprocfs_extra_opc mr_extra_opc;
+};
+
+static const struct mdt_reinter mdt_reinters[] = {
+       [REINT_SETATTR] = {
+               .mr_handler = &mdt_reint_setattr,
+               .mr_extra_opc = MDS_REINT_SETATTR,
+       },
+       [REINT_CREATE] = {
+               .mr_handler = &mdt_reint_create,
+               .mr_extra_opc = MDS_REINT_CREATE,
+       },
+       [REINT_LINK] = {
+               .mr_handler = &mdt_reint_link,
+               .mr_extra_opc = MDS_REINT_LINK,
+       },
+       [REINT_UNLINK] = {
+               .mr_handler = &mdt_reint_unlink,
+               .mr_extra_opc = MDS_REINT_UNLINK,
+       },
+       [REINT_RENAME] = {
+               .mr_handler = &mdt_reint_rename,
+               .mr_extra_opc = MDS_REINT_RENAME,
+       },
+       [REINT_OPEN] = {
+               .mr_handler = &mdt_reint_open,
+               .mr_extra_opc = MDS_REINT_OPEN,
+       },
+       [REINT_SETXATTR] = {
+               .mr_handler = &mdt_reint_setxattr,
+               .mr_extra_opc = MDS_REINT_SETXATTR,
+       },
+       [REINT_RMENTRY] = {
+               .mr_handler = &mdt_reint_unlink,
+               .mr_extra_opc = MDS_REINT_UNLINK,
+       },
+       [REINT_MIGRATE] = {
+               .mr_handler = &mdt_reint_migrate,
+               .mr_extra_opc = MDS_REINT_RENAME,
+       },
 };
 
 int mdt_reint_rec(struct mdt_thread_info *info,
-                  struct mdt_lock_handle *lhc)
+                 struct mdt_lock_handle *lhc)
 {
-        int rc;
-        ENTRY;
+       const struct mdt_reinter *mr;
+       int rc;
+       ENTRY;
 
-        rc = reinters[info->mti_rr.rr_opcode](info, lhc);
+       if (!(info->mti_rr.rr_opcode < ARRAY_SIZE(mdt_reinters)))
+               RETURN(-EPROTO);
 
-        RETURN(rc);
+       mr = &mdt_reinters[info->mti_rr.rr_opcode];
+       if (mr->mr_handler == NULL)
+               RETURN(-EPROTO);
+
+       rc = (*mr->mr_handler)(info, lhc);
+
+       lprocfs_counter_incr(ptlrpc_req2svc(mdt_info_req(info))->srv_stats,
+                            PTLRPC_LAST_CNTR + mr->mr_extra_opc);
+
+       RETURN(rc);
 }