* in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
#include <lustre_mds.h>
#include <linux/module.h>
#include <linux/init.h>
-#include <linux/random.h>
#include <linux/fs.h>
#include <linux/jbd.h>
#include <linux/smp_lock.h>
#include <linux/workqueue.h>
#include <linux/mount.h>
-#include <linux/lustre_acl.h>
+#include <lustre_acl.h>
#include <obd_class.h>
#include <lustre_dlm.h>
#include <obd_lov.h>
#include <lustre_fsfilt.h>
#include <lprocfs_status.h>
-#include <lustre_commit_confd.h>
-#include <lustre_quota.h>
#include <lustre_disk.h>
#include <lustre_param.h>
snprintf(fid_name, sizeof(fid_name), "0x%lx", ino);
- CDEBUG(D_DENTRY, "--> mds_fid2dentry: ino/gen %lu/%u, sb %p\n",
- ino, generation, mds->mds_obt.obt_sb);
-
/* under ext3 this is neither supposed to return bad inodes
nor NULL inodes. */
result = ll_lookup_one_len(fid_name, mds->mds_fid_de, strlen(fid_name));
}
if (mnt) {
- *mnt = mds->mds_vfsmnt;
+ *mnt = mds->mds_obt.obt_vfsmnt;
mntget(*mnt);
}
static int mds_lov_clean(struct obd_device *obd)
{
struct mds_obd *mds = &obd->u.mds;
- struct obd_device *osc = mds->mds_osc_obd;
+ struct obd_device *osc = mds->mds_lov_obd;
ENTRY;
if (mds->mds_profile) {
osc->obd_fail = obd->obd_fail;
/* Cleanup the lov */
- obd_disconnect(mds->mds_osc_exp);
+ obd_disconnect(mds->mds_lov_exp);
class_manual_cleanup(osc);
RETURN(0);
static int mds_postsetup(struct obd_device *obd)
{
struct mds_obd *mds = &obd->u.mds;
+ struct llog_ctxt *ctxt;
int rc = 0;
ENTRY;
rc = llog_setup(obd, &obd->obd_olg, LLOG_LOVEA_ORIG_CTXT, obd, 0, NULL,
&llog_lvfs_ops);
if (rc)
- RETURN(rc);
+ GOTO(err_llog, rc);
+
+ mds_changelog_llog_init(obd, obd);
if (mds->mds_profile) {
struct lustre_profile *lprof;
err_cleanup:
mds_lov_clean(obd);
- llog_cleanup(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT));
- llog_cleanup(llog_get_context(obd, LLOG_LOVEA_ORIG_CTXT));
- RETURN(rc);
+ ctxt = llog_get_context(obd, LLOG_LOVEA_ORIG_CTXT);
+ if (ctxt)
+ llog_cleanup(ctxt);
+err_llog:
+ ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
+ if (ctxt)
+ llog_cleanup(ctxt);
+ return rc;
}
int mds_postrecov(struct obd_device *obd)
RETURN(0);
LASSERT(!obd->obd_recovering);
- LASSERT(!llog_ctxt_null(obd, LLOG_MDS_OST_ORIG_CTXT));
-
/* clean PENDING dir */
#if 0
if (strncmp(obd->obd_name, MDD_OBD_NAME, strlen(MDD_OBD_NAME)))
/* Notify the LOV, which will in turn call mds_notify for each tgt */
/* This means that we have to hack obd_notify to think we're obd_set_up
during mds_lov_connect. */
- obd_notify(obd->u.mds.mds_osc_obd, NULL,
+ obd_notify(obd->u.mds.mds_lov_obd, NULL,
obd->obd_async_recov ? OBD_NOTIFY_SYNC_NONBLOCK :
OBD_NOTIFY_SYNC, NULL);
- /* quota recovery */
- lquota_recovery(mds_quota_interface_ref, obd);
-
RETURN(rc);
}
static int mds_lov_early_clean(struct obd_device *obd)
{
struct mds_obd *mds = &obd->u.mds;
- struct obd_device *osc = mds->mds_osc_obd;
+ struct obd_device *osc = mds->mds_lov_obd;
if (!osc || (!obd->obd_force && !obd->obd_fail))
return(0);
static int mds_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
{
- int rc = 0;
struct mds_obd *mds = &obd->u.mds;
+ struct llog_ctxt *ctxt;
+ int rc = 0;
ENTRY;
switch (stage) {
break;
case OBD_CLEANUP_EXPORTS:
mds_lov_early_clean(obd);
- down_write(&mds->mds_notify_lock);
+ cfs_down_write(&mds->mds_notify_lock);
mds_lov_disconnect(obd);
mds_lov_clean(obd);
- llog_cleanup(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT));
- llog_cleanup(llog_get_context(obd, LLOG_LOVEA_ORIG_CTXT));
+ ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT);
+ if (ctxt)
+ llog_cleanup(ctxt);
+ ctxt = llog_get_context(obd, LLOG_LOVEA_ORIG_CTXT);
+ if (ctxt)
+ llog_cleanup(ctxt);
rc = obd_llog_finish(obd, 0);
- mds->mds_osc_exp = NULL;
- up_write(&mds->mds_notify_lock);
+ mds->mds_lov_exp = NULL;
+ cfs_up_write(&mds->mds_notify_lock);
break;
}
RETURN(rc);
l_fid2dentry: mds_lvfs_fid2dentry,
};
-quota_interface_t *mds_quota_interface_ref;
-extern quota_interface_t mds_quota_interface;
-
static void mds_init_ctxt(struct obd_device *obd, struct vfsmount *mnt)
{
struct mds_obd *mds = &obd->u.mds;
- mds->mds_vfsmnt = mnt;
+ mds->mds_obt.obt_vfsmnt = mnt;
/* why not mnt->mnt_sb instead of mnt->mnt_root->d_inode->i_sb? */
obd->u.obt.obt_sb = mnt->mnt_root->d_inode->i_sb;
-
+ obd->u.obt.obt_magic = OBT_MAGIC;
fsfilt_setup(obd, obd->u.obt.obt_sb);
OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
* we need only lmi here but not get mount
* OSD did mount already, so put mount back
*/
- atomic_dec(&lsi->lsi_mounts);
+ cfs_atomic_dec(&lsi->lsi_mounts);
mntput(mnt);
- init_rwsem(&mds->mds_notify_lock);
+ cfs_init_rwsem(&mds->mds_notify_lock);
obd->obd_fsops = fsfilt_get_ops(MT_STR(lsi->lsi_ldd));
mds_init_ctxt(obd, mnt);
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- dentry = simple_mkdir(current->fs->pwd, "OBJECTS", 0777, 1);
+ dentry = simple_mkdir(current->fs->pwd, mnt, "OBJECTS", 0777, 1);
if (IS_ERR(dentry)) {
rc = PTR_ERR(dentry);
CERROR("cannot create OBJECTS directory: rc = %d\n", rc);
}
mds->mds_objects_dir = dentry;
- dentry = lookup_one_len("__iopen__", current->fs->pwd,
+ dentry = ll_lookup_one_len("__iopen__", current->fs->pwd,
strlen("__iopen__"));
if (IS_ERR(dentry)) {
rc = PTR_ERR(dentry);
if (rc)
GOTO(err_objects, rc);
- mds->mds_max_mdsize = sizeof(struct lov_mds_md);
- mds->mds_max_cookiesize = sizeof(struct llog_cookie);
-
err_pop:
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
RETURN(rc);
int rc = 0;
ENTRY;
- mds->mds_osc_exp = NULL;
+ mds->mds_lov_exp = NULL;
if (obd->obd_fail)
LCONSOLE_WARN("%s: shutting down for failover; client state "
"will be preserved.\n", obd->obd_name);
+ if (strncmp(obd->obd_name, MDD_OBD_NAME, strlen(MDD_OBD_NAME)))
+ RETURN(0);
+
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
mds_lov_destroy_objids(obd);
mds->mds_objects_dir = NULL;
}
- shrink_dcache_parent(mds->mds_fid_de);
dput(mds->mds_fid_de);
LL_DQUOT_OFF(obd->u.obt.obt_sb);
+ shrink_dcache_sb(mds->mds_obt.obt_sb);
fsfilt_put_ops(obd->obd_fsops);
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
// .o_health_check = mds_cmd_health_check,
};
+quota_interface_t *mds_quota_interface_ref;
+extern quota_interface_t mds_quota_interface;
+
static int __init mds_cmd_init(void)
{
struct lprocfs_static_vars lvars;
+ int rc;
+
+ cfs_request_module("%s", "lquota");
+ mds_quota_interface_ref = PORTAL_SYMBOL_GET(mds_quota_interface);
+ rc = lquota_init(mds_quota_interface_ref);
+ if (rc) {
+ if (mds_quota_interface_ref)
+ PORTAL_SYMBOL_PUT(mds_quota_interface);
+ return rc;
+ }
+ init_obd_quota_ops(mds_quota_interface_ref, &mds_cmd_obd_ops);
lprocfs_mds_init_vars(&lvars);
class_register_type(&mds_cmd_obd_ops, NULL, lvars.module_vars,
static void /*__exit*/ mds_cmd_exit(void)
{
+ lquota_exit(mds_quota_interface_ref);
+ if (mds_quota_interface_ref)
+ PORTAL_SYMBOL_PUT(mds_quota_interface);
+
class_unregister_type(LUSTRE_MDS_NAME);
}
+EXPORT_SYMBOL(mds_quota_interface_ref);
MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>");
MODULE_DESCRIPTION("Lustre Metadata Server (MDS)");
MODULE_LICENSE("GPL");