* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
GOTO(out_pop, rc = PTR_ERR(mnt));
}
- file = dentry_open(dentry, mnt, O_RDONLY);
+ file = ll_dentry_open(dentry, mnt, O_RDONLY, current_cred());
if (IS_ERR(file))
/* dentry_open_it() drops the dentry, mnt refs */
GOTO(out_pop, rc = PTR_ERR(file));
rc = 0;
CDEBUG(D_MGS, "MDT index is %u\n", index);
cfs_set_bit(index, fsdb->fsdb_mdt_index_map);
+ fsdb->fsdb_mdt_count ++;
}
/* COMPAT_146 */
/* #01 L attach 0:lov_mdsA 1:lov 2:cdbe9_lov_mdsA_dc8cf7f3bb */
if ((fsdb->fsdb_gen == 0) && (lcfg->lcfg_command == LCFG_ATTACH) &&
(strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_LOV_NAME) == 0)) {
- fsdb->fsdb_flags |= FSDB_OLDLOG14;
+ cfs_set_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags);
name_destroy(&fsdb->fsdb_clilov);
rc = name_create(&fsdb->fsdb_clilov,
lustre_cfg_string(lcfg, 0), "");
if ((fsdb->fsdb_gen == 0) && (lcfg->lcfg_command == LCFG_SETUP) &&
(strncmp(lustre_cfg_string(lcfg, 0), "MDC_", 4) == 0)) {
char *ptr;
- fsdb->fsdb_flags |= FSDB_OLDLOG14;
+ cfs_set_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags);
ptr = strstr(lustre_cfg_string(lcfg, 1), "_UUID");
if (!ptr) {
CERROR("Can't parse MDT uuid %s\n",
/*
* compat to 1.8, check osc name used by MDT0 to OSTs, bz18548.
*/
- if (fsdb->fsdb_fl_oscname_18 == 0 &&
+ if (!cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags) &&
lcfg->lcfg_command == LCFG_ATTACH &&
strcmp(lustre_cfg_string(lcfg, 1), LUSTRE_OSC_NAME) == 0) {
if (OBD_OCD_VERSION_MAJOR(d->ver) == 1 &&
OBD_OCD_VERSION_MINOR(d->ver) <= 8) {
CWARN("MDT using 1.8 OSC name scheme\n");
- fsdb->fsdb_fl_oscname_18 = 1;
+ cfs_set_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags);
}
}
GOTO(out_close, rc);
if (llog_get_size(loghandle) <= 1)
- fsdb->fsdb_flags |= FSDB_LOG_EMPTY;
+ cfs_set_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
rc = llog_process(loghandle, mgs_fsdb_handler, (void *) &d, NULL);
CDEBUG(D_INFO, "get_db = %d\n", rc);
strcpy(fsdb->fsdb_name, fsname);
cfs_sema_init(&fsdb->fsdb_sem, 1);
- fsdb->fsdb_fl_udesc = 1;
+ cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags);
if (strcmp(fsname, MGSSELF_NAME) == 0) {
- fsdb->fsdb_fl_mgsself = 1;
+ cfs_set_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags);
} else {
OBD_ALLOC(fsdb->fsdb_ost_index_map, INDEX_MAP_SIZE);
OBD_ALLOC(fsdb->fsdb_mdt_index_map, INDEX_MAP_SIZE);
if (!fsdb)
return -ENOMEM;
- if (!fsdb->fsdb_fl_mgsself) {
+ if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
/* populate the db from the client llog */
rc = mgs_get_fsdb_from_llog(obd, fsdb);
if (rc) {
RETURN(rc);
}
- if (fsdb->fsdb_flags & FSDB_LOG_EMPTY)
+ if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags))
RETURN(-1);
if (mti->mti_flags & LDD_F_SV_TYPE_OST)
0 newly marked as in use
<0 err
+EALREADY for update of an old index */
-int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
+static int mgs_set_index(struct obd_device *obd, struct mgs_target_info *mti)
{
struct fs_db *fsdb;
void *imap;
RETURN(rc);
}
- if (mti->mti_flags & LDD_F_SV_TYPE_OST)
+ if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
imap = fsdb->fsdb_ost_index_map;
- else if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
+ } else if (mti->mti_flags & LDD_F_SV_TYPE_MDT) {
imap = fsdb->fsdb_mdt_index_map;
- else
+ if (fsdb->fsdb_mdt_count >= MAX_MDT_COUNT) {
+ LCONSOLE_ERROR_MSG(0x13f, "The max mdt count"
+ "is %d\n", (int)MAX_MDT_COUNT);
+ RETURN(-ERANGE);
+ }
+ } else {
RETURN(-EINVAL);
+ }
if (mti->mti_flags & LDD_F_NEED_INDEX) {
rc = next_index(imap, INDEX_MAP_SIZE);
if (rc == -1)
RETURN(-ERANGE);
mti->mti_stripe_index = rc;
+ if (mti->mti_flags & LDD_F_SV_TYPE_MDT)
+ fsdb->fsdb_mdt_count ++;
}
if (mti->mti_stripe_index >= INDEX_MAP_SIZE * 8) {
}
cfs_set_bit(mti->mti_stripe_index, imap);
- fsdb->fsdb_flags &= ~FSDB_LOG_EMPTY;
+ cfs_clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags);
server_make_name(mti->mti_flags, mti->mti_stripe_index,
mti->mti_fsname, mti->mti_svname);
static int mgs_write_log_mdc_to_mdt(struct obd_device *, struct fs_db *,
struct mgs_target_info *, char *);
+static int mgs_write_log_osc_to_lov(struct obd_device *obd, struct fs_db *fsdb,
+ struct mgs_target_info *mti,
+ char *logname, char *suffix, char *lovname,
+ enum lustre_sec_part sec_part, int flags);
+static void name_create_mdt_and_lov(char **logname, char **lovname,
+ struct fs_db *fsdb, int i);
static int mgs_steal_llog_handler(struct llog_handle *llh,
struct llog_rec_hdr *rec,
memset(tmti, 0, sizeof(*tmti));
RETURN(rc);
}
+
+ if (lcfg->lcfg_command == LCFG_LOV_ADD_OBD) {
+ char mdt_index[9];
+ char *logname, *lovname;
+
+ name_create_mdt_and_lov(&logname, &lovname, fsdb, mti->mti_stripe_index);
+ sprintf(mdt_index, "-MDT%04x", mti->mti_stripe_index);
+
+ mgs_write_log_osc_to_lov(obd, fsdb, tmti, logname,
+ mdt_index, lovname,
+ LUSTRE_SP_MDT, 0);
+ name_destroy(&logname);
+ name_destroy(&lovname);
+ RETURN(rc);
+ }
RETURN(rc);
}
lovdesc->ld_default_stripe_count = 1;
lovdesc->ld_pattern = LOV_PATTERN_RAID0;
lovdesc->ld_default_stripe_size = 1024 * 1024;
- lovdesc->ld_default_stripe_offset = 0;
+ lovdesc->ld_default_stripe_offset = -1;
lovdesc->ld_qos_maxage = QOS_DEFAULT_MAXAGE;
sprintf((char*)lovdesc->ld_uuid.uuid, "%s_UUID", lovname);
/* can these be the same? */
{
struct llog_handle *llh = NULL;
char *mdcname, *nodeuuid, *mdcuuid, *lmvuuid;
- char index[5];
+ char index[6];
int i, rc;
ENTRY;
int i, rc;
ENTRY;
- if (mgs_log_is_empty(obd, mti->mti_svname)) {
+ if (mgs_log_is_empty(obd, logname)) {
CERROR("log is empty! Logical error\n");
RETURN (-EINVAL);
}
{
name_create_mdt(logname, fsdb->fsdb_name, i);
/* COMPAT_180 */
- if (i == 0 && fsdb->fsdb_fl_oscname_18)
+ if (i == 0 && cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
name_create(lovname, fsdb->fsdb_name, "-mdtlov");
else
name_create(lovname, *logname, "-mdtlov");
{
char suffix[16];
- if (i == 0 && fsdb->fsdb_fl_oscname_18)
+ if (i == 0 && cfs_test_bit(FSDB_OSCNAME18, &fsdb->fsdb_flags))
sprintf(suffix, "-osc");
else
sprintf(suffix, "-osc-MDT%04x", i);
{
struct llog_handle *llh = NULL;
char *nodeuuid, *oscname, *oscuuid, *lovuuid, *svname;
- char index[5];
+ char index[6];
int i, rc;
ENTRY;
mti->mti_svname, logname);
if (mgs_log_is_empty(obd, logname)) {
- /* The first item in the log must be the lov, so we have
- somewhere to add our osc. */
- rc = mgs_write_log_lov(obd, fsdb, mti, logname, lovname);
+ CERROR("log is empty! Logical error\n");
+ RETURN (-EINVAL);
}
name_create(&nodeuuid, libcfs_nid2str(mti->mti_nids[0]), "");
/* We also have to update the other logs where this osc is part of
the lov */
- if (fsdb->fsdb_flags & FSDB_OLDLOG14) {
+ if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
/* If we're upgrading, the old mdt log already has our
entry. Let's do a fake one for fun. */
/* Note that we can't add any new failnids, since we don't
/* Append ost info to the client log */
name_create(&logname, mti->mti_fsname, "-client");
+ if (mgs_log_is_empty(obd, logname)) {
+ /* Start client log */
+ rc = mgs_write_log_lov(obd, fsdb, mti, logname,
+ fsdb->fsdb_clilov);
+ rc = mgs_write_log_lmv(obd, fsdb, mti, logname,
+ fsdb->fsdb_clilmv);
+ }
mgs_write_log_osc_to_lov(obd, fsdb, mti, logname, "",
- fsdb->fsdb_clilov, LUSTRE_SP_CLI, 0);
+ fsdb->fsdb_clilov, LUSTRE_SP_CLI, flags);
name_destroy(&logname);
RETURN(rc);
}
/* obsolete old one */
mgs_modify(obd, fsdb, mti, logname, mti->mti_svname, comment, CM_SKIP);
- if (!mgs_param_empty(param)) {
- /* write the new one */
- rc = mgs_write_log_direct(obd, fsdb, logname, lcfg,
- mti->mti_svname, comment);
- if (rc)
- CERROR("err %d writing log %s\n", rc, logname);
- }
+ /* write the new one */
+ rc = mgs_write_log_direct(obd, fsdb, logname, lcfg,
+ mti->mti_svname, comment);
+ if (rc)
+ CERROR("err %d writing log %s\n", rc, logname);
+
out:
name_destroy(&logname);
out_lcfg:
goto error_out;
if (strcmp(ptr, "yes") == 0) {
- fsdb->fsdb_fl_udesc = 1;
+ cfs_set_bit(FSDB_UDESC, &fsdb->fsdb_flags);
CWARN("Enable user descriptor shipping from client to MDT\n");
} else if (strcmp(ptr, "no") == 0) {
- fsdb->fsdb_fl_udesc = 0;
+ cfs_clear_bit(FSDB_UDESC, &fsdb->fsdb_flags);
CWARN("Disable user descriptor shipping from client to MDT\n");
} else {
*(ptr - 1) = '=';
RETURN(rc);
/* mgs rules implies must be mgc->mgs */
- if (fsdb->fsdb_fl_mgsself) {
+ if (cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
if ((rule.sr_from != LUSTRE_SP_MGC &&
rule.sr_from != LUSTRE_SP_ANY) ||
(rule.sr_to != LUSTRE_SP_MGS &&
char *param)
{
char *copy;
- int rc, copy_size, del;
+ int rc, copy_size;
ENTRY;
#ifndef HAVE_GSS
return -ENOMEM;
memcpy(copy, param, copy_size);
- del = mgs_param_empty(param);
- if (!del) {
- rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param);
- if (rc)
- goto out_free;
- }
+ rc = mgs_srpc_set_param_mem(fsdb, mti->mti_svname, param);
+ if (rc)
+ goto out_free;
/* previous steps guaranteed the syntax is correct */
rc = mgs_srpc_set_param_disk(obd, fsdb, mti, copy);
if (rc)
goto out_free;
- if (fsdb->fsdb_fl_mgsself) {
+ if (cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags)) {
/*
* for mgs rules, make them effective immediately.
*/
struct lustre_cfg_bufs bufs;
char *logname;
char *tmp;
- int rc = 0;
+ int rc = 0, rc2 = 0;
ENTRY;
/* For various parameter settings, we have to figure out which logs
"changes were made to the "
"config log.\n",
mti->mti_svname, rc);
- if (fsdb->fsdb_flags & FSDB_OLDLOG14)
+ if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags))
LCONSOLE_ERROR_MSG(0x146, "This may be"
" because the log"
"is in the old 1.4"
"-mdc");
} else if (mti->mti_flags & LDD_F_SV_TYPE_OST) {
/* COMPAT_146 */
- if (fsdb->fsdb_flags & FSDB_OLDLOG14) {
+ if (cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
LCONSOLE_ERROR_MSG(0x148, "Upgraded "
"client logs for %s"
" cannot be "
}
LCONSOLE_WARN("Ignoring unrecognized param '%s'\n", ptr);
+ rc2 = -ENOSYS;
end:
if (rc)
CERROR("err %d on param '%s'\n", rc, ptr);
- RETURN(rc);
+ RETURN(rc ?: rc2);
}
/* Not implementing automatic failover nid addition at this time. */
LCONSOLE_INFO("upgrading server %s from pre-1.6\n", mti->mti_svname);
server_mti_print("upgrade", mti);
- if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+ if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
LCONSOLE_ERROR_MSG(0x14a, "The old client log %s-client is "
"missing. Was tunefs.lustre successful?\n",
mti->mti_fsname);
}
}
- if (!(fsdb->fsdb_flags & FSDB_OLDLOG14)) {
+ if (!cfs_test_bit(FSDB_OLDLOG14, &fsdb->fsdb_flags)) {
LCONSOLE_ERROR_MSG(0x14c, "%s-client is supposedly an old "
"log, but no old LOV or MDT was found. "
"Consider updating the configuration with"
rc = mgs_find_or_make_fsdb(obd, fsname, &fsdb);
if (rc)
RETURN(rc);
- if (!fsdb->fsdb_fl_mgsself && fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+ if (!cfs_test_bit(FSDB_MGS_SELF, &fsdb->fsdb_flags) &&
+ cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
CERROR("No filesystem targets for %s. cfg_device from lctl "
"is '%s'\n", fsname, devname);
mgs_free_fsdb(obd, fsdb);
CERROR("Can't get db for %s\n", fsname);
RETURN(rc);
}
- if (fsdb->fsdb_flags & FSDB_LOG_EMPTY) {
+ if (cfs_test_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags)) {
CERROR("%s is not defined\n", fsname);
mgs_free_fsdb(obd, fsdb);
RETURN(-EINVAL);