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

📄 mds_fs.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 3 页
字号:
                CERROR("cannot create OBJECTS directory: rc = %d\n", rc);                GOTO(err_logs, rc);        }        mds->mds_objects_dir = dentry;        /* open and test the last rcvd file */        file = filp_open(LAST_RCVD, O_RDWR | O_CREAT, 0644);        if (IS_ERR(file)) {                rc = PTR_ERR(file);                CERROR("cannot open/create %s file: rc = %d\n", LAST_RCVD, rc);                GOTO(err_objects, rc = PTR_ERR(file));        }        mds->mds_rcvd_filp = file;        if (!S_ISREG(file->f_dentry->d_inode->i_mode)) {                CERROR("%s is not a regular file!: mode = %o\n", LAST_RCVD,                       file->f_dentry->d_inode->i_mode);                GOTO(err_last_rcvd, rc = -ENOENT);        }        rc = mds_init_server_data(obd, file);        if (rc) {                CERROR("cannot read %s: rc = %d\n", LAST_RCVD, rc);                GOTO(err_last_rcvd, rc);        }        rc = mds_lov_init_objids(obd);        if (rc != 0) {               CERROR("cannot init lov objid rc = %d\n", rc);               GOTO(err_client, rc );        }        /* open and test the check io file junk */        file = filp_open(HEALTH_CHECK, O_RDWR | O_CREAT, 0644);        if (IS_ERR(file)) {                rc = PTR_ERR(file);                CERROR("cannot open/create %s file: rc = %d\n",HEALTH_CHECK,rc);                GOTO(err_lov_objid, rc = PTR_ERR(file));        }        mds->mds_health_check_filp = file;        if (!S_ISREG(file->f_dentry->d_inode->i_mode)) {                CERROR("%s is not a regular file!: mode = %o\n", HEALTH_CHECK,                       file->f_dentry->d_inode->i_mode);                GOTO(err_health_check, rc = -ENOENT);        }        rc = lvfs_check_io_health(obd, file);        if (rc)                GOTO(err_health_check, rc);err_pop:        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);        return rc;err_health_check:        if (mds->mds_health_check_filp &&            filp_close(mds->mds_health_check_filp, 0))                CERROR("can't close %s after error\n", HEALTH_CHECK);err_lov_objid:         mds_lov_destroy_objids(obd);err_client:        class_disconnect_exports(obd);err_last_rcvd:        if (mds->mds_rcvd_filp && filp_close(mds->mds_rcvd_filp, 0))                CERROR("can't close %s after error\n", LAST_RCVD);err_objects:        dput(mds->mds_objects_dir);err_logs:        dput(mds->mds_logs_dir);err_pending:        dput(mds->mds_pending_dir);err_fid:        dput(mds->mds_fid_de);        goto err_pop;}int mds_fs_cleanup(struct obd_device *obd){        struct mds_obd *mds = &obd->u.mds;        struct lvfs_run_ctxt saved;        int rc = 0;        if (obd->obd_fail)                LCONSOLE_WARN("%s: shutting down for failover; client state "                              "will be preserved.\n", obd->obd_name);        class_disconnect_exports(obd); /* cleans up client info too */        mds_server_free_data(mds);        push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);        if (mds->mds_rcvd_filp) {                rc = filp_close(mds->mds_rcvd_filp, 0);                mds->mds_rcvd_filp = NULL;                if (rc)                        CERROR("%s file won't close, rc=%d\n", LAST_RCVD, rc);        }        mds_lov_destroy_objids(obd);        if (mds->mds_health_check_filp) {                rc = filp_close(mds->mds_health_check_filp, 0);                mds->mds_health_check_filp = NULL;                if (rc)                        CERROR("%s file won't close, rc=%d\n", HEALTH_CHECK,rc);        }        if (mds->mds_objects_dir != NULL) {                l_dput(mds->mds_objects_dir);                mds->mds_objects_dir = NULL;        }        if (mds->mds_logs_dir) {                l_dput(mds->mds_logs_dir);                mds->mds_logs_dir = NULL;        }        if (mds->mds_pending_dir) {                l_dput(mds->mds_pending_dir);                mds->mds_pending_dir = NULL;        }        lquota_fs_cleanup(mds_quota_interface_ref, obd);        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);        shrink_dcache_parent(mds->mds_fid_de);        dput(mds->mds_fid_de);        LL_DQUOT_OFF(obd->u.obt.obt_sb);        return rc;}/* Creates an object with the same name as its fid.  Because this is not at all * performance sensitive, it is accomplished by creating a file, checking the * fid, and renaming it. */int mds_obd_create(struct obd_export *exp, struct obdo *oa,                   struct lov_stripe_md **ea, struct obd_trans_info *oti){        struct mds_obd *mds = &exp->exp_obd->u.mds;        struct inode *parent_inode = mds->mds_objects_dir->d_inode;        unsigned int tmpname = ll_rand();        struct file *filp;        struct dentry *new_child;        struct lvfs_run_ctxt saved;        char fidname[LL_FID_NAMELEN];        void *handle;        struct lvfs_ucred ucred = { 0 };        int rc = 0, err, namelen;        ENTRY;        /* the owner of object file should always be root */        cap_raise(ucred.luc_cap, CAP_SYS_RESOURCE);        push_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, &ucred);        sprintf(fidname, "OBJECTS/%u.%u", tmpname, current->pid);        filp = filp_open(fidname, O_CREAT | O_EXCL, 0666);        if (IS_ERR(filp)) {                rc = PTR_ERR(filp);                if (rc == -EEXIST) {                        CERROR("impossible object name collision %u\n",                               tmpname);                        LBUG();                }                CERROR("error creating tmp object %u: rc %d\n", tmpname, rc);                GOTO(out_pop, rc);        }        LASSERT(mds->mds_objects_dir == filp->f_dentry->d_parent);        oa->o_id = filp->f_dentry->d_inode->i_ino;        oa->o_generation = filp->f_dentry->d_inode->i_generation;        namelen = ll_fid2str(fidname, oa->o_id, oa->o_generation);        LOCK_INODE_MUTEX(parent_inode);        new_child = lookup_one_len(fidname, mds->mds_objects_dir, namelen);        if (IS_ERR(new_child)) {                CERROR("getting neg dentry for obj rename: %d\n", rc);                GOTO(out_close, rc = PTR_ERR(new_child));        }        if (new_child->d_inode != NULL) {                CERROR("impossible non-negative obj dentry " LPU64":%u!\n",                       oa->o_id, oa->o_generation);                LBUG();        }        handle = fsfilt_start(exp->exp_obd, mds->mds_objects_dir->d_inode,                              FSFILT_OP_RENAME, NULL);        if (IS_ERR(handle))                GOTO(out_dput, rc = PTR_ERR(handle));        lock_kernel();        rc = vfs_rename(mds->mds_objects_dir->d_inode, filp->f_dentry,                        mds->mds_objects_dir->d_inode, new_child);        unlock_kernel();        if (rc)                CERROR("error renaming new object "LPU64":%u: rc %d\n",                       oa->o_id, oa->o_generation, rc);        err = fsfilt_commit(exp->exp_obd, mds->mds_objects_dir->d_inode,                            handle, 0);        if (!err)                oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGENER;        else if (!rc)                rc = err;out_dput:        dput(new_child);out_close:        UNLOCK_INODE_MUTEX(parent_inode);        err = filp_close(filp, 0);        if (err) {                CERROR("closing tmpfile %u: rc %d\n", tmpname, rc);                if (!rc)                        rc = err;        }out_pop:        pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, &ucred);        RETURN(rc);}int mds_obd_destroy(struct obd_export *exp, struct obdo *oa,                    struct lov_stripe_md *ea, struct obd_trans_info *oti,                    struct obd_export *md_exp){        struct mds_obd *mds = &exp->exp_obd->u.mds;        struct inode *parent_inode = mds->mds_objects_dir->d_inode;        struct obd_device *obd = exp->exp_obd;        struct lvfs_run_ctxt saved;        struct lvfs_ucred ucred = { 0 };        char fidname[LL_FID_NAMELEN];        struct inode *inode = NULL;        struct dentry *de;        void *handle;        int err, namelen, rc = 0;        ENTRY;        cap_raise(ucred.luc_cap, CAP_SYS_RESOURCE);        push_ctxt(&saved, &obd->obd_lvfs_ctxt, &ucred);        namelen = ll_fid2str(fidname, oa->o_id, oa->o_generation);        LOCK_INODE_MUTEX(parent_inode);        de = lookup_one_len(fidname, mds->mds_objects_dir, namelen);        if (IS_ERR(de)) {                rc = IS_ERR(de);                de = NULL;                CERROR("error looking up object "LPU64" %s: rc %d\n",                       oa->o_id, fidname, rc);                GOTO(out_dput, rc);        }        if (de->d_inode == NULL) {                CERROR("destroying non-existent object "LPU64" %s: rc %d\n",                       oa->o_id, fidname, rc);                GOTO(out_dput, rc = -ENOENT);        }        /* Stripe count is 1 here since this is some MDS specific stuff           that is unlinked, not spanned across multiple OSTs */        handle = fsfilt_start_log(obd, mds->mds_objects_dir->d_inode,                                  FSFILT_OP_UNLINK, oti, 1);        if (IS_ERR(handle))                GOTO(out_dput, rc = PTR_ERR(handle));        /* take a reference to protect inode from truncation within           vfs_unlink() context. bug 10409 */        inode = de->d_inode;        atomic_inc(&inode->i_count);        rc = vfs_unlink(mds->mds_objects_dir->d_inode, de);        if (rc)                CERROR("error destroying object "LPU64":%u: rc %d\n",                       oa->o_id, oa->o_generation, rc);        err = fsfilt_commit(obd, mds->mds_objects_dir->d_inode, handle, 0);        if (err && !rc)                rc = err;out_dput:        if (de != NULL)                l_dput(de);        UNLOCK_INODE_MUTEX(parent_inode);        if (inode)                iput(inode);        pop_ctxt(&saved, &obd->obd_lvfs_ctxt, &ucred);        RETURN(rc);}

⌨️ 快捷键说明

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