⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lproc_mds.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * *  Copyright (C) 2002 Cluster File Systems, Inc. * *   This file is part of the Lustre file system, http://www.lustre.org *   Lustre is a trademark of Cluster File Systems, Inc. * *   You may have signed or agreed to another license before downloading *   this software.  If so, you are bound by the terms and conditions *   of that agreement, and the following does not apply to you.  See the *   LICENSE file included with this distribution for more information. * *   If you did not agree to a different license, then this copy of Lustre *   is open source software; you can redistribute it and/or modify it *   under the terms of version 2 of the GNU General Public License as *   published by the Free Software Foundation. * *   In either case, Lustre is distributed in the hope that it will be *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   license text for more details. * */#define DEBUG_SUBSYSTEM S_CLASS#include <linux/version.h>#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))#include <asm/statfs.h>#endif#include <obd.h>#include <obd_class.h>#include <lprocfs_status.h>#include "mds_internal.h"#ifdef LPROCFSstatic int lprocfs_mds_rd_mntdev(char *page, char **start, off_t off, int count,                                 int *eof, void *data){        struct obd_device* obd = (struct obd_device *)data;        LASSERT(obd != NULL);        LASSERT(obd->u.mds.mds_vfsmnt->mnt_devname);        *eof = 1;        return snprintf(page, count, "%s\n",obd->u.mds.mds_vfsmnt->mnt_devname);}static int lprocfs_mds_rd_evictostnids(char *page, char **start, off_t off,                                       int count, int *eof, void *data){        struct obd_device* obd = (struct obd_device *)data;        LASSERT(obd != NULL);        return snprintf(page, count, "%d\n", obd->u.mds.mds_evict_ost_nids);}static int lprocfs_mds_wr_evictostnids(struct file *file, const char *buffer,                                       unsigned long count, void *data){        struct obd_device *obd = data;        int val, rc;        rc = lprocfs_write_helper(buffer, count, &val);        if (rc)                return rc;        obd->u.mds.mds_evict_ost_nids = !!val;        return count;}static int lprocfs_mds_wr_evict_client(struct file *file, const char *buffer,                                       unsigned long count, void *data){        struct obd_device *obd = data;        struct mds_obd *mds = &obd->u.mds;        char tmpbuf[sizeof(struct obd_uuid)];        struct ptlrpc_request_set *set;        int rc;        sscanf(buffer, "%40s", tmpbuf);        if (strncmp(tmpbuf, "nid:", 4) != 0)                return lprocfs_wr_evict_client(file, buffer, count, data);        set = ptlrpc_prep_set();        if (!set)                return -ENOMEM;        if (obd->u.mds.mds_evict_ost_nids) {                rc = obd_set_info_async(mds->mds_osc_exp,strlen("evict_by_nid"),                                        "evict_by_nid", strlen(tmpbuf + 4) + 1,                                        tmpbuf + 4, set);                if (rc)                        CERROR("Failed to evict nid %s from OSTs: rc %d\n",                               tmpbuf + 4, rc);                ptlrpc_check_set(set);        }        /* See the comments in function lprocfs_wr_evict_client()         * in ptlrpc/lproc_ptlrpc.c for details. - jay */        class_incref(obd);        LPROCFS_EXIT();        obd_export_evict_by_nid(obd, tmpbuf+4);        rc = ptlrpc_set_wait(set);        if (rc)                CERROR("Failed to evict nid %s from OSTs: rc %d\n", tmpbuf + 4,                       rc);        LPROCFS_ENTRY();        class_decref(obd);        ptlrpc_set_destroy(set);        return count;}static int lprocfs_wr_group_info(struct file *file, const char *buffer,                                 unsigned long count, void *data){        struct obd_device *obd = data;        struct mds_obd *mds = &obd->u.mds;        struct mds_grp_downcall_data sparam, *param = &sparam;        int size = 0, rc = count;        if (count < sizeof(param)) {                CERROR("%s: invalid data size %lu\n", obd->obd_name, count);                return count;        }        if (copy_from_user(param, buffer, sizeof(*param)) ||            param->mgd_magic != MDS_GRP_DOWNCALL_MAGIC) {                CERROR("%s: MDS group downcall bad params\n", obd->obd_name);                return count;        }        if (param->mgd_ngroups > NGROUPS_MAX) {                CWARN("%s: uid %u groups %d more than maximum %d\n",                      obd->obd_name, param->mgd_uid, param->mgd_ngroups,                      NGROUPS_MAX);                param->mgd_ngroups = NGROUPS_MAX;        }        if (param->mgd_ngroups > 0) {                size = offsetof(struct mds_grp_downcall_data,                                mgd_groups[param->mgd_ngroups]);                OBD_ALLOC(param, size);                if (!param) {                        CERROR("%s: fail to alloc %d bytes for uid %u"                               " with %d groups\n", obd->obd_name, size,                               sparam.mgd_uid, sparam.mgd_ngroups);                        param = &sparam;                        param->mgd_ngroups = 0;                } else if (copy_from_user(param, buffer, size)) {                        CERROR("%s: uid %u bad supplementary group data\n",                               obd->obd_name, sparam.mgd_uid);                        OBD_FREE(param, size);                        param = &sparam;                        param->mgd_ngroups = 0;                }        }        rc = upcall_cache_downcall(mds->mds_group_hash, param->mgd_err,                                   param->mgd_uid, param->mgd_gid,                                   param->mgd_ngroups, param->mgd_groups);        if (param && param != &sparam)                OBD_FREE(param, size);        return rc;}static int lprocfs_rd_group_expire(char *page, char **start, off_t off,                                   int count, int *eof, void *data){        struct obd_device *obd = data;        *eof = 1;        return snprintf(page, count, "%lu\n",                        obd->u.mds.mds_group_hash->uc_entry_expire / HZ);}static int lprocfs_wr_group_expire(struct file *file, const char *buffer,                                   unsigned long count, void *data){        struct obd_device *obd = data;        int val, rc;        rc = lprocfs_write_helper(buffer, count, &val);        if (rc)                return rc;        if (val > 5)                obd->u.mds.mds_group_hash->uc_entry_expire = val * HZ;        else                CERROR("invalid expire time %u for group cache\n", val);        return count;}static int lprocfs_rd_group_acquire_expire(char *page, char **start, off_t off,                                           int count, int *eof, void *data){        struct obd_device *obd = data;        *eof = 1;        return snprintf(page, count, "%lu\n",                        obd->u.mds.mds_group_hash->uc_acquire_expire / HZ);}static int lprocfs_wr_group_acquire_expire(struct file *file,const char *buffer,                                           unsigned long count, void *data){        struct obd_device *obd = data;        int val, rc = 0;        rc = lprocfs_write_helper(buffer, count, &val);        if (rc)                return rc;        if (val > 2)                obd->u.mds.mds_group_hash->uc_acquire_expire = val * HZ;        return count;}static int lprocfs_rd_group_upcall(char *page, char **start, off_t off,                                   int count, int *eof, void *data){        struct obd_device *obd = data;        *eof = 1;        return snprintf(page, count, "%s\n",                        obd->u.mds.mds_group_hash->uc_upcall);}static int lprocfs_wr_group_upcall(struct file *file, const char *buffer,                                   unsigned long count, void *data){        struct obd_device *obd = data;        struct upcall_cache *hash = obd->u.mds.mds_group_hash;        char kernbuf[UC_CACHE_UPCALL_MAXPATH] = { '\0' };        if (count >= UC_CACHE_UPCALL_MAXPATH) {                CERROR("%s: group upcall too long\n", obd->obd_name);                return -EINVAL;        }        if (copy_from_user(kernbuf, buffer,                           min(count, UC_CACHE_UPCALL_MAXPATH - 1)))                return -EFAULT;        /* Remove any extraneous bits from the upcall (e.g. linefeeds) */        sscanf(kernbuf, "%s", hash->uc_upcall);        if (strcmp(hash->uc_name, obd->obd_name) != 0)                CWARN("%s: write to upcall name %s for MDS %s\n",                      obd->obd_name, hash->uc_upcall, obd->obd_name);        CWARN("%s: group upcall set to %s\n", obd->obd_name, hash->uc_upcall);        return count;}static int lprocfs_wr_group_flush(struct file *file, const char *buffer,                                  unsigned long count, void *data){        struct obd_device *obd = data;        upcall_cache_flush_idle(obd->u.mds.mds_group_hash);        return count;}static int lprocfs_wr_atime_diff(struct file *file, const char *buffer,                                 unsigned long count, void *data){        struct obd_device *obd = data;        struct mds_obd *mds = &obd->u.mds;        char kernbuf[20], *end;        unsigned long diff = 0;        if (count > (sizeof(kernbuf) - 1))                return -EINVAL;        if (copy_from_user(kernbuf, buffer, count))                return -EFAULT;        kernbuf[count] = '\0';        diff = simple_strtoul(kernbuf, &end, 0);        if (kernbuf == end)                return -EINVAL;        mds->mds_atime_diff = diff;        return count;}static int lprocfs_rd_atime_diff(char *page, char **start, off_t off,                                 int count, int *eof, void *data){        struct obd_device *obd = data;        struct mds_obd *mds = &obd->u.mds;        *eof = 1;        return snprintf(page, count, "%lu\n", mds->mds_atime_diff);}static int lprocfs_wr_rootsquash(struct file *file, const char *buffer,                                 unsigned long count, void *data){        struct obd_device *obd = data;        struct mds_obd *mds = &obd->u.mds;        char kernbuf[50], *tmp, *end;        unsigned long uid, gid;        if (count > (sizeof(kernbuf) - 1))                return -EINVAL;        if (copy_from_user(kernbuf, buffer, count))                return -EFAULT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -