X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fllog_client.c;h=cad3e24526e9ab555c732039ef4c182a98ea39b6;hb=d5390bbde9b525b13ab91f5610abe1c4bb98eff9;hp=bded4c3c728c3d5e5cf3c0a5b2d54d289410c945;hpb=d7b64514067e47cce570e75c2dbc923b14fe9c5c;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/llog_client.c b/lustre/ptlrpc/llog_client.c index bded4c3..cad3e24 100644 --- a/lustre/ptlrpc/llog_client.c +++ b/lustre/ptlrpc/llog_client.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. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -42,10 +42,6 @@ #define DEBUG_SUBSYSTEM S_LOG -#ifndef EXPORT_SYMTAB -#define EXPORT_SYMTAB -#endif - #ifdef __KERNEL__ #include #else @@ -58,7 +54,7 @@ #include #define LLOG_CLIENT_ENTRY(ctxt, imp) do { \ - mutex_down(&ctxt->loc_sem); \ + mutex_lock(&ctxt->loc_mutex); \ if (ctxt->loc_imp) { \ imp = class_import_get(ctxt->loc_imp); \ } else { \ @@ -67,43 +63,43 @@ "but I'll try again next time. Not fatal.\n", \ ctxt->loc_idx); \ imp = NULL; \ - mutex_up(&ctxt->loc_sem); \ + mutex_unlock(&ctxt->loc_mutex); \ return (-EINVAL); \ } \ - mutex_up(&ctxt->loc_sem); \ + mutex_unlock(&ctxt->loc_mutex); \ } while(0) #define LLOG_CLIENT_EXIT(ctxt, imp) do { \ - mutex_down(&ctxt->loc_sem); \ + mutex_lock(&ctxt->loc_mutex); \ if (ctxt->loc_imp != imp) \ CWARN("loc_imp has changed from %p to %p\n", \ ctxt->loc_imp, imp); \ class_import_put(imp); \ - mutex_up(&ctxt->loc_sem); \ + mutex_unlock(&ctxt->loc_mutex); \ } while(0) /* This is a callback from the llog_* functions. * Assumes caller has already pushed us into the kernel context. */ -static int llog_client_create(struct llog_ctxt *ctxt, struct llog_handle **res, - struct llog_logid *logid, char *name) +static int llog_client_open(const struct lu_env *env, + struct llog_handle *lgh, struct llog_logid *logid, + char *name, enum llog_open_param open_param) { struct obd_import *imp; struct llogd_body *body; - struct llog_handle *handle; + struct llog_ctxt *ctxt = lgh->lgh_ctxt; struct ptlrpc_request *req = NULL; int rc; ENTRY; LLOG_CLIENT_ENTRY(ctxt, imp); - handle = llog_alloc_handle(); - if (handle == NULL) - RETURN(-ENOMEM); - *res = handle; + /* client cannot create llog */ + LASSERTF(open_param != LLOG_OPEN_NEW, "%#x\n", open_param); + LASSERT(lgh); - req = ptlrpc_request_alloc(imp, &RQF_LLOG_ORIGIN_HANDLE_CREATE); - if (req == NULL) - GOTO(err_free, rc = -ENOMEM); + req = ptlrpc_request_alloc(imp, &RQF_LLOG_ORIGIN_HANDLE_CREATE); + if (req == NULL) + GOTO(out, rc = -ENOMEM); if (name) req_capsule_set_size(&req->rq_pill, &RMF_NAME, RCL_CLIENT, @@ -114,7 +110,7 @@ static int llog_client_create(struct llog_ctxt *ctxt, struct llog_handle **res, if (rc) { ptlrpc_request_free(req); req = NULL; - GOTO(err_free, rc); + GOTO(out, rc); } ptlrpc_request_set_replen(req); @@ -133,25 +129,23 @@ static int llog_client_create(struct llog_ctxt *ctxt, struct llog_handle **res, rc = ptlrpc_queue_wait(req); if (rc) - GOTO(err_free, rc); + GOTO(out, rc); - body = req_capsule_server_get(&req->rq_pill, &RMF_LLOGD_BODY); - if (body == NULL) - GOTO(err_free, rc =-EFAULT); + body = req_capsule_server_get(&req->rq_pill, &RMF_LLOGD_BODY); + if (body == NULL) + GOTO(out, rc = -EFAULT); - handle->lgh_id = body->lgd_logid; - handle->lgh_ctxt = ctxt; - EXIT; + lgh->lgh_id = body->lgd_logid; + lgh->lgh_ctxt = ctxt; + EXIT; out: - LLOG_CLIENT_EXIT(ctxt, imp); - ptlrpc_req_finished(req); - return rc; -err_free: - llog_free_handle(handle); - goto out; + LLOG_CLIENT_EXIT(ctxt, imp); + ptlrpc_req_finished(req); + return rc; } -static int llog_client_destroy(struct llog_handle *loghandle) +static int llog_client_destroy(const struct lu_env *env, + struct llog_handle *loghandle) { struct obd_import *imp; struct ptlrpc_request *req = NULL; @@ -170,9 +164,13 @@ static int llog_client_destroy(struct llog_handle *loghandle) body->lgd_logid = loghandle->lgh_id; body->lgd_llh_flags = loghandle->lgh_hdr->llh_flags; + if (!(body->lgd_llh_flags & LLOG_F_IS_PLAIN)) + CERROR("%s: wrong llog flags %x\n", imp->imp_obd->obd_name, + body->lgd_llh_flags); + ptlrpc_request_set_replen(req); rc = ptlrpc_queue_wait(req); - + ptlrpc_req_finished(req); err_exit: LLOG_CLIENT_EXIT(loghandle->lgh_ctxt, imp); @@ -180,9 +178,10 @@ err_exit: } -static int llog_client_next_block(struct llog_handle *loghandle, - int *cur_idx, int next_idx, - __u64 *cur_offset, void *buf, int len) +static int llog_client_next_block(const struct lu_env *env, + struct llog_handle *loghandle, + int *cur_idx, int next_idx, + __u64 *cur_offset, void *buf, int len) { struct obd_import *imp; struct ptlrpc_request *req = NULL; @@ -197,7 +196,7 @@ static int llog_client_next_block(struct llog_handle *loghandle, LLOG_ORIGIN_HANDLE_NEXT_BLOCK); if (req == NULL) GOTO(err_exit, rc =-ENOMEM); - + body = req_capsule_client_get(&req->rq_pill, &RMF_LLOGD_BODY); body->lgd_logid = loghandle->lgh_id; body->lgd_ctxt_idx = loghandle->lgh_ctxt->loc_idx - 1; @@ -234,8 +233,9 @@ err_exit: return rc; } -static int llog_client_prev_block(struct llog_handle *loghandle, - int prev_idx, void *buf, int len) +static int llog_client_prev_block(const struct lu_env *env, + struct llog_handle *loghandle, + int prev_idx, void *buf, int len) { struct obd_import *imp; struct ptlrpc_request *req = NULL; @@ -282,7 +282,8 @@ err_exit: return rc; } -static int llog_client_read_header(struct llog_handle *handle) +static int llog_client_read_header(const struct lu_env *env, + struct llog_handle *handle) { struct obd_import *imp; struct ptlrpc_request *req = NULL; @@ -337,7 +338,8 @@ err_exit: return rc; } -static int llog_client_close(struct llog_handle *handle) +static int llog_client_close(const struct lu_env *env, + struct llog_handle *handle) { /* this doesn't call LLOG_ORIGIN_HANDLE_CLOSE because the servers all close the file at the end of every @@ -345,12 +347,12 @@ static int llog_client_close(struct llog_handle *handle) return(0); } - struct llog_operations llog_client_ops = { - lop_next_block: llog_client_next_block, - lop_prev_block: llog_client_prev_block, - lop_read_header: llog_client_read_header, - lop_create: llog_client_create, - lop_destroy: llog_client_destroy, - lop_close: llog_client_close, + .lop_next_block = llog_client_next_block, + .lop_prev_block = llog_client_prev_block, + .lop_read_header = llog_client_read_header, + .lop_open = llog_client_open, + .lop_destroy = llog_client_destroy, + .lop_close = llog_client_close, }; +EXPORT_SYMBOL(llog_client_ops);