From 2264293df4b914792936a46a7a0a0d17dd028716 Mon Sep 17 00:00:00 2001 From: braam Date: Tue, 8 Jul 2003 22:41:20 +0000 Subject: [PATCH] - we could call this "merely a merge from b_devel". Notes: - lprocfs is not managable - this oopses on mount, will be fixed soon. --- lnet/utils/wirecheck.c | 16 ++++++------ lustre/ldlm/ldlm_lib.c | 48 +++++++++++++++++------------------- lustre/mdc/mdc_internal.h | 23 ++++++++--------- lustre/mdc/mdc_lib.c | 53 +++++++++++++++++++++++++--------------- lustre/mds/mds_lib.c | 22 ++++++++++------- lustre/portals/utils/wirecheck.c | 16 ++++++------ lustre/utils/wirecheck.c | 16 ++++++------ 7 files changed, 105 insertions(+), 89 deletions(-) diff --git a/lnet/utils/wirecheck.c b/lnet/utils/wirecheck.c index 52a37c2f..6a4377b 100644 --- a/lnet/utils/wirecheck.c +++ b/lnet/utils/wirecheck.c @@ -30,25 +30,25 @@ do { \ #define CHECK_MEMBER_OFFSET(s,m) \ do { \ - CHECK_VALUE (offsetof (s, m)); \ + CHECK_VALUE(offsetof(s, m)); \ } while (0) -#define CHECK_MEMBER_SIZEOF(s,m) \ -do { \ - CHECK_VALUE (sizeof (((s *)0)->m)); \ +#define CHECK_MEMBER_SIZEOF(s,m) \ +do { \ + CHECK_VALUE((int)sizeof(((s *)0)->m)); \ } while (0) #define CHECK_MEMBER(s,m) \ do { \ - CHECK_MEMBER_OFFSET (s, m); \ - CHECK_MEMBER_SIZEOF (s, m); \ + CHECK_MEMBER_OFFSET(s, m); \ + CHECK_MEMBER_SIZEOF(s, m); \ } while (0) #define CHECK_STRUCT(s) \ do { \ - BLANK_LINE (); \ + BLANK_LINE (); \ COMMENT ("Checks for struct "#s); \ - CHECK_VALUE (sizeof (s)); \ + CHECK_VALUE((int)sizeof(s)); \ } while (0) void diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 2616392..d6029f3 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -32,7 +32,7 @@ #include #include -int client_import_connect(struct lustre_handle *dlm_handle, +int client_import_connect(struct lustre_handle *dlm_handle, struct obd_device *obd, struct obd_uuid *cluuid) { @@ -74,6 +74,8 @@ int client_import_connect(struct lustre_handle *dlm_handle, request->rq_level = LUSTRE_CONN_NEW; request->rq_replen = lustre_msg_size(0, NULL); + lustre_msg_add_op_flags(request->rq_reqmsg, MSG_CONNECT_PEER); + imp->imp_dlm_handle = *dlm_handle; imp->imp_level = LUSTRE_CONN_CON; @@ -92,6 +94,7 @@ int client_import_connect(struct lustre_handle *dlm_handle, imp->imp_replayable = 1; CDEBUG(D_HA, "connected to replayable target: %s\n", imp->imp_target_uuid.uuid); + ptlrpc_pinger_add_import(imp); } imp->imp_level = LUSTRE_CONN_FULL; imp->imp_remote_handle = request->rq_repmsg->handle; @@ -144,14 +147,14 @@ int client_import_disconnect(struct lustre_handle *dlm_handle, int failover) if (obd->obd_namespace != NULL) { /* obd_no_recov == local only */ ldlm_cli_cancel_unused(obd->obd_namespace, NULL, - obd->obd_no_recov); + obd->obd_no_recov, NULL); ldlm_namespace_free(obd->obd_namespace); obd->obd_namespace = NULL; } /* Yeah, obd_no_recov also (mainly) means "forced shutdown". */ if (obd->obd_no_recov) { - ptlrpc_abort_inflight(imp); + ptlrpc_set_import_active(imp, 0); } else { request = ptlrpc_prep_req(imp, rq_opc, 0, NULL, NULL); if (!request) @@ -159,13 +162,13 @@ int client_import_disconnect(struct lustre_handle *dlm_handle, int failover) request->rq_replen = lustre_msg_size(0, NULL); - /* Process disconnects even if we're waiting for recovery. */ - request->rq_level = LUSTRE_CONN_RECOVD; - rc = ptlrpc_queue_wait(request); if (rc) GOTO(out_req, rc); } + if (imp->imp_replayable) + ptlrpc_pinger_del_import(imp); + EXIT; out_req: if (request) @@ -228,36 +231,32 @@ int target_handle_connect(struct ptlrpc_request *req, svc_handler_t handler) struct obd_uuid remote_uuid; struct list_head *p; char *str, *tmp; - int rc = 0, i, abort_recovery; + int rc = 0, abort_recovery; + ENTRY; LASSERT_REQSWAB (req, 0); - str = lustre_msg_string (req->rq_reqmsg, 0, sizeof (tgtuuid.uuid) - 1); + str = lustre_msg_string(req->rq_reqmsg, 0, sizeof(tgtuuid) - 1); if (str == NULL) { CERROR("bad target UUID for connect\n"); GOTO(out, rc = -EINVAL); } + obd_str2uuid (&tgtuuid, str); + target = class_uuid2obd(&tgtuuid); + if (!target || target->obd_stopping || !target->obd_set_up) { + CERROR("UUID '%s' is not available for connect\n", str); + GOTO(out, rc = -ENODEV); + } LASSERT_REQSWAB (req, 1); - str = lustre_msg_string (req->rq_reqmsg, 1, sizeof (cluuid.uuid) - 1); + str = lustre_msg_string(req->rq_reqmsg, 1, sizeof(cluuid) - 1); if (str == NULL) { CERROR("bad client UUID for connect\n"); GOTO(out, rc = -EINVAL); } - obd_str2uuid (&cluuid, str); - i = class_uuid2dev(&tgtuuid); - if (i == -1) { - CERROR("UUID '%s' not found for connect\n", tgtuuid.uuid); - GOTO(out, rc = -ENODEV); - } - - target = &obd_dev[i]; - if (!target || target->obd_stopping || !target->obd_set_up) { - CERROR("UUID '%s' is not available for connect\n", str); - GOTO(out, rc = -ENODEV); - } + obd_str2uuid (&cluuid, str); /* XXX extract a nettype and format accordingly */ snprintf(remote_uuid.uuid, sizeof remote_uuid, @@ -468,6 +467,7 @@ void target_abort_recovery(void *data) class_disconnect_exports(obd, 0); abort_delayed_replies(obd); abort_recovery_queue(obd); + ptlrpc_run_recovery_over_upcall(obd); } static void target_recovery_expired(unsigned long castmeharder) @@ -489,8 +489,7 @@ static void reset_recovery_timer(struct obd_device *obd) if (!recovering) return; - CDEBUG(D_ERROR, "timer will expire in %ld seconds\n", - OBD_RECOVERY_TIMEOUT / HZ); + CERROR("timer will expire in %ld seconds\n", OBD_RECOVERY_TIMEOUT / HZ); mod_timer(&obd->obd_recovery_timer, jiffies + OBD_RECOVERY_TIMEOUT); } @@ -713,8 +712,7 @@ int target_queue_final_reply(struct ptlrpc_request *req, int rc) if (recovery_done) { struct list_head *tmp, *n; ldlm_reprocess_all_ns(req->rq_export->exp_obd->obd_namespace); - CDEBUG(D_ERROR, - "%s: all clients recovered, sending delayed replies\n", + CERROR("%s: all clients recovered, sending delayed replies\n", obd->obd_name); obd->obd_recovering = 0; list_for_each_safe(tmp, n, &obd->obd_delayed_reply_queue) { diff --git a/lustre/mdc/mdc_internal.h b/lustre/mdc/mdc_internal.h index e39a0aa..49d85ab2 100644 --- a/lustre/mdc/mdc_internal.h +++ b/lustre/mdc/mdc_internal.h @@ -1,24 +1,25 @@ -void mds_pack_req_body(struct ptlrpc_request *); -void mds_pack_rep_body(struct ptlrpc_request *); -void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size, +void mdc_pack_req_body(struct ptlrpc_request *); +void mdc_pack_rep_body(struct ptlrpc_request *); +void mdc_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size, obd_id ino, int type); -void mds_getattr_pack(struct ptlrpc_request *req, int valid, int offset, +void mdc_getattr_pack(struct ptlrpc_request *req, int valid, int offset, int flags, struct mdc_op_data *data); -void mds_setattr_pack(struct ptlrpc_request *req, +void mdc_setattr_pack(struct ptlrpc_request *req, struct mdc_op_data *data, - struct iattr *iattr, void *ea, int ealen); -void mds_create_pack(struct ptlrpc_request *req, int offset, + struct iattr *iattr, void *ea, int ealen, + void *ea2, int ea2len); +void mdc_create_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time, const void *data, int datalen); -void mds_open_pack(struct ptlrpc_request *req, int offset, +void mdc_open_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time, __u32 flags, const void *data, int datalen); -void mds_unlink_pack(struct ptlrpc_request *req, int offset, +void mdc_unlink_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data); -void mds_link_pack(struct ptlrpc_request *req, int offset, +void mdc_link_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data); -void mds_rename_pack(struct ptlrpc_request *req, int offset, +void mdc_rename_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data, const char *old, int oldlen, const char *new, int newlen); diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index 1396f8d..a17f7a1 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -28,7 +28,7 @@ #include #include -void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size, +void mdc_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size, obd_id ino, int type, __u64 xid) { struct mds_body *b; @@ -45,7 +45,7 @@ void mds_readdir_pack(struct ptlrpc_request *req, __u64 offset, __u32 size, b->nlink = size; /* !! */ } -static void mds_pack_body(struct mds_body *b) +static void mdc_pack_body(struct mds_body *b) { LASSERT (b != NULL); @@ -54,14 +54,14 @@ static void mds_pack_body(struct mds_body *b) b->capability = current->cap_effective; } -void mds_pack_req_body(struct ptlrpc_request *req) +void mdc_pack_req_body(struct ptlrpc_request *req) { struct mds_body *b = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*b)); - mds_pack_body(b); + mdc_pack_body(b); } /* packing of MDS records */ -void mds_create_pack(struct ptlrpc_request *req, int offset, +void mdc_create_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time, const void *data, int datalen) @@ -94,12 +94,12 @@ void mds_create_pack(struct ptlrpc_request *req, int offset, memcpy (tmp, data, datalen); } } + /* packing of MDS records */ -void mds_open_pack(struct ptlrpc_request *req, int offset, +void mdc_open_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, __u32 mode, __u64 rdev, __u32 uid, __u32 gid, __u64 time, - __u32 flags, - const void *data, int datalen) + __u32 flags, const void *data, int datalen) { struct mds_rec_create *rec; char *tmp; @@ -110,8 +110,9 @@ void mds_open_pack(struct ptlrpc_request *req, int offset, rec->cr_fsuid = current->fsuid; rec->cr_fsgid = current->fsgid; rec->cr_cap = current->cap_effective; - ll_ino2fid(&rec->cr_fid, op_data->ino1, - op_data->gen1, op_data->typ1); + if (op_data != NULL) + ll_ino2fid(&rec->cr_fid, op_data->ino1, + op_data->gen1, op_data->typ1); memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid)); rec->cr_mode = mode; rec->cr_flags = flags; @@ -124,17 +125,22 @@ void mds_open_pack(struct ptlrpc_request *req, int offset, else rec->cr_suppgid = -1; - tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, op_data->namelen + 1); - LOGL0(op_data->name, op_data->namelen, tmp); + if (op_data->name) { + tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, + op_data->namelen + 1); + LOGL0(op_data->name, op_data->namelen, tmp); + } if (data) { tmp = lustre_msg_buf(req->rq_reqmsg, offset + 2, datalen); memcpy (tmp, data, datalen); } } -void mds_setattr_pack(struct ptlrpc_request *req, + +void mdc_setattr_pack(struct ptlrpc_request *req, struct mdc_op_data *data, - struct iattr *iattr, void *ea, int ealen) + struct iattr *iattr, void *ea, int ealen, + void *ea2, int ea2len) { struct mds_rec_setattr *rec = lustre_msg_buf(req->rq_reqmsg, 0, sizeof (*rec)); @@ -164,11 +170,18 @@ void mds_setattr_pack(struct ptlrpc_request *req, rec->sa_suppgid = -1; } - if (ealen != 0) - memcpy(lustre_msg_buf(req->rq_reqmsg, 1, ealen), ea, ealen); + if (ealen == 0) + return; + + memcpy(lustre_msg_buf(req->rq_reqmsg, 1, ealen), ea, ealen); + + if (ea2len == 0) + return; + + memcpy(lustre_msg_buf(req->rq_reqmsg, 2, ea2len), ea2, ea2len); } -void mds_unlink_pack(struct ptlrpc_request *req, int offset, +void mdc_unlink_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data) { struct mds_rec_unlink *rec; @@ -195,7 +208,7 @@ void mds_unlink_pack(struct ptlrpc_request *req, int offset, LOGL0(data->name, data->namelen, tmp); } -void mds_link_pack(struct ptlrpc_request *req, int offset, +void mdc_link_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data) { struct mds_rec_link *rec; @@ -222,7 +235,7 @@ void mds_link_pack(struct ptlrpc_request *req, int offset, LOGL0(data->name, data->namelen, tmp); } -void mds_rename_pack(struct ptlrpc_request *req, int offset, +void mdc_rename_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data, const char *old, int oldlen, const char *new, int newlen) { @@ -256,7 +269,7 @@ void mds_rename_pack(struct ptlrpc_request *req, int offset, } } -void mds_getattr_pack(struct ptlrpc_request *req, int valid, int offset, +void mdc_getattr_pack(struct ptlrpc_request *req, int valid, int offset, int flags, struct mdc_op_data *data) { struct mds_body *b; diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c index 8f16795..a72e176 100644 --- a/lustre/mds/mds_lib.c +++ b/lustre/mds/mds_lib.c @@ -80,10 +80,12 @@ void mds_pack_inode2body(struct mds_body *b, struct inode *inode) b->gid = inode->i_gid; b->flags = inode->i_flags; b->rdev = b->rdev; - b->nlink = inode->i_nlink; + /* Return the correct link count for orphan inodes */ + b->nlink = mds_inode_is_orphan(inode) ? 0 : inode->i_nlink; b->generation = inode->i_generation; b->suppgid = -1; } + /* unpacking */ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, struct mds_update_record *r) @@ -92,8 +94,8 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, struct mds_rec_setattr *rec; ENTRY; - rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), - lustre_swab_mds_rec_setattr); + rec = lustre_swab_reqbuf(req, offset, sizeof(*rec), + lustre_swab_mds_rec_setattr); if (rec == NULL) RETURN (-EFAULT); @@ -120,9 +122,14 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, if (r->ur_eadata == NULL) RETURN (-EFAULT); r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 1]; - } else { - r->ur_eadata = NULL; - r->ur_eadatalen = 0; + } + + if (req->rq_reqmsg->bufcount > offset + 2) { + r->ur_logcookies = lustre_msg_buf(req->rq_reqmsg, offset + 2,0); + if (r->ur_eadata == NULL) + RETURN (-EFAULT); + + r->ur_cookielen = req->rq_reqmsg->buflens[offset + 2]; } RETURN(0); @@ -172,9 +179,6 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset, if (r->ur_tgt == NULL) RETURN (-EFAULT); r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2]; - } else { - r->ur_tgt = NULL; - r->ur_tgtlen = 0; } RETURN(0); } diff --git a/lustre/portals/utils/wirecheck.c b/lustre/portals/utils/wirecheck.c index 52a37c2f..6a4377b 100644 --- a/lustre/portals/utils/wirecheck.c +++ b/lustre/portals/utils/wirecheck.c @@ -30,25 +30,25 @@ do { \ #define CHECK_MEMBER_OFFSET(s,m) \ do { \ - CHECK_VALUE (offsetof (s, m)); \ + CHECK_VALUE(offsetof(s, m)); \ } while (0) -#define CHECK_MEMBER_SIZEOF(s,m) \ -do { \ - CHECK_VALUE (sizeof (((s *)0)->m)); \ +#define CHECK_MEMBER_SIZEOF(s,m) \ +do { \ + CHECK_VALUE((int)sizeof(((s *)0)->m)); \ } while (0) #define CHECK_MEMBER(s,m) \ do { \ - CHECK_MEMBER_OFFSET (s, m); \ - CHECK_MEMBER_SIZEOF (s, m); \ + CHECK_MEMBER_OFFSET(s, m); \ + CHECK_MEMBER_SIZEOF(s, m); \ } while (0) #define CHECK_STRUCT(s) \ do { \ - BLANK_LINE (); \ + BLANK_LINE (); \ COMMENT ("Checks for struct "#s); \ - CHECK_VALUE (sizeof (s)); \ + CHECK_VALUE((int)sizeof(s)); \ } while (0) void diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index 7f2c3d0..5b6a589 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -17,34 +17,34 @@ do { \ #define CHECK_DEFINE(a) \ do { \ - printf (" LASSERT ("#a" == "STRINGIFY(a)");\n"); \ + printf(" LASSERT ("#a" == "STRINGIFY(a)");\n"); \ } while (0) #define CHECK_VALUE(a) \ do { \ - printf (" LASSERT ("#a" == %d);\n", a); \ + printf(" LASSERT ("#a" == %d);\n", a); \ } while (0) #define CHECK_MEMBER_OFFSET(s,m) \ do { \ - CHECK_VALUE (offsetof (struct s, m)); \ + CHECK_VALUE(offsetof (struct s, m)); \ } while (0) #define CHECK_MEMBER_SIZEOF(s,m) \ do { \ - CHECK_VALUE (sizeof (((struct s *)0)->m)); \ + CHECK_VALUE((int)sizeof(((struct s *)0)->m)); \ } while (0) #define CHECK_MEMBER(s,m) \ do { \ - CHECK_MEMBER_OFFSET (s, m); \ - CHECK_MEMBER_SIZEOF (s, m); \ + CHECK_MEMBER_OFFSET(s, m); \ + CHECK_MEMBER_SIZEOF(s, m); \ } while (0) #define CHECK_STRUCT(s) \ do { \ - COMMENT ("Checks for struct "#s); \ - CHECK_VALUE (sizeof (struct s)); \ + COMMENT("Checks for struct "#s); \ + CHECK_VALUE((int)sizeof(struct s)); \ } while (0) -- 1.8.3.1