X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_fs.c;h=1a4c1f1ba7ceff99e4a7ab269dfd08e7539b1ad8;hp=43e185e7faff3111ad30b5434dd43b171dfd5669;hb=e3a7c58aebafce40323db54bf6056029e5af4a70;hpb=f79a2f1a19decfd1bed4857772e63dee01e151b2 diff --git a/lustre/mgs/mgs_fs.c b/lustre/mgs/mgs_fs.c index 43e185e..1a4c1f1 100644 --- a/lustre/mgs/mgs_fs.c +++ b/lustre/mgs/mgs_fs.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,6 +26,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -59,14 +59,14 @@ #include "mgs_internal.h" int mgs_export_stats_init(struct obd_device *obd, struct obd_export *exp, - int reconnect, void *localdata) + void *localdata) { lnet_nid_t *client_nid = localdata; int rc, newnid; ENTRY; - rc = lprocfs_exp_setup(exp, client_nid, reconnect, &newnid); + rc = lprocfs_exp_setup(exp, client_nid, &newnid); if (rc) { /* Mask error for already created * /proc entries */ @@ -74,15 +74,29 @@ int mgs_export_stats_init(struct obd_device *obd, struct obd_export *exp, rc = 0; RETURN(rc); } - if (newnid) { - rc = lprocfs_nid_ldlm_stats_init(exp->exp_nid_stats); + struct nid_stat *tmp = exp->exp_nid_stats; + int num_stats = 0; + + num_stats = (sizeof(*obd->obd_type->typ_dt_ops) / sizeof(void *)) + + LPROC_MGS_LAST - 1; + tmp->nid_stats = lprocfs_alloc_stats(num_stats, + LPROCFS_STATS_FLAG_NOPERCPU); + if (tmp->nid_stats == NULL) + return -ENOMEM; + lprocfs_init_ops_stats(LPROC_MGS_LAST, tmp->nid_stats); + mgs_stats_counter_init(tmp->nid_stats); + rc = lprocfs_register_stats(tmp->nid_proc, "stats", + tmp->nid_stats); + if (rc) + GOTO(clean, rc); + + rc = lprocfs_nid_ldlm_stats_init(tmp); if (rc) GOTO(clean, rc); } RETURN(0); clean: - lprocfs_exp_cleanup(exp); return rc; } @@ -103,65 +117,27 @@ int mgs_client_free(struct obd_export *exp) return 0; } -/* Same as mds_fid2dentry */ +/* Same as mds_lvfs_fid2dentry */ /* Look up an entry by inode number. */ /* this function ONLY returns valid dget'd dentries with an initialized inode or errors */ -static struct dentry *mgs_fid2dentry(struct mgs_obd *mgs, - __u64 ino, __u32 gen) +static struct dentry *mgs_lvfs_fid2dentry(__u64 id, __u32 gen, + __u64 gr, void *data) { - char fid_name[32]; - struct inode *inode; - struct dentry *result; + struct fsfilt_fid fid; + struct obd_device *obd = (struct obd_device *)data; ENTRY; CDEBUG(D_DENTRY, "--> mgs_fid2dentry: ino/gen %lu/%u, sb %p\n", - (unsigned long)ino, gen, mgs->mgs_sb); + (unsigned long)id, gen, obd->u.mgs.mgs_sb); - if (ino == 0) + if (id == 0) RETURN(ERR_PTR(-ESTALE)); - snprintf(fid_name, sizeof(fid_name), "0x%lx", (unsigned long)ino); - - /* under ext3 this is neither supposed to return bad inodes nor NULL - inodes. */ - result = ll_lookup_one_len(fid_name, mgs->mgs_fid_de, strlen(fid_name)); - if (IS_ERR(result)) - RETURN(result); - - inode = result->d_inode; - if (!inode) - RETURN(ERR_PTR(-ENOENT)); - - if (inode->i_generation == 0 || inode->i_nlink == 0) { - LCONSOLE_WARN("Found inode with zero generation or link -- this" - " may indicate disk corruption (inode: %lu, link:" - " %lu, count: %d)\n", inode->i_ino, - (unsigned long)inode->i_nlink, - atomic_read(&inode->i_count)); - l_dput(result); - RETURN(ERR_PTR(-ENOENT)); - } - - if (gen && inode->i_generation != gen) { - /* we didn't find the right inode.. */ - CDEBUG(D_INODE, "found wrong generation: inode %lu, link: %lu, " - "count: %d, generation %u/%u\n", inode->i_ino, - (unsigned long)inode->i_nlink, - atomic_read(&inode->i_count), - inode->i_generation, gen); - l_dput(result); - RETURN(ERR_PTR(-ENOENT)); - } + fid.ino = id; + fid.gen = gen; - RETURN(result); -} - -static struct dentry *mgs_lvfs_fid2dentry(__u64 id, __u32 gen, - __u64 gr, void *data) -{ - struct obd_device *obd = data; - return mgs_fid2dentry(&obd->u.mgs, id, gen); + RETURN(fsfilt_fid2dentry(obd, obd->u.mgs.mgs_vfsmnt, &fid, 0)); } struct lvfs_callback_ops mgs_lvfs_ops = { @@ -184,7 +160,9 @@ int mgs_fs_setup(struct obd_device *obd, struct vfsmount *mnt) mgs->mgs_vfsmnt = mnt; mgs->mgs_sb = mnt->mnt_root->d_inode->i_sb; - fsfilt_setup(obd, mgs->mgs_sb); + rc = fsfilt_setup(obd, mgs->mgs_sb); + if (rc) + RETURN(rc); OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt); obd->obd_lvfs_ctxt.pwdmnt = mnt; @@ -195,7 +173,7 @@ int mgs_fs_setup(struct obd_device *obd, struct vfsmount *mnt) push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); /* Setup the configs dir */ - dentry = simple_mkdir(current->fs->pwd, mnt, MOUNT_CONFIGS_DIR, 0777, 1); + dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, MOUNT_CONFIGS_DIR, 0777, 1); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); CERROR("cannot create %s directory: rc = %d\n", @@ -204,30 +182,21 @@ int mgs_fs_setup(struct obd_device *obd, struct vfsmount *mnt) } mgs->mgs_configs_dir = dentry; - /* Need the iopen dir for fid2dentry, required by - LLOG_ORIGIN_HANDLE_READ_HEADER */ - dentry = lookup_one_len("__iopen__", current->fs->pwd, - strlen("__iopen__")); + /* create directory to store nid table versions */ + dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, MGS_NIDTBL_DIR, + 0777, 1); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); - CERROR("cannot lookup __iopen__ directory: rc = %d\n", rc); - GOTO(err_configs, rc); - } - mgs->mgs_fid_de = dentry; - if (!dentry->d_inode || is_bad_inode(dentry->d_inode)) { - rc = -ENOENT; - CERROR("__iopen__ directory has no inode? rc = %d\n", rc); - GOTO(err_fid, rc); + CERROR("cannot create %s directory: rc = %d\n", + MOUNT_CONFIGS_DIR, rc); + GOTO(err_pop, rc); + } else { + dput(dentry); } err_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); return rc; -err_fid: - dput(mgs->mgs_fid_de); -err_configs: - dput(mgs->mgs_configs_dir); - goto err_pop; } int mgs_fs_cleanup(struct obd_device *obd) @@ -245,7 +214,6 @@ int mgs_fs_cleanup(struct obd_device *obd) mgs->mgs_configs_dir = NULL; } - dput(mgs->mgs_fid_de); shrink_dcache_sb(mgs->mgs_sb); pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);