1d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 2d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER START 3d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 4d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 6d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is free software; you can redistribute it and/or modify 7d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * it under the terms of the GNU General Public License version 2 only, 8d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * as published by the Free Software Foundation. 9d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 10d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is distributed in the hope that it will be useful, but 11d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * WITHOUT ANY WARRANTY; without even the implied warranty of 12d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * General Public License version 2 for more details (a copy is included 14d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * in the LICENSE file that accompanied this code). 15d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 16d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * You should have received a copy of the GNU General Public License 17d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * version 2 along with this program; If not, see 18d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 20d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * CA 95054 USA or visit www.sun.com if you need additional information or 22d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * have any questions. 23d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 24d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER END 25d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 26d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 27d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Use is subject to license terms. 29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2011, 2012, Intel Corporation. 31d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 32d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 33d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This file is part of Lustre, http://www.lustre.org/ 34d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Lustre is a trademark of Sun Microsystems, Inc. 35d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 36d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * cl code shared between vvp and liblustre (and other Lustre clients in the 37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * future). 38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 39d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 4067a235f5e5893bc7dc86cf0e867fdb3f9041df18Greg Kroah-Hartman#include "../include/obd_class.h" 4167a235f5e5893bc7dc86cf0e867fdb3f9041df18Greg Kroah-Hartman#include "../include/obd_support.h" 4267a235f5e5893bc7dc86cf0e867fdb3f9041df18Greg Kroah-Hartman#include "../include/obd.h" 4367a235f5e5893bc7dc86cf0e867fdb3f9041df18Greg Kroah-Hartman#include "../include/cl_object.h" 4467a235f5e5893bc7dc86cf0e867fdb3f9041df18Greg Kroah-Hartman#include "../include/lclient.h" 45d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 4667a235f5e5893bc7dc86cf0e867fdb3f9041df18Greg Kroah-Hartman#include "../include/lustre_lite.h" 47d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 48d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 49d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* Initialize the default and maximum LOV EA and cookie sizes. This allows 50d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * us to make MDS RPCs with large enough reply buffers to hold the 51d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * maximum-sized (= maximum striped) EA and cookie without having to 52d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * calculate this (via a call into the LOV + OSCs) each time we make an RPC. */ 53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint cl_init_ea_size(struct obd_export *md_exp, struct obd_export *dt_exp) 54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lov_stripe_md lsm = { .lsm_magic = LOV_MAGIC_V3 }; 56d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 valsize = sizeof(struct lov_desc); 57d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc, easize, def_easize, cookiesize; 58d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lov_desc desc; 5944779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf __u16 stripes, def_stripes; 60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = obd_get_info(NULL, dt_exp, sizeof(KEY_LOVDESC), KEY_LOVDESC, 62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &valsize, &desc, NULL); 63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 640a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 662df2b3a8be2acd461036283354b42b6436a349e1Anil Belur stripes = min_t(__u32, desc.ld_tgt_count, LOV_MAX_STRIPE_COUNT); 67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lsm.lsm_stripe_count = stripes; 68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao easize = obd_size_diskmd(dt_exp, &lsm); 69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 7044779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf def_stripes = min_t(__u32, desc.ld_default_stripe_count, 7144779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf LOV_MAX_STRIPE_COUNT); 7244779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf lsm.lsm_stripe_count = def_stripes; 73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao def_easize = obd_size_diskmd(dt_exp, &lsm); 74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cookiesize = stripes * sizeof(struct llog_cookie); 76d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 7744779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf /* default cookiesize is 0 because from 2.4 server doesn't send 7844779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf * llog cookies to client. */ 7944779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf CDEBUG(D_HA, 8044779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf "updating def/max_easize: %d/%d def/max_cookiesize: 0/%d\n", 8144779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf def_easize, easize, cookiesize); 82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 8344779340c6dcb8c858955c02b3aeef7d6b28a684Brian Behlendorf rc = md_init_ea_size(md_exp, easize, def_easize, cookiesize, 0); 840a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 85d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This function is used as an upcall-callback hooked by liblustre and llite 89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * clients into obd_notify() listeners chain to handle notifications about 90d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * change of import connect_flags. See llu_fsswop_mount() and 91d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lustre_common_fill_super(). 92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 93d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint cl_ocd_update(struct obd_device *host, 94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *watched, 95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao enum obd_notify_event ev, void *owner, void *data) 96d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 97d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_client_ocd *lco; 98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli; 99d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 flags; 100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int result; 101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!strcmp(watched->obd_type->typ_name, LUSTRE_OSC_NAME)) { 103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli = &watched->u.cli; 104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lco = owner; 105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao flags = cli->cl_import->imp_connect_data.ocd_connect_flags; 10655f5a824b9e727eb159905475028d3cb52370276Greg Kroah-Hartman CDEBUG(D_SUPER, "Changing connect_flags: %#llx -> %#llx\n", 107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lco->lco_flags, flags); 108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao mutex_lock(&lco->lco_lock); 109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lco->lco_flags &= flags; 110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* for each osc event update ea size */ 111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (lco->lco_dt_exp) 112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_init_ea_size(lco->lco_md_exp, lco->lco_dt_exp); 113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao mutex_unlock(&lco->lco_lock); 115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = 0; 116d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("unexpected notification from %s %s!\n", 118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao watched->obd_type->typ_name, 119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao watched->obd_name); 120d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -EINVAL; 121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 1220a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return result; 123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define GROUPLOCK_SCOPE "grouplock" 126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint cl_get_grouplock(struct cl_object *obj, unsigned long gid, int nonblock, 128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ccc_grouplock *cg) 129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_env *env; 131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct cl_io *io; 132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct cl_lock *lock; 133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct cl_lock_descr *descr; 134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 enqflags; 135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int refcheck; 136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao env = cl_env_get(&refcheck); 139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (IS_ERR(env)) 140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return PTR_ERR(env); 141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao io = ccc_env_thread_io(env); 143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao io->ci_obj = obj; 144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao io->ci_ignore_layout = 1; 145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = cl_io_init(env, io, CIT_MISC, io->ci_obj); 147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) { 14848d23e612721d7e08dd8b13f5b8fbd12c6f88181Jinshan Xiong /* Does not make sense to take GL for released layout */ 14948d23e612721d7e08dd8b13f5b8fbd12c6f88181Jinshan Xiong if (rc > 0) 15048d23e612721d7e08dd8b13f5b8fbd12c6f88181Jinshan Xiong rc = -ENOTSUPP; 151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_env_put(env, &refcheck); 152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr = &ccc_env_info(env)->cti_descr; 156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr->cld_obj = obj; 157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr->cld_start = 0; 158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr->cld_end = CL_PAGE_EOF; 159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr->cld_gid = gid; 160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr->cld_mode = CLM_GROUP; 161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao enqflags = CEF_MUST | (nonblock ? CEF_NONBLOCK : 0); 163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao descr->cld_enq_flags = enqflags; 164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lock = cl_lock_request(env, io, descr, GROUPLOCK_SCOPE, current); 166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (IS_ERR(lock)) { 167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_io_fini(env, io); 168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_env_put(env, &refcheck); 169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return PTR_ERR(lock); 170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cg->cg_env = cl_env_get(&refcheck); 173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cg->cg_io = io; 174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cg->cg_lock = lock; 175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cg->cg_gid = gid; 176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(cg->cg_env == env); 177d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 178d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_env_unplant(env, &refcheck); 179d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid cl_put_grouplock(struct ccc_grouplock *cg) 183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lu_env *env = cg->cg_env; 185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct cl_io *io = cg->cg_io; 186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct cl_lock *lock = cg->cg_lock; 187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int refcheck; 188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(cg->cg_env); 190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(cg->cg_gid); 191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_env_implant(env, &refcheck); 193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_env_put(env, &refcheck); 194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_unuse(env, lock); 196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_lock_release(env, lock, GROUPLOCK_SCOPE, current); 197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_io_fini(env, io); 198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cl_env_put(env, NULL); 199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 200