X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fpack_generic.c;h=03515ca79929d7822a0777a3990a7158ae59bc0f;hb=1ae726743b5a051bb4daa731d93496a3e7f7a93c;hp=56558e5925adce60230be2d7365b80bf93bd818c;hpb=2e0ad6d40070d38076c77038b7d48ac90af7b130;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 56558e5..03515ca 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,6 +26,8 @@ /* * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -54,6 +54,7 @@ #include #include #include +#include static inline int lustre_msg_hdr_size_v2(int count) { @@ -81,6 +82,7 @@ void ptlrpc_buf_set_swabbed(struct ptlrpc_request *req, const int inout, else lustre_set_rep_swabbed(req, index); } +EXPORT_SYMBOL(ptlrpc_buf_set_swabbed); int ptlrpc_buf_need_swab(struct ptlrpc_request *req, const int inout, int index) @@ -92,6 +94,7 @@ int ptlrpc_buf_need_swab(struct ptlrpc_request *req, const int inout, return (ptlrpc_rep_need_swab(req) && !lustre_rep_swabbed(req, index)); } +EXPORT_SYMBOL(ptlrpc_buf_need_swab); static inline int lustre_msg_check_version_v2(struct lustre_msg_v2 *msg, __u32 version) @@ -113,13 +116,23 @@ int lustre_msg_check_version(struct lustre_msg *msg, __u32 version) return 0; } } +EXPORT_SYMBOL(lustre_msg_check_version); /* early reply size */ int lustre_msg_early_size() { static int size = 0; - if (!size) - size = lustre_msg_size(LUSTRE_MSG_MAGIC_V2, 1, NULL); + if (!size) { + /* Always reply old ptlrpc_body_v2 to keep interoprability + * with the old client (< 2.3) which doesn't have pb_jobid + * in the ptlrpc_body. + * + * XXX Remove this whenever we dorp interoprability with such + * client. + */ + __u32 pblen = sizeof(struct ptlrpc_body_v2); + size = lustre_msg_size(LUSTRE_MSG_MAGIC_V2, 1, &pblen); + } return size; } EXPORT_SYMBOL(lustre_msg_early_size); @@ -153,7 +166,7 @@ int lustre_msg_size(__u32 magic, int count, __u32 *lens) } LASSERT(count > 0); - LASSERT(lens[MSG_PTLRPC_BODY_OFF] == sizeof(struct ptlrpc_body)); + LASSERT(lens[MSG_PTLRPC_BODY_OFF] >= sizeof(struct ptlrpc_body_v2)); switch (magic) { case LUSTRE_MSG_MAGIC_V2: @@ -163,6 +176,7 @@ int lustre_msg_size(__u32 magic, int count, __u32 *lens) return -EINVAL; } } +EXPORT_SYMBOL(lustre_msg_size); /* This is used to determine the size of a buffer that was already packed * and will correctly handle the different message formats. */ @@ -176,6 +190,7 @@ int lustre_packed_msg_size(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_packed_msg_size); void lustre_init_msg_v2(struct lustre_msg_v2 *msg, int count, __u32 *lens, char **bufs) @@ -243,72 +258,76 @@ int lustre_pack_request(struct ptlrpc_request *req, __u32 magic, int count, return -EINVAL; } } +EXPORT_SYMBOL(lustre_pack_request); #if RS_DEBUG -CFS_LIST_HEAD(ptlrpc_rs_debug_lru); -cfs_spinlock_t ptlrpc_rs_debug_lock; - -#define PTLRPC_RS_DEBUG_LRU_ADD(rs) \ -do { \ - cfs_spin_lock(&ptlrpc_rs_debug_lock); \ - cfs_list_add_tail(&(rs)->rs_debug_list, &ptlrpc_rs_debug_lru); \ - cfs_spin_unlock(&ptlrpc_rs_debug_lock); \ +struct list_head ptlrpc_rs_debug_lru = + LIST_HEAD_INIT(ptlrpc_rs_debug_lru); +spinlock_t ptlrpc_rs_debug_lock; + +#define PTLRPC_RS_DEBUG_LRU_ADD(rs) \ +do { \ + spin_lock(&ptlrpc_rs_debug_lock); \ + list_add_tail(&(rs)->rs_debug_list, &ptlrpc_rs_debug_lru); \ + spin_unlock(&ptlrpc_rs_debug_lock); \ } while (0) -#define PTLRPC_RS_DEBUG_LRU_DEL(rs) \ -do { \ - cfs_spin_lock(&ptlrpc_rs_debug_lock); \ - cfs_list_del(&(rs)->rs_debug_list); \ - cfs_spin_unlock(&ptlrpc_rs_debug_lock); \ +#define PTLRPC_RS_DEBUG_LRU_DEL(rs) \ +do { \ + spin_lock(&ptlrpc_rs_debug_lock); \ + list_del(&(rs)->rs_debug_list); \ + spin_unlock(&ptlrpc_rs_debug_lock); \ } while (0) #else # define PTLRPC_RS_DEBUG_LRU_ADD(rs) do {} while(0) # define PTLRPC_RS_DEBUG_LRU_DEL(rs) do {} while(0) #endif -struct ptlrpc_reply_state *lustre_get_emerg_rs(struct ptlrpc_service *svc) -{ - struct ptlrpc_reply_state *rs = NULL; - - cfs_spin_lock(&svc->srv_lock); - /* See if we have anything in a pool, and wait if nothing */ - while (cfs_list_empty(&svc->srv_free_rs_list)) { - struct l_wait_info lwi; - int rc; - cfs_spin_unlock(&svc->srv_lock); - /* If we cannot get anything for some long time, we better - bail out instead of waiting infinitely */ - lwi = LWI_TIMEOUT(cfs_time_seconds(10), NULL, NULL); - rc = l_wait_event(svc->srv_free_rs_waitq, - !cfs_list_empty(&svc->srv_free_rs_list), - &lwi); - if (rc) - goto out; - cfs_spin_lock(&svc->srv_lock); - } - - rs = cfs_list_entry(svc->srv_free_rs_list.next, - struct ptlrpc_reply_state, rs_list); - cfs_list_del(&rs->rs_list); - cfs_spin_unlock(&svc->srv_lock); - LASSERT(rs); - memset(rs, 0, svc->srv_max_reply_size); - rs->rs_service = svc; - rs->rs_prealloc = 1; +struct ptlrpc_reply_state * +lustre_get_emerg_rs(struct ptlrpc_service_part *svcpt) +{ + struct ptlrpc_reply_state *rs = NULL; + + spin_lock(&svcpt->scp_rep_lock); + + /* See if we have anything in a pool, and wait if nothing */ + while (list_empty(&svcpt->scp_rep_idle)) { + struct l_wait_info lwi; + int rc; + + spin_unlock(&svcpt->scp_rep_lock); + /* If we cannot get anything for some long time, we better + * bail out instead of waiting infinitely */ + lwi = LWI_TIMEOUT(cfs_time_seconds(10), NULL, NULL); + rc = l_wait_event(svcpt->scp_rep_waitq, + !list_empty(&svcpt->scp_rep_idle), &lwi); + if (rc != 0) + goto out; + spin_lock(&svcpt->scp_rep_lock); + } + + rs = list_entry(svcpt->scp_rep_idle.next, + struct ptlrpc_reply_state, rs_list); + list_del(&rs->rs_list); + + spin_unlock(&svcpt->scp_rep_lock); + + memset(rs, 0, svcpt->scp_service->srv_max_reply_size); + rs->rs_size = svcpt->scp_service->srv_max_reply_size; + rs->rs_svcpt = svcpt; + rs->rs_prealloc = 1; out: - return rs; + return rs; } void lustre_put_emerg_rs(struct ptlrpc_reply_state *rs) { - struct ptlrpc_service *svc = rs->rs_service; - - LASSERT(svc); + struct ptlrpc_service_part *svcpt = rs->rs_svcpt; - cfs_spin_lock(&svc->srv_lock); - cfs_list_add(&rs->rs_list, &svc->srv_free_rs_list); - cfs_spin_unlock(&svc->srv_lock); - cfs_waitq_signal(&svc->srv_free_rs_waitq); + spin_lock(&svcpt->scp_rep_lock); + list_add(&rs->rs_list, &svcpt->scp_rep_idle); + spin_unlock(&svcpt->scp_rep_lock); + wake_up(&svcpt->scp_rep_waitq); } int lustre_pack_reply_v2(struct ptlrpc_request *req, int count, @@ -321,9 +340,9 @@ int lustre_pack_reply_v2(struct ptlrpc_request *req, int count, LASSERT(req->rq_reply_state == NULL); if ((flags & LPRFL_EARLY_REPLY) == 0) { - cfs_spin_lock(&req->rq_lock); - req->rq_packed_final = 1; - cfs_spin_unlock(&req->rq_lock); + spin_lock(&req->rq_lock); + req->rq_packed_final = 1; + spin_unlock(&req->rq_lock); } msg_len = lustre_msg_size_v2(count, lens); @@ -331,15 +350,15 @@ int lustre_pack_reply_v2(struct ptlrpc_request *req, int count, if (rc) RETURN(rc); - rs = req->rq_reply_state; - cfs_atomic_set(&rs->rs_refcount, 1); /* 1 ref for rq_reply_state */ - rs->rs_cb_id.cbid_fn = reply_out_callback; - rs->rs_cb_id.cbid_arg = rs; - rs->rs_service = req->rq_rqbd->rqbd_service; - CFS_INIT_LIST_HEAD(&rs->rs_exp_list); - CFS_INIT_LIST_HEAD(&rs->rs_obd_list); - CFS_INIT_LIST_HEAD(&rs->rs_list); - cfs_spin_lock_init(&rs->rs_lock); + rs = req->rq_reply_state; + atomic_set(&rs->rs_refcount, 1); /* 1 ref for rq_reply_state */ + rs->rs_cb_id.cbid_fn = reply_out_callback; + rs->rs_cb_id.cbid_arg = rs; + rs->rs_svcpt = req->rq_rqbd->rqbd_svcpt; + INIT_LIST_HEAD(&rs->rs_exp_list); + INIT_LIST_HEAD(&rs->rs_obd_list); + INIT_LIST_HEAD(&rs->rs_list); + spin_lock_init(&rs->rs_lock); req->rq_replen = msg_len; req->rq_reply_state = rs; @@ -382,12 +401,14 @@ int lustre_pack_reply_flags(struct ptlrpc_request *req, int count, __u32 *lens, lustre_msg_size(req->rq_reqmsg->lm_magic, count, lens)); return rc; } +EXPORT_SYMBOL(lustre_pack_reply_flags); int lustre_pack_reply(struct ptlrpc_request *req, int count, __u32 *lens, char **bufs) { return lustre_pack_reply_flags(req, count, lens, bufs, 0); } +EXPORT_SYMBOL(lustre_pack_reply); void *lustre_msg_buf_v2(struct lustre_msg_v2 *m, int n, int min_size) { @@ -428,6 +449,7 @@ void *lustre_msg_buf(struct lustre_msg *m, int n, int min_size) return NULL; } } +EXPORT_SYMBOL(lustre_msg_buf); int lustre_shrink_msg_v2(struct lustre_msg_v2 *msg, int segment, unsigned int newlen, int move_data) @@ -486,22 +508,24 @@ int lustre_shrink_msg(struct lustre_msg *msg, int segment, LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_shrink_msg); void lustre_free_reply_state(struct ptlrpc_reply_state *rs) { - PTLRPC_RS_DEBUG_LRU_DEL(rs); + PTLRPC_RS_DEBUG_LRU_DEL(rs); - LASSERT (cfs_atomic_read(&rs->rs_refcount) == 0); - LASSERT (!rs->rs_difficult || rs->rs_handled); - LASSERT (!rs->rs_on_net); - LASSERT (!rs->rs_scheduled); - LASSERT (rs->rs_export == NULL); - LASSERT (rs->rs_nlocks == 0); - LASSERT (cfs_list_empty(&rs->rs_exp_list)); - LASSERT (cfs_list_empty(&rs->rs_obd_list)); + LASSERT(atomic_read(&rs->rs_refcount) == 0); + LASSERT(!rs->rs_difficult || rs->rs_handled); + LASSERT(!rs->rs_on_net); + LASSERT(!rs->rs_scheduled); + LASSERT(rs->rs_export == NULL); + LASSERT(rs->rs_nlocks == 0); + LASSERT(list_empty(&rs->rs_exp_list)); + LASSERT(list_empty(&rs->rs_obd_list)); - sptlrpc_svc_free_rs(rs); + sptlrpc_svc_free_rs(rs); } +EXPORT_SYMBOL(lustre_free_reply_state); static int lustre_unpack_msg_v2(struct lustre_msg_v2 *m, int len) { @@ -589,6 +613,7 @@ int ptlrpc_unpack_req_msg(struct ptlrpc_request *req, int len) } return rc; } +EXPORT_SYMBOL(ptlrpc_unpack_req_msg); int ptlrpc_unpack_rep_msg(struct ptlrpc_request *req, int len) { @@ -600,6 +625,7 @@ int ptlrpc_unpack_rep_msg(struct ptlrpc_request *req, int len) } return rc; } +EXPORT_SYMBOL(ptlrpc_unpack_rep_msg); static inline int lustre_unpack_ptlrpc_body_v2(struct ptlrpc_request *req, const int inout, int offset) @@ -607,7 +633,7 @@ static inline int lustre_unpack_ptlrpc_body_v2(struct ptlrpc_request *req, struct ptlrpc_body *pb; struct lustre_msg_v2 *m = inout ? req->rq_reqmsg : req->rq_repmsg; - pb = lustre_msg_buf_v2(m, offset, sizeof(*pb)); + pb = lustre_msg_buf_v2(m, offset, sizeof(struct ptlrpc_body_v2)); if (!pb) { CERROR("error unpacking ptlrpc body\n"); return -EFAULT; @@ -622,6 +648,9 @@ static inline int lustre_unpack_ptlrpc_body_v2(struct ptlrpc_request *req, return -EINVAL; } + if (!inout) + pb->pb_status = ptlrpc_status_ntoh(pb->pb_status); + return 0; } @@ -756,6 +785,7 @@ char *lustre_msg_string(struct lustre_msg *m, int index, int max_len) return str; } +EXPORT_SYMBOL(lustre_msg_string); /* Wrap up the normal fixed length cases */ static inline void *__lustre_swab_buf(struct lustre_msg *msg, int index, @@ -781,7 +811,7 @@ static inline void *__lustre_swab_buf(struct lustre_msg *msg, int index, static inline struct ptlrpc_body *lustre_msg_ptlrpc_body(struct lustre_msg *msg) { return lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, - sizeof(struct ptlrpc_body)); + sizeof(struct ptlrpc_body_v2)); } __u32 lustre_msghdr_get_flags(struct lustre_msg *msg) @@ -830,6 +860,7 @@ __u32 lustre_msg_get_flags(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_flags); void lustre_msg_add_flags(struct lustre_msg *msg, int flags) { @@ -844,6 +875,7 @@ void lustre_msg_add_flags(struct lustre_msg *msg, int flags) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_add_flags); void lustre_msg_set_flags(struct lustre_msg *msg, int flags) { @@ -858,6 +890,7 @@ void lustre_msg_set_flags(struct lustre_msg *msg, int flags) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_flags); void lustre_msg_clear_flags(struct lustre_msg *msg, int flags) { @@ -872,6 +905,7 @@ void lustre_msg_clear_flags(struct lustre_msg *msg, int flags) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_clear_flags); __u32 lustre_msg_get_op_flags(struct lustre_msg *msg) { @@ -888,6 +922,7 @@ __u32 lustre_msg_get_op_flags(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_op_flags); void lustre_msg_add_op_flags(struct lustre_msg *msg, int flags) { @@ -902,6 +937,7 @@ void lustre_msg_add_op_flags(struct lustre_msg *msg, int flags) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_add_op_flags); void lustre_msg_set_op_flags(struct lustre_msg *msg, int flags) { @@ -916,6 +952,7 @@ void lustre_msg_set_op_flags(struct lustre_msg *msg, int flags) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_op_flags); struct lustre_handle *lustre_msg_get_handle(struct lustre_msg *msg) { @@ -933,6 +970,7 @@ struct lustre_handle *lustre_msg_get_handle(struct lustre_msg *msg) return NULL; } } +EXPORT_SYMBOL(lustre_msg_get_handle); __u32 lustre_msg_get_type(struct lustre_msg *msg) { @@ -950,6 +988,7 @@ __u32 lustre_msg_get_type(struct lustre_msg *msg) return PTL_RPC_MSG_ERR; } } +EXPORT_SYMBOL(lustre_msg_get_type); __u32 lustre_msg_get_version(struct lustre_msg *msg) { @@ -967,6 +1006,7 @@ __u32 lustre_msg_get_version(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_version); void lustre_msg_add_version(struct lustre_msg *msg, int version) { @@ -981,6 +1021,7 @@ void lustre_msg_add_version(struct lustre_msg *msg, int version) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_add_version); __u32 lustre_msg_get_opc(struct lustre_msg *msg) { @@ -999,6 +1040,7 @@ __u32 lustre_msg_get_opc(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_opc); __u64 lustre_msg_get_last_xid(struct lustre_msg *msg) { @@ -1016,6 +1058,7 @@ __u64 lustre_msg_get_last_xid(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_last_xid); __u64 lustre_msg_get_last_committed(struct lustre_msg *msg) { @@ -1033,6 +1076,7 @@ __u64 lustre_msg_get_last_committed(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_last_committed); __u64 *lustre_msg_get_versions(struct lustre_msg *msg) { @@ -1052,6 +1096,7 @@ __u64 *lustre_msg_get_versions(struct lustre_msg *msg) return NULL; } } +EXPORT_SYMBOL(lustre_msg_get_versions); __u64 lustre_msg_get_transno(struct lustre_msg *msg) { @@ -1069,6 +1114,7 @@ __u64 lustre_msg_get_transno(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_transno); int lustre_msg_get_status(struct lustre_msg *msg) { @@ -1087,6 +1133,7 @@ int lustre_msg_get_status(struct lustre_msg *msg) return -EINVAL; } } +EXPORT_SYMBOL(lustre_msg_get_status); __u64 lustre_msg_get_slv(struct lustre_msg *msg) { @@ -1104,6 +1151,7 @@ __u64 lustre_msg_get_slv(struct lustre_msg *msg) return -EINVAL; } } +EXPORT_SYMBOL(lustre_msg_get_slv); void lustre_msg_set_slv(struct lustre_msg *msg, __u64 slv) @@ -1123,6 +1171,7 @@ void lustre_msg_set_slv(struct lustre_msg *msg, __u64 slv) return; } } +EXPORT_SYMBOL(lustre_msg_set_slv); __u32 lustre_msg_get_limit(struct lustre_msg *msg) { @@ -1140,6 +1189,7 @@ __u32 lustre_msg_get_limit(struct lustre_msg *msg) return -EINVAL; } } +EXPORT_SYMBOL(lustre_msg_get_limit); void lustre_msg_set_limit(struct lustre_msg *msg, __u64 limit) @@ -1159,6 +1209,7 @@ void lustre_msg_set_limit(struct lustre_msg *msg, __u64 limit) return; } } +EXPORT_SYMBOL(lustre_msg_set_limit); __u32 lustre_msg_get_conn_cnt(struct lustre_msg *msg) { @@ -1176,6 +1227,7 @@ __u32 lustre_msg_get_conn_cnt(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_conn_cnt); int lustre_msg_is_v1(struct lustre_msg *msg) { @@ -1187,6 +1239,7 @@ int lustre_msg_is_v1(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_is_v1); __u32 lustre_msg_get_magic(struct lustre_msg *msg) { @@ -1198,6 +1251,7 @@ __u32 lustre_msg_get_magic(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_magic); __u32 lustre_msg_get_timeout(struct lustre_msg *msg) { @@ -1241,6 +1295,28 @@ __u32 lustre_msg_get_service_time(struct lustre_msg *msg) } } +char *lustre_msg_get_jobid(struct lustre_msg *msg) +{ + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V1: + case LUSTRE_MSG_MAGIC_V1_SWABBED: + return NULL; + case LUSTRE_MSG_MAGIC_V2: { + struct ptlrpc_body *pb = + lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, + sizeof(struct ptlrpc_body)); + if (!pb) + return NULL; + + return pb->pb_jobid; + } + default: + CERROR("incorrect message magic: %08x\n", msg->lm_magic); + return NULL; + } +} +EXPORT_SYMBOL(lustre_msg_get_jobid); + __u32 lustre_msg_get_cksum(struct lustre_msg *msg) { switch (msg->lm_magic) { @@ -1252,7 +1328,7 @@ __u32 lustre_msg_get_cksum(struct lustre_msg *msg) } } -#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 0, 0) +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) /* * In 1.6 and 1.8 the checksum was computed only on struct ptlrpc_body as * it was in 1.6 (88 bytes, smaller than the full size in 1.8). It makes @@ -1267,24 +1343,33 @@ __u32 lustre_msg_calc_cksum(struct lustre_msg *msg, int compat18) __u32 lustre_msg_calc_cksum(struct lustre_msg *msg) #endif { - switch (msg->lm_magic) { - case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); -#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 9, 0, 0) - __u32 len = compat18 ? ptlrpc_body_cksum_size_compat18 : - lustre_msg_buflen(msg, MSG_PTLRPC_BODY_OFF); - LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); - return crc32_le(~(__u32)0, (unsigned char *)pb, len); + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V2: { + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) + __u32 crc; + unsigned int hsize = 4; + __u32 len = compat18 ? ptlrpc_body_cksum_size_compat18 : + lustre_msg_buflen(msg, MSG_PTLRPC_BODY_OFF); + LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); + cfs_crypto_hash_digest(CFS_HASH_ALG_CRC32, (unsigned char *)pb, + len, NULL, 0, (unsigned char *)&crc, + &hsize); + return crc; #else # warning "remove checksum compatibility support for b1_8" - return crc32_le(~(__u32)0, (unsigned char *)pb, - lustre_msg_buflen(msg, MSG_PTLRPC_BODY_OFF)); + __u32 crc; + unsigned int hsize = 4; + cfs_crypto_hash_digest(CFS_HASH_ALG_CRC32, (unsigned char *)pb, + lustre_msg_buflen(msg, MSG_PTLRPC_BODY_OFF), + NULL, 0, (unsigned char *)&crc, &hsize); + return crc; #endif - } - default: - CERROR("incorrect message magic: %08x\n", msg->lm_magic); - return 0; - } + } + default: + CERROR("incorrect message magic: %08x\n", msg->lm_magic); + return 0; + } } void lustre_msg_set_handle(struct lustre_msg *msg, struct lustre_handle *handle) @@ -1300,6 +1385,7 @@ void lustre_msg_set_handle(struct lustre_msg *msg, struct lustre_handle *handle) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_handle); void lustre_msg_set_type(struct lustre_msg *msg, __u32 type) { @@ -1314,6 +1400,7 @@ void lustre_msg_set_type(struct lustre_msg *msg, __u32 type) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_type); void lustre_msg_set_opc(struct lustre_msg *msg, __u32 opc) { @@ -1328,6 +1415,7 @@ void lustre_msg_set_opc(struct lustre_msg *msg, __u32 opc) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_opc); void lustre_msg_set_last_xid(struct lustre_msg *msg, __u64 last_xid) { @@ -1342,6 +1430,7 @@ void lustre_msg_set_last_xid(struct lustre_msg *msg, __u64 last_xid) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_last_xid); void lustre_msg_set_last_committed(struct lustre_msg *msg, __u64 last_committed) { @@ -1356,6 +1445,7 @@ void lustre_msg_set_last_committed(struct lustre_msg *msg, __u64 last_committed) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_last_committed); void lustre_msg_set_versions(struct lustre_msg *msg, __u64 *versions) { @@ -1375,6 +1465,7 @@ void lustre_msg_set_versions(struct lustre_msg *msg, __u64 *versions) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_versions); void lustre_msg_set_transno(struct lustre_msg *msg, __u64 transno) { @@ -1389,6 +1480,7 @@ void lustre_msg_set_transno(struct lustre_msg *msg, __u64 transno) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_transno); void lustre_msg_set_status(struct lustre_msg *msg, __u32 status) { @@ -1403,6 +1495,7 @@ void lustre_msg_set_status(struct lustre_msg *msg, __u32 status) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_status); void lustre_msg_set_conn_cnt(struct lustre_msg *msg, __u32 conn_cnt) { @@ -1417,6 +1510,7 @@ void lustre_msg_set_conn_cnt(struct lustre_msg *msg, __u32 conn_cnt) LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); } } +EXPORT_SYMBOL(lustre_msg_set_conn_cnt); void lustre_msg_set_timeout(struct lustre_msg *msg, __u32 timeout) { @@ -1450,6 +1544,37 @@ void lustre_msg_set_service_time(struct lustre_msg *msg, __u32 service_time) } } +void lustre_msg_set_jobid(struct lustre_msg *msg, char *jobid) +{ + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V1: + return; + case LUSTRE_MSG_MAGIC_V2: { + __u32 opc = lustre_msg_get_opc(msg); + struct ptlrpc_body *pb; + + /* Don't set jobid for ldlm ast RPCs, they've been shrinked. + * See the comment in ptlrpc_request_pack(). */ + if (!opc || opc == LDLM_BL_CALLBACK || + opc == LDLM_CP_CALLBACK || opc == LDLM_GL_CALLBACK) + return; + + pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, + sizeof(struct ptlrpc_body)); + LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); + + if (jobid != NULL) + memcpy(pb->pb_jobid, jobid, JOBSTATS_JOBID_SIZE); + else if (pb->pb_jobid[0] == '\0') + lustre_get_jobid(pb->pb_jobid); + return; + } + default: + LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); + } +} +EXPORT_SYMBOL(lustre_msg_set_jobid); + void lustre_msg_set_cksum(struct lustre_msg *msg, __u32 cksum) { switch (msg->lm_magic) { @@ -1473,6 +1598,7 @@ void ptlrpc_request_set_replen(struct ptlrpc_request *req) if (req->rq_reqmsg->lm_magic == LUSTRE_MSG_MAGIC_V2) req->rq_reqmsg->lm_repsize = req->rq_replen; } +EXPORT_SYMBOL(ptlrpc_request_set_replen); void ptlrpc_req_set_repsize(struct ptlrpc_request *req, int count, __u32 *lens) { @@ -1480,6 +1606,7 @@ void ptlrpc_req_set_repsize(struct ptlrpc_request *req, int count, __u32 *lens) if (req->rq_reqmsg->lm_magic == LUSTRE_MSG_MAGIC_V2) req->rq_reqmsg->lm_repsize = req->rq_replen; } +EXPORT_SYMBOL(ptlrpc_req_set_repsize); /** * Send a remote set_info_async. @@ -1555,7 +1682,14 @@ void lustre_swab_ptlrpc_body(struct ptlrpc_body *b) __swab64s (&b->pb_pre_versions[2]); __swab64s (&b->pb_pre_versions[3]); CLASSERT(offsetof(typeof(*b), pb_padding) != 0); + /* While we need to maintain compatibility between + * clients and servers without ptlrpc_body_v2 (< 2.3) + * do not swab any fields beyond pb_jobid, as we are + * using this swab function for both ptlrpc_body + * and ptlrpc_body_v2. */ + CLASSERT(offsetof(typeof(*b), pb_jobid) != 0); } +EXPORT_SYMBOL(lustre_swab_ptlrpc_body); void lustre_swab_connect(struct obd_connect_data *ocd) { @@ -1565,20 +1699,43 @@ void lustre_swab_connect(struct obd_connect_data *ocd) __swab64s(&ocd->ocd_ibits_known); __swab32s(&ocd->ocd_index); __swab32s(&ocd->ocd_brw_size); - __swab32s(&ocd->ocd_nllu); - __swab32s(&ocd->ocd_nllg); + /* ocd_blocksize and ocd_inodespace don't need to be swabbed because + * they are 8-byte values */ + __swab16s(&ocd->ocd_grant_extent); + __swab32s(&ocd->ocd_unused); __swab64s(&ocd->ocd_transno); __swab32s(&ocd->ocd_group); __swab32s(&ocd->ocd_cksum_types); + __swab32s(&ocd->ocd_instance); + /* Fields after ocd_cksum_types are only accessible by the receiver + * if the corresponding flag in ocd_connect_flags is set. Accessing + * any field after ocd_maxbytes on the receiver without a valid flag + * may result in out-of-bound memory access and kernel oops. */ + if (ocd->ocd_connect_flags & OBD_CONNECT_MAX_EASIZE) + __swab32s(&ocd->ocd_max_easize); + if (ocd->ocd_connect_flags & OBD_CONNECT_MAXBYTES) + __swab64s(&ocd->ocd_maxbytes); CLASSERT(offsetof(typeof(*ocd), padding1) != 0); CLASSERT(offsetof(typeof(*ocd), padding2) != 0); + CLASSERT(offsetof(typeof(*ocd), padding3) != 0); + CLASSERT(offsetof(typeof(*ocd), padding4) != 0); + CLASSERT(offsetof(typeof(*ocd), padding5) != 0); + CLASSERT(offsetof(typeof(*ocd), padding6) != 0); + CLASSERT(offsetof(typeof(*ocd), padding7) != 0); + CLASSERT(offsetof(typeof(*ocd), padding8) != 0); + CLASSERT(offsetof(typeof(*ocd), padding9) != 0); + CLASSERT(offsetof(typeof(*ocd), paddingA) != 0); + CLASSERT(offsetof(typeof(*ocd), paddingB) != 0); + CLASSERT(offsetof(typeof(*ocd), paddingC) != 0); + CLASSERT(offsetof(typeof(*ocd), paddingD) != 0); + CLASSERT(offsetof(typeof(*ocd), paddingE) != 0); + CLASSERT(offsetof(typeof(*ocd), paddingF) != 0); } void lustre_swab_obdo (struct obdo *o) { __swab64s (&o->o_valid); - __swab64s (&o->o_id); - __swab64s (&o->o_seq); + lustre_swab_ost_id(&o->o_oi); __swab64s (&o->o_parent_seq); __swab64s (&o->o_size); __swab64s (&o->o_mtime); @@ -1601,12 +1758,13 @@ void lustre_swab_obdo (struct obdo *o) /* o_lcookie is swabbed elsewhere */ __swab32s (&o->o_uid_h); __swab32s (&o->o_gid_h); - CLASSERT(offsetof(typeof(*o), o_padding_3) != 0); + __swab64s (&o->o_data_version); CLASSERT(offsetof(typeof(*o), o_padding_4) != 0); CLASSERT(offsetof(typeof(*o), o_padding_5) != 0); CLASSERT(offsetof(typeof(*o), o_padding_6) != 0); } +EXPORT_SYMBOL(lustre_swab_obdo); void lustre_swab_obd_statfs (struct obd_statfs *os) { @@ -1621,7 +1779,7 @@ void lustre_swab_obd_statfs (struct obd_statfs *os) __swab32s (&os->os_namelen); __swab64s (&os->os_maxbytes); __swab32s (&os->os_state); - CLASSERT(offsetof(typeof(*os), os_spare1) != 0); + CLASSERT(offsetof(typeof(*os), os_fprecreated) != 0); CLASSERT(offsetof(typeof(*os), os_spare2) != 0); CLASSERT(offsetof(typeof(*os), os_spare3) != 0); CLASSERT(offsetof(typeof(*os), os_spare4) != 0); @@ -1631,115 +1789,120 @@ void lustre_swab_obd_statfs (struct obd_statfs *os) CLASSERT(offsetof(typeof(*os), os_spare8) != 0); CLASSERT(offsetof(typeof(*os), os_spare9) != 0); } +EXPORT_SYMBOL(lustre_swab_obd_statfs); -void lustre_swab_obd_ioobj (struct obd_ioobj *ioo) +void lustre_swab_obd_ioobj(struct obd_ioobj *ioo) { - __swab64s (&ioo->ioo_id); - __swab64s (&ioo->ioo_seq); - __swab32s (&ioo->ioo_type); - __swab32s (&ioo->ioo_bufcnt); + lustre_swab_ost_id(&ioo->ioo_oid); + __swab32s(&ioo->ioo_max_brw); + __swab32s(&ioo->ioo_bufcnt); } +EXPORT_SYMBOL(lustre_swab_obd_ioobj); -void lustre_swab_niobuf_remote (struct niobuf_remote *nbr) +void lustre_swab_niobuf_remote(struct niobuf_remote *nbr) { - __swab64s (&nbr->offset); - __swab32s (&nbr->len); - __swab32s (&nbr->flags); + __swab64s(&nbr->rnb_offset); + __swab32s(&nbr->rnb_len); + __swab32s(&nbr->rnb_flags); } +EXPORT_SYMBOL(lustre_swab_niobuf_remote); void lustre_swab_ost_body (struct ost_body *b) { lustre_swab_obdo (&b->oa); } +EXPORT_SYMBOL(lustre_swab_ost_body); void lustre_swab_ost_last_id(obd_id *id) { __swab64s(id); } +EXPORT_SYMBOL(lustre_swab_ost_last_id); void lustre_swab_generic_32s(__u32 *val) { __swab32s(val); } +EXPORT_SYMBOL(lustre_swab_generic_32s); -void lustre_swab_ost_lvb(struct ost_lvb *lvb) +void lustre_swab_gl_desc(union ldlm_gl_desc *desc) { - __swab64s(&lvb->lvb_size); - __swab64s(&lvb->lvb_mtime); - __swab64s(&lvb->lvb_atime); - __swab64s(&lvb->lvb_ctime); - __swab64s(&lvb->lvb_blocks); + lustre_swab_lu_fid(&desc->lquota_desc.gl_id.qid_fid); + __swab64s(&desc->lquota_desc.gl_flags); + __swab64s(&desc->lquota_desc.gl_ver); + __swab64s(&desc->lquota_desc.gl_hardlimit); + __swab64s(&desc->lquota_desc.gl_softlimit); + __swab64s(&desc->lquota_desc.gl_time); + CLASSERT(offsetof(typeof(desc->lquota_desc), gl_pad2) != 0); } -void lustre_swab_mds_status_req (struct mds_status_req *r) +void lustre_swab_ost_lvb_v1(struct ost_lvb_v1 *lvb) { - __swab32s (&r->flags); - __swab32s (&r->repbuf); + __swab64s(&lvb->lvb_size); + __swab64s(&lvb->lvb_mtime); + __swab64s(&lvb->lvb_atime); + __swab64s(&lvb->lvb_ctime); + __swab64s(&lvb->lvb_blocks); } +EXPORT_SYMBOL(lustre_swab_ost_lvb_v1); -void lustre_swab_mds_body (struct mds_body *b) +void lustre_swab_ost_lvb(struct ost_lvb *lvb) { - lustre_swab_ll_fid (&b->fid1); - lustre_swab_ll_fid (&b->fid2); - /* handle is opaque */ - __swab64s (&b->valid); - __swab64s (&b->size); - __swab64s (&b->mtime); - __swab64s (&b->atime); - __swab64s (&b->ctime); - __swab64s (&b->blocks); - __swab64s (&b->io_epoch); - __swab64s (&b->ino); - __swab32s (&b->fsuid); - __swab32s (&b->fsgid); - __swab32s (&b->capability); - __swab32s (&b->mode); - __swab32s (&b->uid); - __swab32s (&b->gid); - __swab32s (&b->flags); - __swab32s (&b->rdev); - __swab32s (&b->nlink); - __swab32s (&b->generation); - __swab32s (&b->suppgid); - __swab32s (&b->eadatasize); - __swab32s (&b->aclsize); - __swab32s (&b->max_mdsize); - __swab32s (&b->max_cookiesize); - CLASSERT(offsetof(typeof(*b), padding_4) != 0); + __swab64s(&lvb->lvb_size); + __swab64s(&lvb->lvb_mtime); + __swab64s(&lvb->lvb_atime); + __swab64s(&lvb->lvb_ctime); + __swab64s(&lvb->lvb_blocks); + __swab32s(&lvb->lvb_mtime_ns); + __swab32s(&lvb->lvb_atime_ns); + __swab32s(&lvb->lvb_ctime_ns); + __swab32s(&lvb->lvb_padding); } +EXPORT_SYMBOL(lustre_swab_ost_lvb); -void lustre_swab_mdt_body (struct mdt_body *b) +void lustre_swab_lquota_lvb(struct lquota_lvb *lvb) { - lustre_swab_lu_fid (&b->fid1); - lustre_swab_lu_fid (&b->fid2); - /* handle is opaque */ - __swab64s (&b->valid); - __swab64s (&b->size); - __swab64s (&b->mtime); - __swab64s (&b->atime); - __swab64s (&b->ctime); - __swab64s (&b->blocks); - __swab64s (&b->ioepoch); - __swab64s (&b->ino); - __swab32s (&b->fsuid); - __swab32s (&b->fsgid); - __swab32s (&b->capability); - __swab32s (&b->mode); - __swab32s (&b->uid); - __swab32s (&b->gid); - __swab32s (&b->flags); - __swab32s (&b->rdev); - __swab32s (&b->nlink); - __swab32s (&b->generation); - __swab32s (&b->suppgid); - __swab32s (&b->eadatasize); - __swab32s (&b->aclsize); - __swab32s (&b->max_mdsize); - __swab32s (&b->max_cookiesize); - __swab32s (&b->uid_h); - __swab32s (&b->gid_h); - CLASSERT(offsetof(typeof(*b), padding_5) != 0); + __swab64s(&lvb->lvb_flags); + __swab64s(&lvb->lvb_id_may_rel); + __swab64s(&lvb->lvb_id_rel); + __swab64s(&lvb->lvb_id_qunit); + __swab64s(&lvb->lvb_pad1); } +EXPORT_SYMBOL(lustre_swab_lquota_lvb); + +void lustre_swab_mdt_body (struct mdt_body *b) +{ + lustre_swab_lu_fid(&b->mbo_fid1); + lustre_swab_lu_fid(&b->mbo_fid2); + /* handle is opaque */ + __swab64s(&b->mbo_valid); + __swab64s(&b->mbo_size); + __swab64s(&b->mbo_mtime); + __swab64s(&b->mbo_atime); + __swab64s(&b->mbo_ctime); + __swab64s(&b->mbo_blocks); + __swab64s(&b->mbo_ioepoch); + __swab64s(&b->mbo_t_state); + __swab32s(&b->mbo_fsuid); + __swab32s(&b->mbo_fsgid); + __swab32s(&b->mbo_capability); + __swab32s(&b->mbo_mode); + __swab32s(&b->mbo_uid); + __swab32s(&b->mbo_gid); + __swab32s(&b->mbo_flags); + __swab32s(&b->mbo_rdev); + __swab32s(&b->mbo_nlink); + CLASSERT(offsetof(typeof(*b), mbo_unused2) != 0); + __swab32s(&b->mbo_suppgid); + __swab32s(&b->mbo_eadatasize); + __swab32s(&b->mbo_aclsize); + __swab32s(&b->mbo_max_mdsize); + __swab32s(&b->mbo_max_cookiesize); + __swab32s(&b->mbo_uid_h); + __swab32s(&b->mbo_gid_h); + CLASSERT(offsetof(typeof(*b), mbo_padding_5) != 0); +} +EXPORT_SYMBOL(lustre_swab_mdt_body); void lustre_swab_mdt_ioepoch (struct mdt_ioepoch *b) { @@ -1748,6 +1911,7 @@ void lustre_swab_mdt_ioepoch (struct mdt_ioepoch *b) __swab32s (&b->flags); CLASSERT(offsetof(typeof(*b), padding) != 0); } +EXPORT_SYMBOL(lustre_swab_mdt_ioepoch); void lustre_swab_mgs_target_info(struct mgs_target_info *mti) { @@ -1756,11 +1920,51 @@ void lustre_swab_mgs_target_info(struct mgs_target_info *mti) __swab32s(&mti->mti_stripe_index); __swab32s(&mti->mti_config_ver); __swab32s(&mti->mti_flags); + __swab32s(&mti->mti_instance); __swab32s(&mti->mti_nid_count); CLASSERT(sizeof(lnet_nid_t) == sizeof(__u64)); for (i = 0; i < MTI_NIDS_MAX; i++) __swab64s(&mti->mti_nids[i]); } +EXPORT_SYMBOL(lustre_swab_mgs_target_info); + +void lustre_swab_mgs_nidtbl_entry(struct mgs_nidtbl_entry *entry) +{ + int i; + + __swab64s(&entry->mne_version); + __swab32s(&entry->mne_instance); + __swab32s(&entry->mne_index); + __swab32s(&entry->mne_length); + + /* mne_nid_(count|type) must be one byte size because we're gonna + * access it w/o swapping. */ + CLASSERT(sizeof(entry->mne_nid_count) == sizeof(__u8)); + CLASSERT(sizeof(entry->mne_nid_type) == sizeof(__u8)); + + /* remove this assertion if ipv6 is supported. */ + LASSERT(entry->mne_nid_type == 0); + for (i = 0; i < entry->mne_nid_count; i++) { + CLASSERT(sizeof(lnet_nid_t) == sizeof(__u64)); + __swab64s(&entry->u.nids[i]); + } +} +EXPORT_SYMBOL(lustre_swab_mgs_nidtbl_entry); + +void lustre_swab_mgs_config_body(struct mgs_config_body *body) +{ + __swab64s(&body->mcb_offset); + __swab32s(&body->mcb_units); + __swab16s(&body->mcb_type); +} +EXPORT_SYMBOL(lustre_swab_mgs_config_body); + +void lustre_swab_mgs_config_res(struct mgs_config_res *body) +{ + __swab64s(&body->mcr_offset); + __swab64s(&body->mcr_size); +} +EXPORT_SYMBOL(lustre_swab_mgs_config_res); static void lustre_swab_obd_dqinfo (struct obd_dqinfo *i) { @@ -1781,7 +1985,7 @@ static void lustre_swab_obd_dqblk (struct obd_dqblk *b) __swab64s (&b->dqb_btime); __swab64s (&b->dqb_itime); __swab32s (&b->dqb_valid); - CLASSERT(offsetof(typeof(*b), padding) != 0); + CLASSERT(offsetof(typeof(*b), dqb_padding) != 0); } void lustre_swab_obd_quotactl (struct obd_quotactl *q) @@ -1793,24 +1997,7 @@ void lustre_swab_obd_quotactl (struct obd_quotactl *q) lustre_swab_obd_dqinfo (&q->qc_dqinfo); lustre_swab_obd_dqblk (&q->qc_dqblk); } - -void lustre_swab_quota_adjust_qunit (struct quota_adjust_qunit *q) -{ - __swab32s (&q->qaq_flags); - __swab32s (&q->qaq_id); - __swab64s (&q->qaq_bunit_sz); - __swab64s (&q->qaq_iunit_sz); - __swab64s (&q->padding1); -} - -void lustre_swab_mds_remote_perm (struct mds_remote_perm *p) -{ - __swab32s (&p->rp_uid); - __swab32s (&p->rp_gid); - __swab32s (&p->rp_fsuid); - __swab32s (&p->rp_fsgid); - __swab32s (&p->rp_access_perm); -}; +EXPORT_SYMBOL(lustre_swab_obd_quotactl); void lustre_swab_mdt_remote_perm (struct mdt_remote_perm *p) { @@ -1821,7 +2008,9 @@ void lustre_swab_mdt_remote_perm (struct mdt_remote_perm *p) __swab32s (&p->rp_fsgid); __swab32s (&p->rp_fsgid_h); __swab32s (&p->rp_access_perm); + __swab32s (&p->rp_padding); }; +EXPORT_SYMBOL(lustre_swab_mdt_remote_perm); void lustre_swab_fid2path(struct getinfo_fid2path *gf) { @@ -1855,34 +2044,59 @@ void lustre_swab_fiemap(struct ll_user_fiemap *fiemap) for (i = 0; i < fiemap->fm_mapped_extents; i++) lustre_swab_fiemap_extent(&fiemap->fm_extents[i]); } +EXPORT_SYMBOL(lustre_swab_fiemap); + +void lustre_swab_idx_info(struct idx_info *ii) +{ + __swab32s(&ii->ii_magic); + __swab32s(&ii->ii_flags); + __swab16s(&ii->ii_count); + __swab32s(&ii->ii_attrs); + lustre_swab_lu_fid(&ii->ii_fid); + __swab64s(&ii->ii_version); + __swab64s(&ii->ii_hash_start); + __swab64s(&ii->ii_hash_end); + __swab16s(&ii->ii_keysize); + __swab16s(&ii->ii_recsize); +} + +void lustre_swab_lip_header(struct lu_idxpage *lip) +{ + /* swab header */ + __swab32s(&lip->lip_magic); + __swab16s(&lip->lip_flags); + __swab16s(&lip->lip_nr); +} +EXPORT_SYMBOL(lustre_swab_lip_header); void lustre_swab_mdt_rec_reint (struct mdt_rec_reint *rr) { - __swab32s (&rr->rr_opcode); - __swab32s (&rr->rr_cap); - __swab32s (&rr->rr_fsuid); - /* rr_fsuid_h is unused */ - __swab32s (&rr->rr_fsgid); - /* rr_fsgid_h is unused */ - __swab32s (&rr->rr_suppgid1); - /* rr_suppgid1_h is unused */ - __swab32s (&rr->rr_suppgid2); - /* rr_suppgid2_h is unused */ - lustre_swab_lu_fid (&rr->rr_fid1); - lustre_swab_lu_fid (&rr->rr_fid2); - __swab64s (&rr->rr_mtime); - __swab64s (&rr->rr_atime); - __swab64s (&rr->rr_ctime); - __swab64s (&rr->rr_size); - __swab64s (&rr->rr_blocks); - __swab32s (&rr->rr_bias); - __swab32s (&rr->rr_mode); - __swab32s (&rr->rr_flags); - - CLASSERT(offsetof(typeof(*rr), rr_padding_2) != 0); - CLASSERT(offsetof(typeof(*rr), rr_padding_3) != 0); - CLASSERT(offsetof(typeof(*rr), rr_padding_4) != 0); + __swab32s(&rr->rr_opcode); + __swab32s(&rr->rr_cap); + __swab32s(&rr->rr_fsuid); + /* rr_fsuid_h is unused */ + __swab32s(&rr->rr_fsgid); + /* rr_fsgid_h is unused */ + __swab32s(&rr->rr_suppgid1); + /* rr_suppgid1_h is unused */ + __swab32s(&rr->rr_suppgid2); + /* rr_suppgid2_h is unused */ + lustre_swab_lu_fid(&rr->rr_fid1); + lustre_swab_lu_fid(&rr->rr_fid2); + __swab64s(&rr->rr_mtime); + __swab64s(&rr->rr_atime); + __swab64s(&rr->rr_ctime); + __swab64s(&rr->rr_size); + __swab64s(&rr->rr_blocks); + __swab32s(&rr->rr_bias); + __swab32s(&rr->rr_mode); + __swab32s(&rr->rr_flags); + __swab32s(&rr->rr_flags_h); + __swab32s(&rr->rr_umask); + + CLASSERT(offsetof(typeof(*rr), rr_padding_4) != 0); }; +EXPORT_SYMBOL(lustre_swab_mdt_rec_reint); void lustre_swab_lov_desc (struct lov_desc *ld) { @@ -1895,6 +2109,7 @@ void lustre_swab_lov_desc (struct lov_desc *ld) __swab32s (&ld->ld_qos_maxage); /* uuid endian insensitive */ } +EXPORT_SYMBOL(lustre_swab_lov_desc); void lustre_swab_lmv_desc (struct lmv_desc *ld) { @@ -1907,39 +2122,73 @@ void lustre_swab_lmv_desc (struct lmv_desc *ld) /* uuid endian insensitive */ } -void lustre_swab_lmv_stripe_md (struct lmv_stripe_md *mea) +/* This structure is always in little-endian */ +static void lustre_swab_lmv_mds_md_v1(struct lmv_mds_md_v1 *lmm1) { - __swab32s(&mea->mea_magic); - __swab32s(&mea->mea_count); - __swab32s(&mea->mea_master); - CLASSERT(offsetof(typeof(*mea), mea_padding) != 0); + int i; + + __swab32s(&lmm1->lmv_magic); + __swab32s(&lmm1->lmv_stripe_count); + __swab32s(&lmm1->lmv_master_mdt_index); + __swab32s(&lmm1->lmv_hash_type); + __swab32s(&lmm1->lmv_layout_version); + for (i = 0; i < lmm1->lmv_stripe_count; i++) + lustre_swab_lu_fid(&lmm1->lmv_stripe_fids[i]); } +void lustre_swab_lmv_mds_md(union lmv_mds_md *lmm) +{ + switch (lmm->lmv_magic) { + case LMV_MAGIC_V1: + lustre_swab_lmv_mds_md_v1(&lmm->lmv_md_v1); + break; + default: + break; + } +} +EXPORT_SYMBOL(lustre_swab_lmv_mds_md); + +void lustre_swab_lmv_user_md(struct lmv_user_md *lum) +{ + __swab32s(&lum->lum_magic); + __swab32s(&lum->lum_stripe_count); + __swab32s(&lum->lum_stripe_offset); + __swab32s(&lum->lum_hash_type); + __swab32s(&lum->lum_type); + CLASSERT(offsetof(typeof(*lum), lum_padding1) != 0); +} +EXPORT_SYMBOL(lustre_swab_lmv_user_md); static void print_lum (struct lov_user_md *lum) { - CDEBUG(D_OTHER, "lov_user_md %p:\n", lum); - CDEBUG(D_OTHER, "\tlmm_magic: %#x\n", lum->lmm_magic); - CDEBUG(D_OTHER, "\tlmm_pattern: %#x\n", lum->lmm_pattern); - CDEBUG(D_OTHER, "\tlmm_object_id: "LPU64"\n", lum->lmm_object_id); - CDEBUG(D_OTHER, "\tlmm_object_gr: "LPU64"\n", lum->lmm_object_seq); - CDEBUG(D_OTHER, "\tlmm_stripe_size: %#x\n", lum->lmm_stripe_size); - CDEBUG(D_OTHER, "\tlmm_stripe_count: %#x\n", lum->lmm_stripe_count); - CDEBUG(D_OTHER, "\tlmm_stripe_offset: %#x\n", lum->lmm_stripe_offset); + CDEBUG(D_OTHER, "lov_user_md %p:\n", lum); + CDEBUG(D_OTHER, "\tlmm_magic: %#x\n", lum->lmm_magic); + CDEBUG(D_OTHER, "\tlmm_pattern: %#x\n", lum->lmm_pattern); + CDEBUG(D_OTHER, "\tlmm_object_id: "LPU64"\n", lmm_oi_id(&lum->lmm_oi)); + CDEBUG(D_OTHER, "\tlmm_object_gr: "LPU64"\n", lmm_oi_seq(&lum->lmm_oi)); + CDEBUG(D_OTHER, "\tlmm_stripe_size: %#x\n", lum->lmm_stripe_size); + CDEBUG(D_OTHER, "\tlmm_stripe_count: %#x\n", lum->lmm_stripe_count); + CDEBUG(D_OTHER, "\tlmm_stripe_offset/lmm_layout_gen: %#x\n", + lum->lmm_stripe_offset); +} + +static void lustre_swab_lmm_oi(struct ost_id *oi) +{ + __swab64s(&oi->oi.oi_id); + __swab64s(&oi->oi.oi_seq); } static void lustre_swab_lov_user_md_common(struct lov_user_md_v1 *lum) { - ENTRY; - __swab32s(&lum->lmm_magic); - __swab32s(&lum->lmm_pattern); - __swab64s(&lum->lmm_object_id); - __swab64s(&lum->lmm_object_seq); - __swab32s(&lum->lmm_stripe_size); - __swab16s(&lum->lmm_stripe_count); - __swab16s(&lum->lmm_stripe_offset); - print_lum(lum); - EXIT; + ENTRY; + __swab32s(&lum->lmm_magic); + __swab32s(&lum->lmm_pattern); + lustre_swab_lmm_oi(&lum->lmm_oi); + __swab32s(&lum->lmm_stripe_size); + __swab16s(&lum->lmm_stripe_count); + __swab16s(&lum->lmm_stripe_offset); + print_lum(lum); + EXIT; } void lustre_swab_lov_user_md_v1(struct lov_user_md_v1 *lum) @@ -1949,6 +2198,7 @@ void lustre_swab_lov_user_md_v1(struct lov_user_md_v1 *lum) lustre_swab_lov_user_md_common(lum); EXIT; } +EXPORT_SYMBOL(lustre_swab_lov_user_md_v1); void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum) { @@ -1958,19 +2208,21 @@ void lustre_swab_lov_user_md_v3(struct lov_user_md_v3 *lum) /* lmm_pool_name nothing to do with char */ EXIT; } +EXPORT_SYMBOL(lustre_swab_lov_user_md_v3); void lustre_swab_lov_mds_md(struct lov_mds_md *lmm) { - ENTRY; - CDEBUG(D_IOCTL, "swabbing lov_mds_md\n"); - __swab32s(&lmm->lmm_magic); - __swab32s(&lmm->lmm_pattern); - __swab64s(&lmm->lmm_object_id); - __swab64s(&lmm->lmm_object_seq); - __swab32s(&lmm->lmm_stripe_size); - __swab32s(&lmm->lmm_stripe_count); - EXIT; + ENTRY; + CDEBUG(D_IOCTL, "swabbing lov_mds_md\n"); + __swab32s(&lmm->lmm_magic); + __swab32s(&lmm->lmm_pattern); + lustre_swab_lmm_oi(&lmm->lmm_oi); + __swab32s(&lmm->lmm_stripe_size); + __swab16s(&lmm->lmm_stripe_count); + __swab16s(&lmm->lmm_layout_gen); + EXIT; } +EXPORT_SYMBOL(lustre_swab_lov_mds_md); void lustre_swab_lov_user_md_objects(struct lov_user_ost_data *lod, int stripe_count) @@ -1978,14 +2230,13 @@ void lustre_swab_lov_user_md_objects(struct lov_user_ost_data *lod, int i; ENTRY; for (i = 0; i < stripe_count; i++) { - __swab64s(&(lod[i].l_object_id)); - __swab64s(&(lod[i].l_object_seq)); + lustre_swab_ost_id(&(lod[i].l_ost_oi)); __swab32s(&(lod[i].l_ost_gen)); __swab32s(&(lod[i].l_ost_idx)); } EXIT; } - +EXPORT_SYMBOL(lustre_swab_lov_user_md_objects); void lustre_swab_ldlm_res_id (struct ldlm_res_id *id) { @@ -1994,8 +2245,9 @@ void lustre_swab_ldlm_res_id (struct ldlm_res_id *id) for (i = 0; i < RES_NAME_SIZE; i++) __swab64s (&id->name[i]); } +EXPORT_SYMBOL(lustre_swab_ldlm_res_id); -void lustre_swab_ldlm_policy_data (ldlm_policy_data_t *d) +void lustre_swab_ldlm_policy_data (ldlm_wire_policy_data_t *d) { /* the lock data is a union and the first two fields are always an * extent so it's ok to process an LDLM_EXTENT and LDLM_FLOCK lock @@ -2003,13 +2255,16 @@ void lustre_swab_ldlm_policy_data (ldlm_policy_data_t *d) __swab64s(&d->l_extent.start); __swab64s(&d->l_extent.end); __swab64s(&d->l_extent.gid); - __swab32s(&d->l_flock.pid); + __swab64s(&d->l_flock.lfw_owner); + __swab32s(&d->l_flock.lfw_pid); } +EXPORT_SYMBOL(lustre_swab_ldlm_policy_data); void lustre_swab_ldlm_intent (struct ldlm_intent *i) { __swab64s (&i->opc); } +EXPORT_SYMBOL(lustre_swab_ldlm_intent); void lustre_swab_ldlm_resource_desc (struct ldlm_resource_desc *r) { @@ -2017,6 +2272,7 @@ void lustre_swab_ldlm_resource_desc (struct ldlm_resource_desc *r) CLASSERT(offsetof(typeof(*r), lr_padding) != 0); lustre_swab_ldlm_res_id (&r->lr_name); } +EXPORT_SYMBOL(lustre_swab_ldlm_resource_desc); void lustre_swab_ldlm_lock_desc (struct ldlm_lock_desc *l) { @@ -2025,6 +2281,7 @@ void lustre_swab_ldlm_lock_desc (struct ldlm_lock_desc *l) __swab32s (&l->l_granted_mode); lustre_swab_ldlm_policy_data (&l->l_policy_data); } +EXPORT_SYMBOL(lustre_swab_ldlm_lock_desc); void lustre_swab_ldlm_request (struct ldlm_request *rq) { @@ -2033,6 +2290,7 @@ void lustre_swab_ldlm_request (struct ldlm_request *rq) __swab32s (&rq->lock_count); /* lock_handle[] opaque */ } +EXPORT_SYMBOL(lustre_swab_ldlm_request); void lustre_swab_ldlm_reply (struct ldlm_reply *r) { @@ -2043,53 +2301,45 @@ void lustre_swab_ldlm_reply (struct ldlm_reply *r) __swab64s (&r->lock_policy_res1); __swab64s (&r->lock_policy_res2); } +EXPORT_SYMBOL(lustre_swab_ldlm_reply); -/* no one calls this */ -int llog_log_swabbed(struct llog_log_hdr *hdr) +void lustre_swab_quota_body(struct quota_body *b) { - if (hdr->llh_hdr.lrh_type == __swab32(LLOG_HDR_MAGIC)) - return 1; - if (hdr->llh_hdr.lrh_type == LLOG_HDR_MAGIC) - return 0; - return -1; -} - -void lustre_swab_qdata(struct qunit_data *d) -{ - __swab32s (&d->qd_id); - __swab32s (&d->qd_flags); - __swab64s (&d->qd_count); - __swab64s (&d->qd_qunit); - CLASSERT(offsetof(typeof(*d), padding) != 0); + lustre_swab_lu_fid(&b->qb_fid); + lustre_swab_lu_fid((struct lu_fid *)&b->qb_id); + __swab32s(&b->qb_flags); + __swab64s(&b->qb_count); + __swab64s(&b->qb_usage); + __swab64s(&b->qb_slv_ver); } /* Dump functions */ void dump_ioo(struct obd_ioobj *ioo) { - CDEBUG(D_RPCTRACE, - "obd_ioobj: ioo_id="LPD64", ioo_seq="LPD64", ioo_type=%d, " - "ioo_bufct=%d\n", ioo->ioo_id, ioo->ioo_seq, ioo->ioo_type, - ioo->ioo_bufcnt); + CDEBUG(D_RPCTRACE, + "obd_ioobj: ioo_oid="DOSTID", ioo_max_brw=%#x, " + "ioo_bufct=%d\n", POSTID(&ioo->ioo_oid), ioo->ioo_max_brw, + ioo->ioo_bufcnt); } +EXPORT_SYMBOL(dump_ioo); void dump_rniobuf(struct niobuf_remote *nb) { - CDEBUG(D_RPCTRACE, "niobuf_remote: offset="LPU64", len=%d, flags=%x\n", - nb->offset, nb->len, nb->flags); + CDEBUG(D_RPCTRACE, "niobuf_remote: offset="LPU64", len=%d, flags=%x\n", + nb->rnb_offset, nb->rnb_len, nb->rnb_flags); } +EXPORT_SYMBOL(dump_rniobuf); void dump_obdo(struct obdo *oa) { - __u32 valid = oa->o_valid; + __u32 valid = oa->o_valid; - CDEBUG(D_RPCTRACE, "obdo: o_valid = %08x\n", valid); - if (valid & OBD_MD_FLID) - CDEBUG(D_RPCTRACE, "obdo: o_id = "LPD64"\n", oa->o_id); - if (valid & OBD_MD_FLGROUP) - CDEBUG(D_RPCTRACE, "obdo: o_seq = "LPD64"\n", oa->o_seq); - if (valid & OBD_MD_FLFID) - CDEBUG(D_RPCTRACE, "obdo: o_parent_seq = "LPX64"\n", - oa->o_parent_seq); + CDEBUG(D_RPCTRACE, "obdo: o_valid = %08x\n", valid); + if (valid & OBD_MD_FLID) + CDEBUG(D_RPCTRACE, "obdo: id = "DOSTID"\n", POSTID(&oa->o_oi)); + if (valid & OBD_MD_FLFID) + CDEBUG(D_RPCTRACE, "obdo: o_parent_seq = "LPX64"\n", + oa->o_parent_seq); if (valid & OBD_MD_FLSIZE) CDEBUG(D_RPCTRACE, "obdo: o_size = "LPD64"\n", oa->o_size); if (valid & OBD_MD_FLMTIME) @@ -2142,78 +2392,19 @@ void dump_obdo(struct obdo *oa) CDEBUG(D_RPCTRACE, "obdo: o_lcookie = " "(llog_cookie dumping not yet implemented)\n"); } +EXPORT_SYMBOL(dump_obdo); void dump_ost_body(struct ost_body *ob) { dump_obdo(&ob->oa); } +EXPORT_SYMBOL(dump_ost_body); void dump_rcs(__u32 *rc) { CDEBUG(D_RPCTRACE, "rmf_rcs: %d\n", *rc); } - -#ifdef __KERNEL__ - -/** - * got qdata from request(req/rep) - */ -struct qunit_data *quota_get_qdata(void *r, int is_req, int is_exp) -{ - struct ptlrpc_request *req = (struct ptlrpc_request *)r; - struct qunit_data *qdata; - __u64 flags = is_exp ? req->rq_export->exp_connect_flags : - req->rq_import->imp_connect_data.ocd_connect_flags; - - LASSERT(req); - /* support for quota64 */ - LASSERT(flags & OBD_CONNECT_QUOTA64); - /* support for change_qs */ - LASSERT(flags & OBD_CONNECT_CHANGE_QS); - - if (is_req == QUOTA_REQUEST) - qdata = req_capsule_client_get(&req->rq_pill, &RMF_QUNIT_DATA); - else - qdata = req_capsule_server_get(&req->rq_pill, &RMF_QUNIT_DATA); - if (qdata == NULL) - return ERR_PTR(-EPROTO); - - QDATA_SET_CHANGE_QS(qdata); - return qdata; -} -EXPORT_SYMBOL(quota_get_qdata); - -/** - * copy qdata to request(req/rep) - */ -int quota_copy_qdata(void *r, struct qunit_data *qdata, int is_req, - int is_exp) -{ - struct ptlrpc_request *req = (struct ptlrpc_request *)r; - void *target; - __u64 flags = is_exp ? req->rq_export->exp_connect_flags : - req->rq_import->imp_connect_data.ocd_connect_flags; - - LASSERT(req); - LASSERT(qdata); - /* support for quota64 */ - LASSERT(flags & OBD_CONNECT_QUOTA64); - /* support for change_qs */ - LASSERT(flags & OBD_CONNECT_CHANGE_QS); - - if (is_req == QUOTA_REQUEST) - target = req_capsule_client_get(&req->rq_pill, &RMF_QUNIT_DATA); - else - target = req_capsule_server_get(&req->rq_pill, &RMF_QUNIT_DATA); - if (target == NULL) - return -EPROTO; - - LASSERT(target != qdata); - memcpy(target, qdata, sizeof(*qdata)); - return 0; -} -EXPORT_SYMBOL(quota_copy_qdata); -#endif /* __KERNEL__ */ +EXPORT_SYMBOL(dump_rcs); static inline int req_ptlrpc_body_swabbed(struct ptlrpc_request *req) { @@ -2242,39 +2433,50 @@ static inline int rep_ptlrpc_body_swabbed(struct ptlrpc_request *req) } } -void _debug_req(struct ptlrpc_request *req, __u32 mask, - struct libcfs_debug_msg_data *data, const char *fmt, ... ) +void _debug_req(struct ptlrpc_request *req, + struct libcfs_debug_msg_data *msgdata, + const char *fmt, ... ) { + int req_ok = req->rq_reqmsg != NULL; + int rep_ok = req->rq_repmsg != NULL; + lnet_nid_t nid = LNET_NID_ANY; va_list args; - va_start(args, fmt); - libcfs_debug_vmsg2(data->msg_cdls, data->msg_subsys, mask, data->msg_file, - data->msg_fn, data->msg_line, fmt, args, - " req@%p x"LPU64"/t"LPD64"("LPD64") o%d->%s@%s:%d/%d" - " lens %d/%d e %d to %d dl "CFS_TIME_T" ref %d " - "fl "REQ_FLAGS_FMT"/%x/%x rc %d/%d\n", - req, req->rq_xid, req->rq_transno, - req->rq_reqmsg ? lustre_msg_get_transno(req->rq_reqmsg) : 0, - req->rq_reqmsg ? lustre_msg_get_opc(req->rq_reqmsg) : -1, - req->rq_import ? obd2cli_tgt(req->rq_import->imp_obd) : - req->rq_export ? - (char*)req->rq_export->exp_client_uuid.uuid : "", - req->rq_import ? - (char *)req->rq_import->imp_connection->c_remote_uuid.uuid : - req->rq_export ? - (char *)req->rq_export->exp_connection->c_remote_uuid.uuid : "", - req->rq_request_portal, req->rq_reply_portal, - req->rq_reqlen, req->rq_replen, - req->rq_early_count, req->rq_timedout, - req->rq_deadline, - cfs_atomic_read(&req->rq_refcount), - DEBUG_REQ_FLAGS(req), - req->rq_reqmsg && req_ptlrpc_body_swabbed(req) ? - lustre_msg_get_flags(req->rq_reqmsg) : -1, - req->rq_repmsg && rep_ptlrpc_body_swabbed(req) ? - lustre_msg_get_flags(req->rq_repmsg) : -1, - req->rq_status, - req->rq_repmsg && rep_ptlrpc_body_swabbed(req) ? - lustre_msg_get_status(req->rq_repmsg) : -1); + + if (ptlrpc_req_need_swab(req)) { + req_ok = req_ok && req_ptlrpc_body_swabbed(req); + rep_ok = rep_ok && rep_ptlrpc_body_swabbed(req); + } + + if (req->rq_import && req->rq_import->imp_connection) + nid = req->rq_import->imp_connection->c_peer.nid; + else if (req->rq_export && req->rq_export->exp_connection) + nid = req->rq_export->exp_connection->c_peer.nid; + + va_start(args, fmt); + libcfs_debug_vmsg2(msgdata, fmt, args, + " req@%p x"LPU64"/t"LPD64"("LPD64") o%d->%s@%s:%d/%d" + " lens %d/%d e %d to %d dl "CFS_TIME_T" ref %d " + "fl "REQ_FLAGS_FMT"/%x/%x rc %d/%d\n", + req, req->rq_xid, req->rq_transno, + req_ok ? lustre_msg_get_transno(req->rq_reqmsg) : 0, + req_ok ? lustre_msg_get_opc(req->rq_reqmsg) : -1, + req->rq_import ? + req->rq_import->imp_obd->obd_name : + req->rq_export ? + req->rq_export->exp_client_uuid.uuid : + "", + libcfs_nid2str(nid), + req->rq_request_portal, req->rq_reply_portal, + req->rq_reqlen, req->rq_replen, + req->rq_early_count, req->rq_timedout, + req->rq_deadline, + atomic_read(&req->rq_refcount), + DEBUG_REQ_FLAGS(req), + req_ok ? lustre_msg_get_flags(req->rq_reqmsg) : -1, + rep_ok ? lustre_msg_get_flags(req->rq_repmsg) : -1, + req->rq_status, + rep_ok ? lustre_msg_get_status(req->rq_repmsg) : -1); + va_end(args); } EXPORT_SYMBOL(_debug_req); @@ -2289,6 +2491,7 @@ void lustre_swab_lustre_capa(struct lustre_capa *c) __swab32s (&c->lc_timeout); __swab32s (&c->lc_expiry); } +EXPORT_SYMBOL(lustre_swab_lustre_capa); void lustre_swab_lustre_capa_key(struct lustre_capa_key *k) { @@ -2296,41 +2499,188 @@ void lustre_swab_lustre_capa_key(struct lustre_capa_key *k) __swab32s (&k->lk_keyid); CLASSERT(offsetof(typeof(*k), lk_padding) != 0); } +EXPORT_SYMBOL(lustre_swab_lustre_capa_key); -void lustre_swab_hsm_state(struct hsm_state_set_ioc *hssi) +void lustre_swab_hsm_user_state(struct hsm_user_state *state) { - lustre_swab_lu_fid(&hssi->hssi_fid); - __swab64s(&hssi->hssi_setmask); - __swab64s(&hssi->hssi_clearmask); + __swab32s(&state->hus_states); + __swab32s(&state->hus_archive_id); } -EXPORT_SYMBOL(lustre_swab_hsm_state); +EXPORT_SYMBOL(lustre_swab_hsm_user_state); -void lustre_swab_hsm_user_request(struct hsm_user_request *hur) +void lustre_swab_hsm_state_set(struct hsm_state_set *hss) { - int i; + __swab32s(&hss->hss_valid); + __swab64s(&hss->hss_setmask); + __swab64s(&hss->hss_clearmask); + __swab32s(&hss->hss_archive_id); +} +EXPORT_SYMBOL(lustre_swab_hsm_state_set); - __swab32s(&hur->hur_action); - __swab32s(&hur->hur_itemcount); - __swab32s(&hur->hur_data_len); - for (i = 0; i < hur->hur_itemcount; i++) { - struct hsm_user_item *hui = &hur->hur_user_item[i]; - lustre_swab_lu_fid(&hui->hui_fid); - __swab64s(&hui->hui_extent.offset); - __swab64s(&hui->hui_extent.length); - } - /* Note: data blob is not swabbed here */ +void lustre_swab_hsm_extent(struct hsm_extent *extent) +{ + __swab64s(&extent->offset); + __swab64s(&extent->length); +} + +void lustre_swab_hsm_current_action(struct hsm_current_action *action) +{ + __swab32s(&action->hca_state); + __swab32s(&action->hca_action); + lustre_swab_hsm_extent(&action->hca_location); } -EXPORT_SYMBOL(lustre_swab_hsm_user_request); +EXPORT_SYMBOL(lustre_swab_hsm_current_action); -void lustre_swab_hsm_progress(struct hsm_progress *hp) +void lustre_swab_hsm_user_item(struct hsm_user_item *hui) { - lustre_swab_lu_fid(&hp->hp_fid); - __swab64s(&hp->hp_cookie); - __swab64s(&hp->hp_extent.offset); - __swab64s(&hp->hp_extent.length); - __swab16s(&hp->hp_flags); - __swab16s(&hp->hp_errval); + lustre_swab_lu_fid(&hui->hui_fid); + lustre_swab_hsm_extent(&hui->hui_extent); } -EXPORT_SYMBOL(lustre_swab_hsm_progress); +EXPORT_SYMBOL(lustre_swab_hsm_user_item); +void lustre_swab_layout_intent(struct layout_intent *li) +{ + __swab32s(&li->li_opc); + __swab32s(&li->li_flags); + __swab64s(&li->li_start); + __swab64s(&li->li_end); +} +EXPORT_SYMBOL(lustre_swab_layout_intent); + +void lustre_swab_hsm_progress_kernel(struct hsm_progress_kernel *hpk) +{ + lustre_swab_lu_fid(&hpk->hpk_fid); + __swab64s(&hpk->hpk_cookie); + __swab64s(&hpk->hpk_extent.offset); + __swab64s(&hpk->hpk_extent.length); + __swab16s(&hpk->hpk_flags); + __swab16s(&hpk->hpk_errval); +} +EXPORT_SYMBOL(lustre_swab_hsm_progress_kernel); + +void lustre_swab_hsm_request(struct hsm_request *hr) +{ + __swab32s(&hr->hr_action); + __swab32s(&hr->hr_archive_id); + __swab64s(&hr->hr_flags); + __swab32s(&hr->hr_itemcount); + __swab32s(&hr->hr_data_len); +} +EXPORT_SYMBOL(lustre_swab_hsm_request); + +void lustre_swab_object_update(struct object_update *ou) +{ + struct object_update_param *param; + int i; + + __swab16s(&ou->ou_type); + __swab16s(&ou->ou_params_count); + __swab32s(&ou->ou_master_index); + __swab32s(&ou->ou_flags); + __swab32s(&ou->ou_padding1); + __swab64s(&ou->ou_batchid); + lustre_swab_lu_fid(&ou->ou_fid); + param = &ou->ou_params[0]; + for (i = 0; i < ou->ou_params_count; i++) { + __swab16s(¶m->oup_len); + __swab16s(¶m->oup_padding); + __swab32s(¶m->oup_padding2); + param = (struct object_update_param *)((char *)param + + object_update_param_size(param)); + } +} +EXPORT_SYMBOL(lustre_swab_object_update); + +void lustre_swab_object_update_request(struct object_update_request *our) +{ + int i; + __swab32s(&our->ourq_magic); + __swab16s(&our->ourq_count); + __swab16s(&our->ourq_padding); + for (i = 0; i < our->ourq_count; i++) { + struct object_update *ou; + + ou = object_update_request_get(our, i, NULL); + if (ou == NULL) + return; + lustre_swab_object_update(ou); + } +} +EXPORT_SYMBOL(lustre_swab_object_update_request); + +void lustre_swab_object_update_result(struct object_update_result *our) +{ + __swab32s(&our->our_rc); + __swab16s(&our->our_datalen); + __swab16s(&our->our_padding); +} +EXPORT_SYMBOL(lustre_swab_object_update_result); +void lustre_swab_object_update_reply(struct object_update_reply *our) +{ + int i; + + __swab32s(&our->ourp_magic); + __swab16s(&our->ourp_count); + __swab16s(&our->ourp_padding); + for (i = 0; i < our->ourp_count; i++) { + struct object_update_result *ourp; + + __swab16s(&our->ourp_lens[i]); + ourp = object_update_result_get(our, i, NULL); + if (ourp == NULL) + return; + lustre_swab_object_update_result(ourp); + } +} +EXPORT_SYMBOL(lustre_swab_object_update_reply); + +void lustre_swab_swap_layouts(struct mdc_swap_layouts *msl) +{ + __swab64s(&msl->msl_flags); +} +EXPORT_SYMBOL(lustre_swab_swap_layouts); + +void lustre_swab_close_data(struct close_data *cd) +{ + lustre_swab_lu_fid(&cd->cd_fid); + __swab64s(&cd->cd_data_version); +} +EXPORT_SYMBOL(lustre_swab_close_data); + +void lustre_swab_lfsck_request(struct lfsck_request *lr) +{ + __swab32s(&lr->lr_event); + __swab32s(&lr->lr_index); + __swab32s(&lr->lr_flags); + __swab32s(&lr->lr_valid); + __swab32s(&lr->lr_speed); + __swab16s(&lr->lr_version); + __swab16s(&lr->lr_active); + __swab16s(&lr->lr_param); + __swab16s(&lr->lr_async_windows); + CLASSERT(offsetof(typeof(*lr), lr_padding_1) != 0); + lustre_swab_lu_fid(&lr->lr_fid); + lustre_swab_lu_fid(&lr->lr_fid2); + lustre_swab_lu_fid(&lr->lr_fid3); + CLASSERT(offsetof(typeof(*lr), lr_padding_2) != 0); + CLASSERT(offsetof(typeof(*lr), lr_padding_3) != 0); +} +EXPORT_SYMBOL(lustre_swab_lfsck_request); + +void lustre_swab_lfsck_reply(struct lfsck_reply *lr) +{ + __swab32s(&lr->lr_status); + CLASSERT(offsetof(typeof(*lr), lr_padding_1) != 0); + CLASSERT(offsetof(typeof(*lr), lr_padding_2) != 0); +} +EXPORT_SYMBOL(lustre_swab_lfsck_reply); + +void lustre_swab_orphan_ent(struct lu_orphan_ent *ent) +{ + lustre_swab_lu_fid(&ent->loe_key); + lustre_swab_lu_fid(&ent->loe_rec.lor_fid); + __swab32s(&ent->loe_rec.lor_uid); + __swab32s(&ent->loe_rec.lor_gid); +} +EXPORT_SYMBOL(lustre_swab_orphan_ent);