X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Flayout.c;h=81faebb744c36361ca2860e0fda13d6eee24281d;hb=1fd3e8e08c033b88c2cbbc261ba6405b528c40af;hp=89ffe0587e3572aace0f50a79d65eaa142beede8;hpb=218d9b7631b25e9e2ea4e2c4e8b752aa13749c18;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 89ffe05..81faebb 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -1,29 +1,43 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * lustre/ptlrpc/layout.c - * Lustre Metadata Target (mdt) request handler + * GPL HEADER START * - * Copyright (c) 2006 Cluster File Systems, Inc. - * Author: Nikita Danilov + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of the Lustre file system, http://www.lustre.org - * Lustre is a trademark of Cluster File Systems, Inc. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * You may have signed or agreed to another license before downloading - * this software. If so, you are bound by the terms and conditions - * of that agreement, and the following does not apply to you. See the - * LICENSE file included with this distribution for more information. + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * If you did not agree to a different license, then this copy of Lustre - * is open source software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * In either case, Lustre is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * license text for more details. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/ptlrpc/layout.c + * + * Lustre Metadata Target (mdt) request handler + * + * Author: Nikita Danilov */ #if !defined(__REQ_LAYOUT_USER__) @@ -52,7 +66,7 @@ #endif /* struct ptlrpc_request, lustre_msg* */ #include -#include +#include /* * empty set of fields... for suitable definition of emptiness. @@ -91,6 +105,10 @@ static const struct req_msg_field *quotactl_only[] = { &RMF_PTLRPC_BODY, &RMF_OBD_QUOTACTL }; +static const struct req_msg_field *quota_adjust_qunit_only[] = { + &RMF_PTLRPC_BODY, + &RMF_QUOTA_ADJUST_QUNIT +}; static const struct req_msg_field *qunit_data_only[] = { &RMF_PTLRPC_BODY, @@ -226,7 +244,9 @@ static const struct req_msg_field *mds_last_unlink_server[] = { &RMF_PTLRPC_BODY, &RMF_MDT_BODY, &RMF_MDT_MD, - &RMF_LOGCOOKIES + &RMF_LOGCOOKIES, + &RMF_CAPA1, + &RMF_CAPA2 }; static const struct req_msg_field *mds_reint_setattr_client[] = { @@ -451,7 +471,8 @@ static const struct req_msg_field *ost_body_capa[] = { static const struct req_msg_field *ost_destroy_client[] = { &RMF_PTLRPC_BODY, &RMF_OST_BODY, - &RMF_DLM_REQ + &RMF_DLM_REQ, + &RMF_CAPA1 }; @@ -475,22 +496,39 @@ static const struct req_msg_field *ost_set_info_client[] = { &RMF_SETINFO_VAL }; -static const struct req_msg_field *ost_get_info_client[] = { +static const struct req_msg_field *ost_get_info_generic_server[] = { + &RMF_PTLRPC_BODY, + &RMF_GENERIC_DATA, +}; + +static const struct req_msg_field *ost_get_info_generic_client[] = { &RMF_PTLRPC_BODY, &RMF_SETINFO_KEY }; -static const struct req_msg_field *ost_get_info_server[] = { +static const struct req_msg_field *ost_get_last_id_server[] = { &RMF_PTLRPC_BODY, &RMF_OBD_ID }; + +static const struct req_msg_field *ost_get_fiemap_client[] = { + &RMF_PTLRPC_BODY, + &RMF_FIEMAP_KEY, + &RMF_FIEMAP_VAL +}; + +static const struct req_msg_field *ost_get_fiemap_server[] = { + &RMF_PTLRPC_BODY, + &RMF_FIEMAP_VAL +}; + static const struct req_format *req_formats[] = { &RQF_OBD_PING, &RQF_SEC_CTX, - &RQF_SEQ_QUERY, - &RQF_FLD_QUERY, &RQF_MGS_TARGET_REG, &RQF_MGS_SET_INFO, + &RQF_SEQ_QUERY, + &RQF_FLD_QUERY, &RQF_MDS_CONNECT, &RQF_MDS_DISCONNECT, &RQF_MDS_SET_INFO, @@ -521,10 +559,12 @@ static const struct req_format *req_formats[] = { &RQF_MDS_QUOTACHECK, &RQF_MDS_QUOTACTL, &RQF_MDS_QUOTA_DQACQ, + &RQF_QC_CALLBACK, &RQF_OST_CONNECT, &RQF_OST_DISCONNECT, &RQF_OST_QUOTACHECK, &RQF_OST_QUOTACTL, + &RQF_OST_QUOTA_ADJUST_QUNIT, &RQF_OST_GETATTR, &RQF_OST_SETATTR, &RQF_OST_CREATE, @@ -534,7 +574,10 @@ static const struct req_format *req_formats[] = { &RQF_OST_BRW, &RQF_OST_STATFS, &RQF_OST_SET_INFO, - &RQF_OST_GET_INFO, + &RQF_OST_SET_GRANT_INFO, + &RQF_OST_GET_INFO_GENERIC, + &RQF_OST_GET_INFO_LAST_ID, + &RQF_OST_GET_INFO_FIEMAP, &RQF_LDLM_ENQUEUE, &RQF_LDLM_ENQUEUE_LVB, &RQF_LDLM_CONVERT, @@ -561,7 +604,7 @@ static const struct req_format *req_formats[] = { struct req_msg_field { __u32 rmf_flags; const char *rmf_name; - /* + /** * Field length. (-1) means "variable length". */ int rmf_size; @@ -570,7 +613,8 @@ struct req_msg_field { }; enum rmf_flags { - RMF_F_STRING = 1 << 0 + RMF_F_STRING = 1 << 0, + RMF_F_NO_SIZE_CHECK = 1 << 1 }; struct req_capsule; @@ -585,6 +629,11 @@ struct req_capsule; .rmf_swabber = (void (*)(void*))(swabber) \ } +const struct req_msg_field RMF_GENERIC_DATA = + DEFINE_MSGF("generic_data", 0, + -1, NULL); +EXPORT_SYMBOL(RMF_GENERIC_DATA); + const struct req_msg_field RMF_MGS_TARGET_INFO = DEFINE_MSGF("mgs_target_info", 0, sizeof(struct mgs_target_info), @@ -598,8 +647,7 @@ const struct req_msg_field RMF_MGS_SEND_PARAM = EXPORT_SYMBOL(RMF_MGS_SEND_PARAM); const struct req_msg_field RMF_SETINFO_VAL = - DEFINE_MSGF("setinfo_val", 0, - sizeof(__u32), lustre_swab_generic_32s); + DEFINE_MSGF("setinfo_val", 0, -1, NULL); EXPORT_SYMBOL(RMF_SETINFO_VAL); const struct req_msg_field RMF_SEQ_OPC = @@ -609,7 +657,7 @@ EXPORT_SYMBOL(RMF_SEQ_OPC); const struct req_msg_field RMF_SEQ_RANGE = DEFINE_MSGF("seq_query_range", 0, - sizeof(struct lu_range), lustre_swab_lu_range); + sizeof(struct lu_seq_range), lustre_swab_lu_seq_range); EXPORT_SYMBOL(RMF_SEQ_RANGE); const struct req_msg_field RMF_FLD_OPC = @@ -619,7 +667,7 @@ EXPORT_SYMBOL(RMF_FLD_OPC); const struct req_msg_field RMF_FLD_MDFLD = DEFINE_MSGF("fld_query_mdfld", 0, - sizeof(struct md_fld), lustre_swab_md_fld); + sizeof(struct lu_seq_range), lustre_swab_lu_seq_range); EXPORT_SYMBOL(RMF_FLD_MDFLD); const struct req_msg_field RMF_MDT_BODY = @@ -632,6 +680,12 @@ const struct req_msg_field RMF_OBD_QUOTACTL = sizeof(struct obd_quotactl), lustre_swab_obd_quotactl); EXPORT_SYMBOL(RMF_OBD_QUOTACTL); +const struct req_msg_field RMF_QUOTA_ADJUST_QUNIT = + DEFINE_MSGF("quota_adjust_qunit", 0, + sizeof(struct quota_adjust_qunit), + lustre_swab_quota_adjust_qunit); +EXPORT_SYMBOL(RMF_QUOTA_ADJUST_QUNIT); + const struct req_msg_field RMF_QUNIT_DATA = DEFINE_MSGF("qunit_data", 0, sizeof(struct qunit_data), NULL); @@ -702,12 +756,13 @@ const struct req_msg_field RMF_CONN = EXPORT_SYMBOL(RMF_CONN); const struct req_msg_field RMF_CONNECT_DATA = - DEFINE_MSGF("cdata", 0, + DEFINE_MSGF("cdata", + RMF_F_NO_SIZE_CHECK /* we allow extra space for interop */, sizeof(struct obd_connect_data), lustre_swab_connect); EXPORT_SYMBOL(RMF_CONNECT_DATA); const struct req_msg_field RMF_DLM_REQ = - DEFINE_MSGF("dlm_req", 0, + DEFINE_MSGF("dlm_req", RMF_F_NO_SIZE_CHECK /* ldlm_request_bufsize */, sizeof(struct ldlm_request), lustre_swab_ldlm_request); EXPORT_SYMBOL(RMF_DLM_REQ); @@ -726,7 +781,7 @@ const struct req_msg_field RMF_DLM_LVB = EXPORT_SYMBOL(RMF_DLM_LVB); const struct req_msg_field RMF_MDT_MD = - DEFINE_MSGF("mdt_md", 0, MIN_MD_SIZE, NULL); + DEFINE_MSGF("mdt_md", RMF_F_NO_SIZE_CHECK, MIN_MD_SIZE, NULL); EXPORT_SYMBOL(RMF_MDT_MD); const struct req_msg_field RMF_REC_REINT = @@ -743,12 +798,14 @@ EXPORT_SYMBOL(RMF_REC_JOINFILE); const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, -1, NULL); EXPORT_SYMBOL(RMF_EADATA); -const struct req_msg_field RMF_ACL = - DEFINE_MSGF("acl", 0, LUSTRE_POSIX_ACL_MAX_SIZE, NULL); +const struct req_msg_field RMF_ACL = + DEFINE_MSGF("acl", RMF_F_NO_SIZE_CHECK, + LUSTRE_POSIX_ACL_MAX_SIZE, NULL); EXPORT_SYMBOL(RMF_ACL); const struct req_msg_field RMF_LOGCOOKIES = - DEFINE_MSGF("logcookies", 0, sizeof(struct llog_cookie), NULL); + DEFINE_MSGF("logcookies", RMF_F_NO_SIZE_CHECK /* multiple cookies */, + sizeof(struct llog_cookie), NULL); EXPORT_SYMBOL(RMF_LOGCOOKIES); const struct req_msg_field RMF_CAPA1 = @@ -761,7 +818,7 @@ const struct req_msg_field RMF_CAPA2 = lustre_swab_lustre_capa); EXPORT_SYMBOL(RMF_CAPA2); -/* +/* * OST request field. */ const struct req_msg_field RMF_OST_BODY = @@ -783,6 +840,14 @@ const struct req_msg_field RMF_OBD_ID = sizeof(obd_id), lustre_swab_ost_last_id); EXPORT_SYMBOL(RMF_OBD_ID); +const struct req_msg_field RMF_FIEMAP_KEY = + DEFINE_MSGF("fiemap", 0, sizeof(struct ll_fiemap_info_key), + lustre_swab_fiemap); +EXPORT_SYMBOL(RMF_FIEMAP_KEY); + +const struct req_msg_field RMF_FIEMAP_VAL = + DEFINE_MSGF("fiemap", 0, -1, lustre_swab_fiemap); +EXPORT_SYMBOL(RMF_FIEMAP_VAL); /* * Request formats. @@ -817,21 +882,29 @@ DEFINE_REQ_FMT(name, client, ARRAY_SIZE(client), server, ARRAY_SIZE(server)) const struct req_format RQF_OBD_PING = DEFINE_REQ_FMT0("OBD_PING", empty, empty); EXPORT_SYMBOL(RQF_OBD_PING); - + const struct req_format RQF_SEC_CTX = DEFINE_REQ_FMT0("SEC_CTX", empty, empty); EXPORT_SYMBOL(RQF_SEC_CTX); - + const struct req_format RQF_MGS_TARGET_REG = DEFINE_REQ_FMT0("MGS_TARGET_REG", mgs_target_info_only, mgs_target_info_only); EXPORT_SYMBOL(RQF_MGS_TARGET_REG); const struct req_format RQF_MGS_SET_INFO = - DEFINE_REQ_FMT0("MGS_SET_INTO", mgs_set_info, + DEFINE_REQ_FMT0("MGS_SET_INFO", mgs_set_info, mgs_set_info); EXPORT_SYMBOL(RQF_MGS_SET_INFO); +const struct req_format RQF_SEQ_QUERY = + DEFINE_REQ_FMT0("SEQ_QUERY", seq_query_client, seq_query_server); +EXPORT_SYMBOL(RQF_SEQ_QUERY); + +const struct req_format RQF_FLD_QUERY = + DEFINE_REQ_FMT0("FLD_QUERY", fld_query_client, fld_query_server); +EXPORT_SYMBOL(RQF_FLD_QUERY); + const struct req_format RQF_LOG_CANCEL = DEFINE_REQ_FMT0("OBD_LOG_CANCEL", log_cancel_client, empty); EXPORT_SYMBOL(RQF_LOG_CANCEL); @@ -852,6 +925,11 @@ const struct req_format RQF_OST_QUOTACTL = DEFINE_REQ_FMT0("OST_QUOTACTL", quotactl_only, quotactl_only); EXPORT_SYMBOL(RQF_OST_QUOTACTL); +const struct req_format RQF_OST_QUOTA_ADJUST_QUNIT = + DEFINE_REQ_FMT0("OST_QUOTA_ADJUST_QUNIT", quota_adjust_qunit_only, + quota_adjust_qunit_only); +EXPORT_SYMBOL(RQF_OST_QUOTA_ADJUST_QUNIT); + const struct req_format RQF_QC_CALLBACK = DEFINE_REQ_FMT0("QC_CALLBACK", quotactl_only, empty); EXPORT_SYMBOL(RQF_QC_CALLBACK); @@ -860,14 +938,6 @@ const struct req_format RQF_MDS_QUOTA_DQACQ = DEFINE_REQ_FMT0("MDS_QUOTA_DQACQ", qunit_data_only, qunit_data_only); EXPORT_SYMBOL(RQF_MDS_QUOTA_DQACQ); -const struct req_format RQF_SEQ_QUERY = - DEFINE_REQ_FMT0("SEQ_QUERY", seq_query_client, seq_query_server); -EXPORT_SYMBOL(RQF_SEQ_QUERY); - -const struct req_format RQF_FLD_QUERY = - DEFINE_REQ_FMT0("FLD_QUERY", fld_query_client, fld_query_server); -EXPORT_SYMBOL(RQF_FLD_QUERY); - const struct req_format RQF_MDS_GETSTATUS = DEFINE_REQ_FMT0("MDS_GETSTATUS", mdt_body_only, mdt_body_capa); EXPORT_SYMBOL(RQF_MDS_GETSTATUS); @@ -956,11 +1026,11 @@ EXPORT_SYMBOL(RQF_MDS_CONNECT); const struct req_format RQF_MDS_DISCONNECT = DEFINE_REQ_FMT0("MDS_DISCONNECT", empty, empty); EXPORT_SYMBOL(RQF_MDS_DISCONNECT); - + const struct req_format RQF_MDS_SET_INFO = DEFINE_REQ_FMT0("MDS_SET_INFO", mds_set_info_client, empty); EXPORT_SYMBOL(RQF_MDS_SET_INFO); - + const struct req_format RQF_LDLM_ENQUEUE = DEFINE_REQ_FMT0("LDLM_ENQUEUE", ldlm_enqueue_client, ldlm_enqueue_lvb_server); @@ -1136,10 +1206,25 @@ const struct req_format RQF_OST_SET_INFO = DEFINE_REQ_FMT0("OST_SET_INFO", ost_set_info_client, empty); EXPORT_SYMBOL(RQF_OST_SET_INFO); -const struct req_format RQF_OST_GET_INFO = - DEFINE_REQ_FMT0("OST_GET_INFO", ost_get_info_client, - ost_get_info_server); -EXPORT_SYMBOL(RQF_OST_GET_INFO); +const struct req_format RQF_OST_SET_GRANT_INFO = + DEFINE_REQ_FMT0("OST_SET_GRANT_INFO", ost_set_info_client, + ost_body_only); +EXPORT_SYMBOL(RQF_OST_SET_GRANT_INFO); + +const struct req_format RQF_OST_GET_INFO_GENERIC = + DEFINE_REQ_FMT0("OST_GET_INFO", ost_get_info_generic_client, + ost_get_info_generic_server); +EXPORT_SYMBOL(RQF_OST_GET_INFO_GENERIC); + +const struct req_format RQF_OST_GET_INFO_LAST_ID = + DEFINE_REQ_FMT0("OST_GET_INFO_LAST_ID", ost_get_info_generic_client, + ost_get_last_id_server); +EXPORT_SYMBOL(RQF_OST_GET_INFO_LAST_ID); + +const struct req_format RQF_OST_GET_INFO_FIEMAP = + DEFINE_REQ_FMT0("OST_GET_INFO_FIEMAP", ost_get_fiemap_client, + ost_get_fiemap_server); +EXPORT_SYMBOL(RQF_OST_GET_INFO_FIEMAP); #if !defined(__REQ_LAYOUT_USER__) @@ -1249,7 +1334,7 @@ int req_capsule_filled_sizes(struct req_capsule *pill, for (i = 0; i < fmt->rf_fields[loc].nr; ++i) { if (pill->rc_area[loc][i] == -1) { - pill->rc_area[loc][i] = + pill->rc_area[loc][i] = fmt->rf_fields[loc].d[i]->rmf_size; if (pill->rc_area[loc][i] == -1) { /* skip the following fields */ @@ -1317,8 +1402,11 @@ static void *__req_capsule_get(struct req_capsule *pill, [RCL_SERVER] = "server" }; + LASSERT(pill != NULL); + LASSERT(pill != LP_POISON); fmt = pill->rc_fmt; LASSERT(fmt != NULL); + LASSERT(fmt != LP_POISON); LASSERT(__req_format_is_sane(fmt)); offset = __req_capsule_offset(pill, field, loc); @@ -1416,6 +1504,15 @@ void req_capsule_set_size(struct req_capsule *pill, { LASSERT(loc == RCL_SERVER || loc == RCL_CLIENT); + if ((size != field->rmf_size) && + (field->rmf_size != -1) && + !(field->rmf_flags & RMF_F_NO_SIZE_CHECK) && + (size > 0)) { + CERROR("%s: field size mismatch %d != %d (%d)\n", + field->rmf_name, size, field->rmf_size, loc); + //LBUG(); + } + pill->rc_area[loc][__req_capsule_offset(pill, field, loc)] = size; } EXPORT_SYMBOL(req_capsule_set_size); @@ -1435,11 +1532,11 @@ int req_capsule_get_size(const struct req_capsule *pill, } EXPORT_SYMBOL(req_capsule_get_size); -int req_capsule_msg_size(const struct req_capsule *pill, enum req_location loc) +int req_capsule_msg_size(struct req_capsule *pill, enum req_location loc) { return lustre_msg_size(pill->rc_req->rq_import->imp_msg_magic, pill->rc_fmt->rf_fields[loc].nr, - (int *)pill->rc_area[loc]); + pill->rc_area[loc]); } int req_capsule_fmt_size(__u32 magic, const struct req_format *fmt, @@ -1451,9 +1548,6 @@ int req_capsule_fmt_size(__u32 magic, const struct req_format *fmt, if (size < 0) return size; - if (magic == LUSTRE_MSG_MAGIC_V1) - i++; - for (; i < fmt->rf_fields[loc].nr; ++i) if (fmt->rf_fields[loc].d[i]->rmf_size != -1) size += size_round(fmt->rf_fields[loc].d[i]->rmf_size);