📄 mds_fs.c
字号:
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 + -