X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fptlrpc%2Fpack_generic.c;h=edbe8f3f964e3fe34c4ef47eaf77a4401706a109;hp=ee9400dd7c7384fd2218ba6feb940741a784e800;hb=3998a8e474b58a5bb4bc47b620adc836c27ab70d;hpb=f95393b0d0a59cf3dc2f29cffc35dcc4cc9d7728 diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index ee9400d..edbe8f3 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, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -43,9 +43,6 @@ */ #define DEBUG_SUBSYSTEM S_RPC -#ifndef __KERNEL__ -# include -#endif #include @@ -55,26 +52,27 @@ #include #include -static inline int lustre_msg_hdr_size_v2(int count) +#include "ptlrpc_internal.h" + +static inline __u32 lustre_msg_hdr_size_v2(__u32 count) { return cfs_size_round(offsetof(struct lustre_msg_v2, lm_buflens[count])); } -int lustre_msg_hdr_size(__u32 magic, int count) +__u32 lustre_msg_hdr_size(__u32 magic, __u32 count) { switch (magic) { case LUSTRE_MSG_MAGIC_V2: return lustre_msg_hdr_size_v2(count); default: LASSERTF(0, "incorrect message magic: %08x\n", magic); - return -EINVAL; + return 0; } } -EXPORT_SYMBOL(lustre_msg_hdr_size); void ptlrpc_buf_set_swabbed(struct ptlrpc_request *req, const int inout, - int index) + __u32 index) { if (inout) lustre_set_req_swabbed(req, index); @@ -83,7 +81,7 @@ void ptlrpc_buf_set_swabbed(struct ptlrpc_request *req, const int inout, } int ptlrpc_buf_need_swab(struct ptlrpc_request *req, const int inout, - int index) + __u32 index) { if (inout) return (ptlrpc_req_need_swab(req) && @@ -94,7 +92,7 @@ int ptlrpc_buf_need_swab(struct ptlrpc_request *req, const int inout, } static inline int lustre_msg_check_version_v2(struct lustre_msg_v2 *msg, - __u32 version) + __u32 version) { __u32 ver = lustre_msg_get_version(msg); return (ver & LUSTRE_VERSION_MASK) != version; @@ -115,18 +113,27 @@ int lustre_msg_check_version(struct lustre_msg *msg, __u32 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); - return size; +__u32 lustre_msg_early_size() +{ + static __u32 size; + 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); -int lustre_msg_size_v2(int count, __u32 *lengths) +__u32 lustre_msg_size_v2(int count, __u32 *lengths) { - int size; + __u32 size; int i; size = lustre_msg_hdr_size_v2(count); @@ -143,7 +150,7 @@ EXPORT_SYMBOL(lustre_msg_size_v2); * in the form of a v2 request. If this is a connection to a v1 * target then the first buffer will be stripped because the ptlrpc * data is part of the lustre_msg_v1 header. b=14043 */ -int lustre_msg_size(__u32 magic, int count, __u32 *lens) +__u32 lustre_msg_size(__u32 magic, int count, __u32 *lens) { __u32 size[] = { sizeof(struct ptlrpc_body) }; @@ -153,20 +160,20 @@ 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: return lustre_msg_size_v2(count, lens); default: LASSERTF(0, "incorrect message magic: %08x\n", magic); - return -EINVAL; + return 0; } } /* This is used to determine the size of a buffer that was already packed * and will correctly handle the different message formats. */ -int lustre_packed_msg_size(struct lustre_msg *msg) +__u32 lustre_packed_msg_size(struct lustre_msg *msg) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: @@ -245,70 +252,73 @@ int lustre_pack_request(struct ptlrpc_request *req, __u32 magic, int count, } #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 +331,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 +341,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; @@ -388,13 +398,13 @@ int lustre_pack_reply(struct ptlrpc_request *req, int count, __u32 *lens, { 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) +void *lustre_msg_buf_v2(struct lustre_msg_v2 *m, __u32 n, __u32 min_size) { - int i, offset, buflen, bufcount; + __u32 i, offset, buflen, bufcount; LASSERT(m != NULL); - LASSERT(n >= 0); bufcount = m->lm_bufcount; if (unlikely(n >= bufcount)) { @@ -418,7 +428,7 @@ void *lustre_msg_buf_v2(struct lustre_msg_v2 *m, int n, int min_size) return (char *)m + offset; } -void *lustre_msg_buf(struct lustre_msg *m, int n, int min_size) +void *lustre_msg_buf(struct lustre_msg *m, __u32 n, __u32 min_size) { switch (m->lm_magic) { case LUSTRE_MSG_MAGIC_V2: @@ -428,9 +438,10 @@ 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) +static int lustre_shrink_msg_v2(struct lustre_msg_v2 *msg, __u32 segment, + unsigned int newlen, int move_data) { char *tail = NULL, *newpos; int tail_len = 0, n; @@ -486,21 +497,22 @@ 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); } static int lustre_unpack_msg_v2(struct lustre_msg_v2 *m, int len) @@ -607,7 +619,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 +634,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; } @@ -649,7 +664,7 @@ int lustre_unpack_rep_ptlrpc_body(struct ptlrpc_request *req, int offset) } } -static inline int lustre_msg_buflen_v2(struct lustre_msg_v2 *m, int n) +static inline __u32 lustre_msg_buflen_v2(struct lustre_msg_v2 *m, __u32 n) { if (n >= m->lm_bufcount) return 0; @@ -664,20 +679,20 @@ static inline int lustre_msg_buflen_v2(struct lustre_msg_v2 *m, int n) * * returns zero for non-existent message indices */ -int lustre_msg_buflen(struct lustre_msg *m, int n) +__u32 lustre_msg_buflen(struct lustre_msg *m, __u32 n) { switch (m->lm_magic) { case LUSTRE_MSG_MAGIC_V2: return lustre_msg_buflen_v2(m, n); default: CERROR("incorrect message magic: %08x\n", m->lm_magic); - return -EINVAL; + return 0; } } EXPORT_SYMBOL(lustre_msg_buflen); static inline void -lustre_msg_set_buflen_v2(struct lustre_msg_v2 *m, int n, int len) +lustre_msg_set_buflen_v2(struct lustre_msg_v2 *m, __u32 n, __u32 len) { if (n >= m->lm_bufcount) LBUG(); @@ -685,7 +700,7 @@ lustre_msg_set_buflen_v2(struct lustre_msg_v2 *m, int n, int len) m->lm_buflens[n] = len; } -void lustre_msg_set_buflen(struct lustre_msg *m, int n, int len) +void lustre_msg_set_buflen(struct lustre_msg *m, __u32 n, __u32 len) { switch (m->lm_magic) { case LUSTRE_MSG_MAGIC_V2: @@ -696,27 +711,24 @@ void lustre_msg_set_buflen(struct lustre_msg *m, int n, int len) } } -EXPORT_SYMBOL(lustre_msg_set_buflen); - /* NB return the bufcount for lustre_msg_v2 format, so if message is packed * in V1 format, the result is one bigger. (add struct ptlrpc_body). */ -int lustre_msg_bufcount(struct lustre_msg *m) +__u32 lustre_msg_bufcount(struct lustre_msg *m) { switch (m->lm_magic) { case LUSTRE_MSG_MAGIC_V2: return m->lm_bufcount; default: CERROR("incorrect message magic: %08x\n", m->lm_magic); - return -EINVAL; + return 0; } } -EXPORT_SYMBOL(lustre_msg_bufcount); -char *lustre_msg_string(struct lustre_msg *m, int index, int max_len) +char *lustre_msg_string(struct lustre_msg *m, __u32 index, __u32 max_len) { - /* max_len == 0 means the string should fill the buffer */ - char *str; - int slen, blen; + /* max_len == 0 means the string should fill the buffer */ + char *str; + __u32 slen, blen; switch (m->lm_magic) { case LUSTRE_MSG_MAGIC_V2: @@ -758,8 +770,8 @@ char *lustre_msg_string(struct lustre_msg *m, int index, int max_len) } /* Wrap up the normal fixed length cases */ -static inline void *__lustre_swab_buf(struct lustre_msg *msg, int index, - int min_size, void *swabber) +static inline void *__lustre_swab_buf(struct lustre_msg *msg, __u32 index, + __u32 min_size, void *swabber) { void *ptr = NULL; @@ -781,7 +793,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,8 +842,9 @@ __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) +void lustre_msg_add_flags(struct lustre_msg *msg, __u32 flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { @@ -844,8 +857,9 @@ 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) +void lustre_msg_set_flags(struct lustre_msg *msg, __u32 flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { @@ -859,7 +873,7 @@ void lustre_msg_set_flags(struct lustre_msg *msg, int flags) } } -void lustre_msg_clear_flags(struct lustre_msg *msg, int flags) +void lustre_msg_clear_flags(struct lustre_msg *msg, __u32 flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { @@ -872,6 +886,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) { @@ -889,7 +904,7 @@ __u32 lustre_msg_get_op_flags(struct lustre_msg *msg) } } -void lustre_msg_add_op_flags(struct lustre_msg *msg, int flags) +void lustre_msg_add_op_flags(struct lustre_msg *msg, __u32 flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { @@ -902,8 +917,9 @@ 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) +void lustre_msg_set_op_flags(struct lustre_msg *msg, __u32 flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { @@ -950,6 +966,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) { @@ -968,7 +985,7 @@ __u32 lustre_msg_get_version(struct lustre_msg *msg) } } -void lustre_msg_add_version(struct lustre_msg *msg, int version) +void lustre_msg_add_version(struct lustre_msg *msg, __u32 version) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { @@ -999,6 +1016,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 +1034,25 @@ __u64 lustre_msg_get_last_xid(struct lustre_msg *msg) return 0; } } +EXPORT_SYMBOL(lustre_msg_get_last_xid); + +__u16 lustre_msg_get_tag(struct lustre_msg *msg) +{ + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V2: { + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); + if (!pb) { + CERROR("invalid msg %p: no ptlrpc body!\n", msg); + return 0; + } + return pb->pb_tag; + } + default: + CERROR("incorrect message magic: %08x\n", msg->lm_magic); + return 0; + } +} +EXPORT_SYMBOL(lustre_msg_get_tag); __u64 lustre_msg_get_last_committed(struct lustre_msg *msg) { @@ -1033,6 +1070,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 +1090,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 +1108,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 +1127,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) { @@ -1176,6 +1217,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) { @@ -1241,6 +1283,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 +1316,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, 53, 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 @@ -1263,28 +1327,31 @@ __u32 lustre_msg_get_cksum(struct lustre_msg *msg) __u32 lustre_msg_calc_cksum(struct lustre_msg *msg, int compat18) #else -# warning "remove checksum compatibility support for b1_8" __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, 53, 0) + __u32 len = compat18 ? ptlrpc_body_cksum_size_compat18 : + lustre_msg_buflen(msg, MSG_PTLRPC_BODY_OFF); #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 len = lustre_msg_buflen(msg, MSG_PTLRPC_BODY_OFF); #endif - } - default: - CERROR("incorrect message magic: %08x\n", msg->lm_magic); - return 0; - } + unsigned int hsize = 4; + __u32 crc; + + LASSERTF(pb != NULL, "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; + } + 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) @@ -1342,6 +1409,22 @@ 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_tag(struct lustre_msg *msg, __u16 tag) +{ + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V2: { + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); + LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); + pb->pb_tag = tag; + return; + } + default: + LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); + } +} +EXPORT_SYMBOL(lustre_msg_set_tag); void lustre_msg_set_last_committed(struct lustre_msg *msg, __u64 last_committed) { @@ -1375,6 +1458,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 +1473,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 +1488,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) { @@ -1450,6 +1536,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, LUSTRE_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 +1590,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) { @@ -1487,10 +1605,10 @@ void ptlrpc_req_set_repsize(struct ptlrpc_request *req, int count, __u32 *lens) * This may go from client to server or server to client. */ int do_set_info_async(struct obd_import *imp, - int opcode, int version, - obd_count keylen, void *key, - obd_count vallen, void *val, - struct ptlrpc_request_set *set) + int opcode, int version, + size_t keylen, void *key, + size_t vallen, void *val, + struct ptlrpc_request_set *set) { struct ptlrpc_request *req; char *tmp; @@ -1540,7 +1658,7 @@ void lustre_swab_ptlrpc_body(struct ptlrpc_body *b) __swab32s (&b->pb_opc); __swab32s (&b->pb_status); __swab64s (&b->pb_last_xid); - __swab64s (&b->pb_last_seen); + __swab16s (&b->pb_tag); __swab64s (&b->pb_last_committed); __swab64s (&b->pb_transno); __swab32s (&b->pb_flags); @@ -1554,7 +1672,15 @@ void lustre_swab_ptlrpc_body(struct ptlrpc_body *b) __swab64s (&b->pb_pre_versions[1]); __swab64s (&b->pb_pre_versions[2]); __swab64s (&b->pb_pre_versions[3]); - CLASSERT(offsetof(typeof(*b), pb_padding) != 0); + CLASSERT(offsetof(typeof(*b), pb_padding0) != 0); + CLASSERT(offsetof(typeof(*b), pb_padding1) != 0); + 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); } void lustre_swab_connect(struct obd_connect_data *ocd) @@ -1565,20 +1691,46 @@ 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); + if (ocd->ocd_connect_flags & OBD_CONNECT_MULTIMODRPCS) + __swab16s(&ocd->ocd_maxmodrpcs); + CLASSERT(offsetof(typeof(*ocd), padding0) != 0); 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); @@ -1599,13 +1751,15 @@ void lustre_swab_obdo (struct obdo *o) __swab32s (&o->o_parent_ver); /* o_handle is opaque */ /* o_lcookie is swabbed elsewhere */ - CLASSERT(offsetof(typeof(*o), o_padding_2) != 0); - CLASSERT(offsetof(typeof(*o), o_padding_3) != 0); + __swab32s (&o->o_uid_h); + __swab32s (&o->o_gid_h); + __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) { @@ -1620,7 +1774,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,19 +1785,18 @@ void lustre_swab_obd_statfs (struct obd_statfs *os) CLASSERT(offsetof(typeof(*os), os_spare9) != 0); } -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); } -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); } void lustre_swab_ost_body (struct ost_body *b) @@ -1651,7 +1804,7 @@ void lustre_swab_ost_body (struct ost_body *b) lustre_swab_obdo (&b->oa); } -void lustre_swab_ost_last_id(obd_id *id) +void lustre_swab_ost_last_id(u64 *id) { __swab64s(id); } @@ -1661,81 +1814,82 @@ void lustre_swab_generic_32s(__u32 *val) __swab32s(val); } -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_lquota_lvb(struct lquota_lvb *lvb) +{ + __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->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); - CLASSERT(offsetof(typeof(*b), padding_4) != 0); + 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); } void lustre_swab_mdt_ioepoch (struct mdt_ioepoch *b) @@ -1753,12 +1907,49 @@ 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]); } +void lustre_swab_mgs_nidtbl_entry(struct mgs_nidtbl_entry *entry) +{ + __u8 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); +} + +void lustre_swab_mgs_config_res(struct mgs_config_res *body) +{ + __swab64s(&body->mcr_offset); + __swab64s(&body->mcr_size); +} + static void lustre_swab_obd_dqinfo (struct obd_dqinfo *i) { __swab64s (&i->dqi_bgrace); @@ -1778,7 +1969,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) @@ -1791,32 +1982,18 @@ void lustre_swab_obd_quotactl (struct obd_quotactl *q) 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); -}; - void lustre_swab_mdt_remote_perm (struct mdt_remote_perm *p) { __swab32s (&p->rp_uid); __swab32s (&p->rp_gid); __swab32s (&p->rp_fsuid); + __swab32s (&p->rp_fsuid_h); __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) { @@ -1827,7 +2004,7 @@ void lustre_swab_fid2path(struct getinfo_fid2path *gf) } EXPORT_SYMBOL(lustre_swab_fid2path); -void lustre_swab_fiemap_extent(struct ll_fiemap_extent *fm_extent) +static void lustre_swab_fiemap_extent(struct ll_fiemap_extent *fm_extent) { __swab64s(&fm_extent->fe_logical); __swab64s(&fm_extent->fe_physical); @@ -1838,7 +2015,7 @@ void lustre_swab_fiemap_extent(struct ll_fiemap_extent *fm_extent) void lustre_swab_fiemap(struct ll_user_fiemap *fiemap) { - int i; + __u32 i; __swab64s(&fiemap->fm_start); __swab64s(&fiemap->fm_length); @@ -1851,32 +2028,55 @@ void lustre_swab_fiemap(struct ll_user_fiemap *fiemap) lustre_swab_fiemap_extent(&fiemap->fm_extents[i]); } +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); - - CLASSERT(offsetof(typeof(*rr), rr_padding_1) != 0); - 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); }; void lustre_swab_lov_desc (struct lov_desc *ld) @@ -1890,6 +2090,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) { @@ -1902,39 +2103,91 @@ 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) +{ + 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; + } +} + +void lustre_swab_lmv_user_md(struct lmv_user_md *lum) { - __swab32s(&mea->mea_magic); - __swab32s(&mea->mea_count); - __swab32s(&mea->mea_master); - CLASSERT(offsetof(typeof(*mea), mea_padding) != 0); + __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); + +void lustre_print_user_md(unsigned int lvl, struct lov_user_md *lum, + const char *msg) +{ + if (likely(!cfs_cdebug_show(lvl, DEBUG_SUBSYSTEM))) + return; + + CDEBUG(lvl, "%s lov_user_md %p:\n", msg, lum); + CDEBUG(lvl, "\tlmm_magic: %#x\n", lum->lmm_magic); + CDEBUG(lvl, "\tlmm_pattern: %#x\n", lum->lmm_pattern); + CDEBUG(lvl, "\tlmm_object_id: "LPU64"\n", lmm_oi_id(&lum->lmm_oi)); + CDEBUG(lvl, "\tlmm_object_gr: "LPU64"\n", lmm_oi_seq(&lum->lmm_oi)); + CDEBUG(lvl, "\tlmm_stripe_size: %#x\n", lum->lmm_stripe_size); + CDEBUG(lvl, "\tlmm_stripe_count: %#x\n", lum->lmm_stripe_count); + CDEBUG(lvl, "\tlmm_stripe_offset/lmm_layout_gen: %#x\n", + lum->lmm_stripe_offset); + if (lum->lmm_magic == LOV_USER_MAGIC_V3) { + struct lov_user_md_v3 *v3 = (void *)lum; + CDEBUG(lvl, "\tlmm_pool_name: %s\n", v3->lmm_pool_name); + } + if (lum->lmm_magic == LOV_USER_MAGIC_SPECIFIC) { + struct lov_user_md_v3 *v3 = (void *)lum; + int i; + + if (v3->lmm_pool_name[0] != '\0') + CDEBUG(lvl, "\tlmm_pool_name: %s\n", v3->lmm_pool_name); + CDEBUG(lvl, "\ttarget list:\n"); + for (i = 0; i < v3->lmm_stripe_count; i++) + CDEBUG(lvl, "\t\t%u\n", v3->lmm_objects[i].l_ost_idx); + } +} +EXPORT_SYMBOL(lustre_print_user_md); -static void print_lum (struct lov_user_md *lum) +static void lustre_swab_lmm_oi(struct ost_id *oi) { - 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); + __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); + EXIT; } void lustre_swab_lov_user_md_v1(struct lov_user_md_v1 *lum) @@ -1944,6 +2197,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) { @@ -1953,18 +2207,19 @@ 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; } void lustre_swab_lov_user_md_objects(struct lov_user_ost_data *lod, @@ -1973,14 +2228,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) { @@ -1990,7 +2244,7 @@ void lustre_swab_ldlm_res_id (struct ldlm_res_id *id) __swab64s (&id->name[i]); } -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 @@ -1998,7 +2252,8 @@ 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); } void lustre_swab_ldlm_intent (struct ldlm_intent *i) @@ -2039,52 +2294,41 @@ void lustre_swab_ldlm_reply (struct ldlm_reply *r) __swab64s (&r->lock_policy_res2); } -/* 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); } 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); } void dump_obdo(struct obdo *oa) { - __u32 valid = oa->o_valid; + u64 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 = "LPX64"\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) @@ -2105,8 +2349,12 @@ void dump_obdo(struct obdo *oa) (valid & OBD_MD_FLMODE ? ~S_IFMT : 0))); if (valid & OBD_MD_FLUID) CDEBUG(D_RPCTRACE, "obdo: o_uid = %u\n", oa->o_uid); + if (valid & OBD_MD_FLUID) + CDEBUG(D_RPCTRACE, "obdo: o_uid_h = %u\n", oa->o_uid_h); if (valid & OBD_MD_FLGID) CDEBUG(D_RPCTRACE, "obdo: o_gid = %u\n", oa->o_gid); + if (valid & OBD_MD_FLGID) + CDEBUG(D_RPCTRACE, "obdo: o_gid_h = %u\n", oa->o_gid_h); if (valid & OBD_MD_FLFLAGS) CDEBUG(D_RPCTRACE, "obdo: o_flags = %x\n", oa->o_flags); if (valid & OBD_MD_FLNLINK) @@ -2144,68 +2392,6 @@ 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__ */ - static inline int req_ptlrpc_body_swabbed(struct ptlrpc_request *req) { LASSERT(req->rq_reqmsg); @@ -2233,39 +2419,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); @@ -2288,3 +2485,171 @@ void lustre_swab_lustre_capa_key(struct lustre_capa_key *k) CLASSERT(offsetof(typeof(*k), lk_padding) != 0); } +void lustre_swab_hsm_user_state(struct hsm_user_state *state) +{ + __swab32s(&state->hus_states); + __swab32s(&state->hus_archive_id); +} + +void lustre_swab_hsm_state_set(struct hsm_state_set *hss) +{ + __swab32s(&hss->hss_valid); + __swab64s(&hss->hss_setmask); + __swab64s(&hss->hss_clearmask); + __swab32s(&hss->hss_archive_id); +} + +static 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); +} + +void lustre_swab_hsm_user_item(struct hsm_user_item *hui) +{ + lustre_swab_lu_fid(&hui->hui_fid); + lustre_swab_hsm_extent(&hui->hui_extent); +} + +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); +} + +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); +} + +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); +} + +void lustre_swab_object_update(struct object_update *ou) +{ + struct object_update_param *param; + size_t 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)); + } +} + +void lustre_swab_object_update_request(struct object_update_request *our) +{ + size_t 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); + } +} + +void lustre_swab_object_update_result(struct object_update_result *our) +{ + __swab32s(&our->our_rc); + __swab16s(&our->our_datalen); + __swab16s(&our->our_padding); +} + +void lustre_swab_object_update_reply(struct object_update_reply *our) +{ + size_t 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); + } +} + +void lustre_swab_swap_layouts(struct mdc_swap_layouts *msl) +{ + __swab64s(&msl->msl_flags); +} + +void lustre_swab_close_data(struct close_data *cd) +{ + lustre_swab_lu_fid(&cd->cd_fid); + __swab64s(&cd->cd_data_version); +} + +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); + __swab32s(&lr->lr_flags); + 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_1) != 0); + CLASSERT(offsetof(typeof(*lr), lr_padding_2) != 0); +} + +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); +} + +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);