* 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/
#define DEBUG_SUBSYSTEM S_MDS
+#include <lprocfs_status.h>
#include "mdt_internal.h"
#include <lustre_lmv.h>
* 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;
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;
}
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);
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);
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));
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 */
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))
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);
}