X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdfilter%2Ffilter_log.c;h=e32bea29856a25a57a8d18b5f6de6b6737891926;hb=refs%2Ftags%2F1.10.0.41a;hp=b5cd83e0eba3d9bcc1720257d5b868402152c63d;hpb=710e1a34bada840db26198d8333d6477e536ef86;p=fs%2Flustre-release.git diff --git a/lustre/obdfilter/filter_log.c b/lustre/obdfilter/filter_log.c index b5cd83e..e32bea2 100644 --- a/lustre/obdfilter/filter_log.c +++ b/lustre/obdfilter/filter_log.c @@ -1,30 +1,43 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * linux/fs/obdfilter/filter_log.c + * GPL HEADER START * - * Copyright (c) 2001-2003 Cluster File Systems, Inc. - * Author: Peter Braam - * Author: Andreas Dilger - * Author: Phil Schwan + * 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. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/obdfilter/filter_log.c + * + * Author: Peter Braam + * Author: Andreas Dilger + * Author: Phil Schwan */ #define DEBUG_SUBSYSTEM S_FILTER @@ -37,9 +50,8 @@ #include #include +#include #include -#include - #include "filter_internal.h" int filter_log_sz_change(struct llog_handle *cathandle, @@ -54,7 +66,7 @@ int filter_log_sz_change(struct llog_handle *cathandle, ENTRY; LOCK_INODE_MUTEX(inode); - ofd = inode->i_filterdata; + ofd = INODE_PRIVATE_DATA(inode); if (ofd && ofd->ofd_epoch >= ioepoch) { if (ofd->ofd_epoch > ioepoch) @@ -71,7 +83,7 @@ int filter_log_sz_change(struct llog_handle *cathandle, if (!ofd) GOTO(out, rc = -ENOMEM); igrab(inode); - inode->i_filterdata = ofd; + INODE_PRIVATE_DATA(inode) = ofd; ofd->ofd_epoch = ioepoch; } /* the decision to write a record is now made, unlock */ @@ -102,29 +114,38 @@ void filter_cancel_cookies_cb(struct obd_device *obd, __u64 transno, void *cb_data, int error) { struct llog_cookie *cookie = cb_data; - struct obd_llogs *llogs; + struct obd_llog_group *olg; struct llog_ctxt *ctxt; - + int rc; + /* we have to find context for right group */ - if (error != 0) { - CDEBUG(D_INODE, "not cancelling llog cookie on error %d\n", - error); - goto out; + if (error != 0 || obd->obd_stopping) { + CDEBUG(D_INODE, "not cancel logcookie err %d stopping %d \n", + error, obd->obd_stopping); + GOTO (out, rc = 0); } - llogs = filter_grab_llog_for_group(obd, cookie->lgc_lgl.lgl_ogr, NULL); - - if (llogs) { - ctxt = llog_get_context_from_llogs(llogs, cookie->lgc_subsys + 1); - if (ctxt) { - llog_cancel(ctxt, NULL, 1, cookie, 0); - } else - CERROR("no valid context for group "LPU64"\n", - cookie->lgc_lgl.lgl_ogr); - } else { + + olg = filter_find_olg(obd, cookie->lgc_lgl.lgl_ogr); + if (!olg) { CDEBUG(D_HA, "unknown group "LPU64"!\n", cookie->lgc_lgl.lgl_ogr); + GOTO(out, rc = 0); + } + + ctxt = llog_group_get_ctxt(olg, cookie->lgc_subsys + 1); + if (!ctxt) { + CERROR("no valid context for group "LPU64"\n", + cookie->lgc_lgl.lgl_ogr); + GOTO(out, rc = 0); } + + OBD_FAIL_TIMEOUT(OBD_FAIL_OST_CANCEL_COOKIE_TIMEOUT, 30); + + rc = llog_cancel(ctxt, NULL, 1, cookie, 0); + if (rc) + CERROR("error cancelling log cookies: rc = %d\n", rc); + llog_ctxt_put(ctxt); out: - OBD_FREE(cookie, sizeof(struct llog_cookie)); + OBD_FREE(cookie, sizeof(*cookie)); } /* Callback for processing the unlink log record received from MDS by @@ -133,35 +154,41 @@ static int filter_recov_log_unlink_cb(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec, struct llog_cookie *cookie) { - struct obd_device *obd = ctxt->loc_obd; - struct obd_export *exp = obd->obd_self_export; + struct obd_export *exp = ctxt->loc_obd->obd_self_export; struct llog_unlink_rec *lur; struct obdo *oa; obd_id oid; + obd_count count; int rc = 0; ENTRY; lur = (struct llog_unlink_rec *)rec; OBDO_ALLOC(oa); - if (oa == NULL) + if (oa == NULL) RETURN(-ENOMEM); oa->o_valid |= OBD_MD_FLCOOKIE; oa->o_id = lur->lur_oid; - oa->o_gr = lur->lur_ogen; + oa->o_gr = lur->lur_ogr; oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; - memcpy(obdo_logcookie(oa), cookie, sizeof(*cookie)); + oa->o_lcookie = *cookie; oid = oa->o_id; + /* objid gap may require to destroy several objects in row */ + count = lur->lur_count + 1; - rc = filter_destroy(exp, oa, NULL, NULL, NULL); - OBDO_FREE(oa); - if (rc == -ENOENT) { - CDEBUG(D_RPCTRACE, "object already removed, send cookie\n"); - llog_cancel(ctxt, NULL, 1, cookie, 0); - RETURN(0); + while (count > 0) { + rc = filter_destroy(exp, oa, NULL, NULL, NULL, NULL); + if (rc == 0) + CDEBUG(D_RPCTRACE, "object "LPU64" is destroyed\n", + oid); + else if (rc != -ENOENT) + CEMERG("error destroying object "LPU64": %d\n", + oid, rc); + else + rc = 0; + count--; + oid++; } - - if (rc == 0) - CDEBUG(D_RPCTRACE, "object "LPU64" is destroyed\n", oid); + OBDO_FREE(oa); RETURN(rc); } @@ -174,25 +201,35 @@ static int filter_recov_log_setattr_cb(struct llog_ctxt *ctxt, { struct obd_device *obd = ctxt->loc_obd; struct obd_export *exp = obd->obd_self_export; - struct llog_setattr_rec *lsr; struct obd_info oinfo = { { { 0 } } }; obd_id oid; int rc = 0; ENTRY; - lsr = (struct llog_setattr_rec *)rec; OBDO_ALLOC(oinfo.oi_oa); if (oinfo.oi_oa == NULL) RETURN(-ENOMEM); + if (rec->lrh_type == MDS_SETATTR_REC) { + struct llog_setattr_rec *lsr = (struct llog_setattr_rec *)rec; + + oinfo.oi_oa->o_id = lsr->lsr_oid; + oinfo.oi_oa->o_gr = lsr->lsr_ogr; + oinfo.oi_oa->o_uid = lsr->lsr_uid; + oinfo.oi_oa->o_gid = lsr->lsr_gid; + } else { + struct llog_setattr64_rec *lsr = (struct llog_setattr64_rec *)rec; + + oinfo.oi_oa->o_id = lsr->lsr_oid; + oinfo.oi_oa->o_gr = lsr->lsr_ogr; + oinfo.oi_oa->o_uid = lsr->lsr_uid; + oinfo.oi_oa->o_gid = lsr->lsr_gid; + } + oinfo.oi_oa->o_valid |= (OBD_MD_FLID | OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLCOOKIE); - oinfo.oi_oa->o_id = lsr->lsr_oid; - oinfo.oi_oa->o_gr = lsr->lsr_ogen; oinfo.oi_oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; - oinfo.oi_oa->o_uid = lsr->lsr_uid; - oinfo.oi_oa->o_gid = lsr->lsr_gid; - memcpy(obdo_logcookie(oinfo.oi_oa), cookie, sizeof(*cookie)); + oinfo.oi_oa->o_lcookie = *cookie; oid = oinfo.oi_oa->o_id; rc = filter_setattr(exp, &oinfo, NULL); @@ -211,18 +248,29 @@ static int filter_recov_log_setattr_cb(struct llog_ctxt *ctxt, } int filter_recov_log_mds_ost_cb(struct llog_handle *llh, - struct llog_rec_hdr *rec, void *data) + struct llog_rec_hdr *rec, void *data) { struct llog_ctxt *ctxt = llh->lgh_ctxt; struct llog_cookie cookie; int rc = 0; ENTRY; + if (ctxt->loc_obd->obd_stopping) + RETURN(LLOG_PROC_BREAK); + + if (rec == NULL) { + cfs_spin_lock_bh(&ctxt->loc_obd->obd_processing_task_lock); + ctxt->loc_obd->u.filter.fo_mds_ost_sync = 0; + cfs_spin_unlock_bh(&ctxt->loc_obd->obd_processing_task_lock); + RETURN(0); + } + if (!(llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN)) { CERROR("log is not plain\n"); RETURN(-EINVAL); } + OBD_FAIL_TIMEOUT(OBD_FAIL_OST_LLOG_RECOVERY_TIMEOUT, 30); cookie.lgc_lgl = llh->lgh_id; cookie.lgc_subsys = LLOG_MDS_OST_ORIG_CTXT; cookie.lgc_index = rec->lrh_index; @@ -232,6 +280,7 @@ int filter_recov_log_mds_ost_cb(struct llog_handle *llh, rc = filter_recov_log_unlink_cb(ctxt, rec, &cookie); break; case MDS_SETATTR_REC: + case MDS_SETATTR64_REC: rc = filter_recov_log_setattr_cb(ctxt, rec, &cookie); break; case LLOG_GEN_REC: {