X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fllog_client.c;h=b51472785af962b06a71dceba637e2f92ec6e380;hb=512f2ff1b17db4d03979a1caa86f94defc6653b4;hp=7e4b12d6251130a861ccf2d61bb5d86ea9a3b74b;hpb=81c713adebdb2a4c9340ba28a9c8f9310c9e76a0;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/llog_client.c b/lustre/ptlrpc/llog_client.c index 7e4b12d..b514727 100644 --- a/lustre/ptlrpc/llog_client.c +++ b/lustre/ptlrpc/llog_client.c @@ -1,50 +1,56 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START * - * Copyright (C) 2001-2004 Cluster File Systems, Inc. - * Author: Andreas Dilger + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of the Lustre file system, http://www.lustre.org - * Lustre is a trademark of Cluster File Systems, Inc. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * You may have signed or agreed to another license before downloading - * this software. If so, you are bound by the terms and conditions - * of that agreement, and the following does not apply to you. See the - * LICENSE file included with this distribution for more information. + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * If you did not agree to a different license, then this copy of Lustre - * is open source software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * In either case, Lustre is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * license text for more details. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * - * remote api for llog - client side + * GPL HEADER END + */ +/* + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + * + * Copyright (c) 2012, 2014, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/ptlrpc/llog_client.c * + * remote api for llog - client side + * + * Author: Andreas Dilger */ #define DEBUG_SUBSYSTEM S_LOG -#ifndef EXPORT_SYMTAB -#define EXPORT_SYMTAB -#endif - -#ifdef __KERNEL__ #include -#else -#include -#endif #include #include #include #include -#define LLOG_CLIENT_ENTRY(ctxt, imp) do { \ - mutex_down(&ctxt->loc_sem); \ +#define LLOG_CLIENT_ENTRY(ctxt, imp) do { \ + mutex_lock(&ctxt->loc_mutex); \ if (ctxt->loc_imp) { \ imp = class_import_get(ctxt->loc_imp); \ } else { \ @@ -53,43 +59,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); \ - if (ctxt->loc_imp != imp) \ - CWARN("loc_imp has changed from %p to %p", \ - ctxt->loc_imp, imp); \ - class_import_put(imp); \ - mutex_up(&ctxt->loc_sem); \ +#define LLOG_CLIENT_EXIT(ctxt, imp) do { \ + 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_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, @@ -99,7 +105,8 @@ static int llog_client_create(struct llog_ctxt *ctxt, struct llog_handle **res, LLOG_ORIGIN_HANDLE_CREATE); if (rc) { ptlrpc_request_free(req); - GOTO(err_free, rc); + req = NULL; + GOTO(out, rc); } ptlrpc_request_set_replen(req); @@ -118,25 +125,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; @@ -155,9 +160,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); @@ -165,9 +174,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; @@ -182,7 +192,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; @@ -219,8 +229,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; @@ -267,7 +278,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; @@ -322,7 +334,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 @@ -330,12 +343,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);