* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2013, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
{
if (ofd_obd(ofd)->obd_self_export == exp)
/* Grant enough space to handle a big precreate request */
- return OST_MAX_PRECREATE * ofd->ofd_dt_conf.ddp_inodespace;
+ return OST_MAX_PRECREATE * ofd->ofd_dt_conf.ddp_inodespace / 2;
if (ofd_grant_compat(exp, ofd))
/* Try to grant enough space to send a full-size RPC */
obd_size unstable;
ENTRY;
- LASSERT_SPIN_LOCKED(&ofd->ofd_grant_lock);
+ LASSERT(spin_is_locked(&ofd->ofd_grant_lock));
spin_lock(&ofd->ofd_osfs_lock);
/* get available space from cached statfs data */
long dirty, dropped, grant_chunk;
ENTRY;
- LASSERT_SPIN_LOCKED(&ofd->ofd_grant_lock);
+ LASSERT(spin_is_locked(&ofd->ofd_grant_lock));
if ((oa->o_valid & (OBD_MD_FLBLOCKS|OBD_MD_FLGRANT)) !=
(OBD_MD_FLBLOCKS|OBD_MD_FLGRANT)) {
struct obd_device *obd = exp->exp_obd;
long grant_shrink;
- LASSERT_SPIN_LOCKED(&ofd->ofd_grant_lock);
+ LASSERT(spin_is_locked(&ofd->ofd_grant_lock));
LASSERT(exp);
if (left_space >= ofd->ofd_tot_granted_clients *
OFD_GRANT_SHRINK_LIMIT(exp))
ENTRY;
- LASSERT_SPIN_LOCKED(&ofd->ofd_grant_lock);
+ LASSERT(spin_is_locked(&ofd->ofd_grant_lock));
if ((oa->o_valid & OBD_MD_FLFLAGS) &&
(oa->o_flags & OBD_FL_RECOV_RESEND)) {
* \param curgrant - is the current grant claimed by the client
* \param want - is how much grant space the client would like to have
* \param left - is the remaining free space with granted space taken out
+ * \param conservative - is how server grants, if true, a certain amount, else
+ * server will grant as client requested.
*/
static long ofd_grant(struct obd_export *exp, obd_size curgrant,
- obd_size want, obd_size left)
+ obd_size want, obd_size left, bool conservative)
{
struct obd_device *obd = exp->exp_obd;
struct ofd_device *ofd = ofd_exp(exp);
/* client not supporting OBD_CONNECT_GRANT_PARAM works with a 4KB block
* size while the reality is different */
- curgrant = ofd_grant_from_cli(exp, ofd, curgrant);
- want = ofd_grant_from_cli(exp, ofd, want);
+ curgrant = ofd_grant_from_cli(exp, ofd, curgrant);
+ want = ofd_grant_from_cli(exp, ofd, want);
grant_chunk = ofd_grant_chunk(exp, ofd);
/* Grant some fraction of the client's requested grant space so that
if (curgrant >= want || curgrant >= fed->fed_grant + grant_chunk)
RETURN(0);
- if (!obd->obd_recovering)
+ if (obd->obd_recovering)
+ conservative = false;
+
+ if (conservative)
/* don't grant more than 1/8th of the remaining free space in
* one chunk */
left >>= 3;
grant = min(want, left);
- /* align grant on block size */
- grant &= ~((1ULL << ofd->ofd_blockbits) - 1);
+ /* round grant upt to the next block size */
+ grant = (grant + (1 << ofd->ofd_blockbits) - 1) &
+ ~((1ULL << ofd->ofd_blockbits) - 1);
if (!grant)
RETURN(0);
- /* Limit to ofd_grant_chunk() if client is not reconnecting */
- if ((grant > grant_chunk) && (!obd->obd_recovering))
+ /* Limit to ofd_grant_chunk() if not reconnect/recovery */
+ if ((grant > grant_chunk) && conservative)
grant = grant_chunk;
ofd->ofd_tot_granted += grant;
* \param env - is the lu environment provided by the caller
* \param exp - is the client's export which is reconnecting
* \param want - is how much the client would like to get
+ * \param conservative - is how server grants to client, if true server will
+ * only grant certain amount, else server will grant client requested
+ * amount.
*/
long ofd_grant_connect(const struct lu_env *env, struct obd_export *exp,
- obd_size want)
+ obd_size want, bool conservative)
{
struct ofd_device *ofd = ofd_exp(exp);
struct filter_export_data *fed = &exp->exp_filter_data;
}
ofd_grant(exp, ofd_grant_to_cli(exp, ofd, (obd_size)fed->fed_grant),
- want, left);
+ want, left, conservative);
/* return to client its current grant */
grant = ofd_grant_to_cli(exp, ofd, (obd_size)fed->fed_grant);
ofd_grant_shrink(exp, oa, left);
else
/* grant more space back to the client if possible */
- oa->o_grant = ofd_grant(exp, oa->o_grant, oa->o_undirty, left);
+ oa->o_grant = ofd_grant(exp, oa->o_grant, oa->o_undirty, left,
+ true);
spin_unlock(&ofd->ofd_grant_lock);
}
struct filter_export_data *fed = &exp->exp_filter_data;
obd_size left = 0;
unsigned long wanted;
-
ENTRY;
info->fti_used = 0;
fed->fed_pending += info->fti_used;
ofd->ofd_tot_pending += info->fti_used;
- /* grant more space (twice as much as needed for this request) for
- * precreate purpose if possible */
- ofd_grant(exp, fed->fed_grant, wanted * 2, left);
+ /* grant more space for precreate purpose if possible. */
+ wanted = OST_MAX_PRECREATE * ofd->ofd_dt_conf.ddp_inodespace / 2;
+ if (wanted > fed->fed_grant) {
+ /* always try to book enough space to handle a large precreate
+ * request */
+ wanted -= fed->fed_grant;
+ ofd_grant(exp, fed->fed_grant, wanted, left, false);
+ }
spin_unlock(&ofd->ofd_grant_lock);
RETURN(0);
}