X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_handler.c;h=db890c785c64b1f3adbfa06593f1768aebbab7f9;hp=0dcc349b3144c6ed29c1c74b21b3fa4168813efa;hb=80ad9c5cb2419899ed4bab8a5d6eb7fa58729073;hpb=2d784025da2dd1c979ff2269d91340a8e0729309 diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 0dcc349..db890c7 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -106,11 +106,17 @@ static int osd_object_invariant(const struct lu_object *l) #ifdef HAVE_QUOTA_SUPPORT static inline void -osd_push_ctxt(const struct lu_env *env, struct osd_ctxt *save) +osd_push_ctxt(const struct lu_env *env, struct osd_ctxt *save, bool is_md) { - struct md_ucred *uc = md_ucred(env); + struct md_ucred *uc; struct cred *tc; + if (!is_md) + /* OFD support */ + return; + + uc = md_ucred(env); + LASSERT(uc != NULL); save->oc_uid = current_fsuid(); @@ -126,10 +132,14 @@ osd_push_ctxt(const struct lu_env *env, struct osd_ctxt *save) } static inline void -osd_pop_ctxt(struct osd_ctxt *save) +osd_pop_ctxt(struct osd_ctxt *save, bool is_md) { struct cred *tc; + if (!is_md) + /* OFD support */ + return; + if ((tc = prepare_creds())) { tc->fsuid = save->oc_uid; tc->fsgid = save->oc_gid; @@ -421,8 +431,6 @@ static int osd_fid_lookup(const struct lu_env *env, struct osd_object *obj, verify = 1; } - fid_zero(&oic->oic_fid); - /* * Objects are created as locking anchors or place holders for objects * yet to be created. No need to osd_oi_lookup() at here because FID @@ -455,6 +463,7 @@ iget: if (IS_ERR(inode)) { result = PTR_ERR(inode); if (result == -ENOENT || result == -ESTALE) { + fid_zero(&oic->oic_fid); result = 0; } else if (result == -EREMCHG) { @@ -705,6 +714,9 @@ static void osd_trans_commit_cb(struct journal_callback *jcb, int error) /* call per-transaction callbacks if any */ cfs_list_for_each_entry_safe(dcb, tmp, &oh->ot_dcb_list, dcb_linkage) { + LASSERTF(dcb->dcb_magic == TRANS_COMMIT_CB_MAGIC, + "commit callback entry: magic=%x name='%s'\n", + dcb->dcb_magic, dcb->dcb_name); cfs_list_del_init(&dcb->dcb_linkage); dcb->dcb_func(NULL, th, dcb, error); } @@ -820,7 +832,7 @@ int osd_trans_start(const struct lu_env *env, struct dt_device *d, * data (ofd) and reverse ordering for metadata * (mdd). then at some point we'll fix the latter */ - if (lu_device_is_md(&d->dd_lu_dev)) { + if (dev->od_is_md) { LASSERT(oti->oti_r_locks == 0); LASSERT(oti->oti_w_locks == 0); } @@ -873,7 +885,7 @@ static int osd_trans_stop(const struct lu_env *env, struct thandle *th) * data (ofd) and reverse ordering for metadata * (mdd). then at some point we'll fix the latter */ - if (lu_device_is_md(&th->th_dev->dd_lu_dev)) { + if (osd_dt_dev(th->th_dev)->od_is_md) { LASSERT(oti->oti_r_locks == 0); LASSERT(oti->oti_w_locks == 0); } @@ -908,12 +920,14 @@ static int osd_trans_stop(const struct lu_env *env, struct thandle *th) static int osd_trans_cb_add(struct thandle *th, struct dt_txn_commit_cb *dcb) { - struct osd_thandle *oh = container_of0(th, struct osd_thandle, - ot_super); + struct osd_thandle *oh = container_of0(th, struct osd_thandle, + ot_super); - cfs_list_add(&dcb->dcb_linkage, &oh->ot_dcb_list); + LASSERT(dcb->dcb_magic == TRANS_COMMIT_CB_MAGIC); + LASSERT(&dcb->dcb_func != NULL); + cfs_list_add(&dcb->dcb_linkage, &oh->ot_dcb_list); - return 0; + return 0; } /* @@ -992,15 +1006,15 @@ int osd_statfs(const struct lu_env *env, struct dt_device *d, ksfs = &osd_oti_get(env)->oti_ksfs; } - cfs_spin_lock(&osd->od_osfs_lock); - /* cache 1 second */ - if (cfs_time_before_64(osd->od_osfs_age, cfs_time_shift_64(-1))) { - result = ll_do_statfs(sb, ksfs); - if (likely(result == 0)) { /* N.B. statfs can't really fail */ - osd->od_osfs_age = cfs_time_current_64(); - statfs_pack(&osd->od_statfs, ksfs); - } - } + cfs_spin_lock(&osd->od_osfs_lock); + /* cache 1 second */ + if (cfs_time_before_64(osd->od_osfs_age, cfs_time_shift_64(-1))) { + result = sb->s_op->statfs(sb->s_root, ksfs); + if (likely(result == 0)) { /* N.B. statfs can't really fail */ + osd->od_osfs_age = cfs_time_current_64(); + statfs_pack(&osd->od_statfs, ksfs); + } + } if (likely(result == 0)) *sfs = osd->od_statfs; @@ -1379,15 +1393,15 @@ int osd_object_auth(const struct lu_env *env, struct dt_object *dt, } static struct timespec *osd_inode_time(const struct lu_env *env, - struct inode *inode, __u64 seconds) + struct inode *inode, __u64 seconds) { - struct osd_thread_info *oti = osd_oti_get(env); - struct timespec *t = &oti->oti_time; + struct osd_thread_info *oti = osd_oti_get(env); + struct timespec *t = &oti->oti_time; - t->tv_sec = seconds; - t->tv_nsec = 0; - *t = timespec_trunc(*t, get_sb_time_gran(inode->i_sb)); - return t; + t->tv_sec = seconds; + t->tv_nsec = 0; + *t = timespec_trunc(*t, inode->i_sb->s_time_gran); + return t; } @@ -1409,8 +1423,8 @@ static void osd_inode_getattr(const struct lu_env *env, attr->la_flags = LDISKFS_I(inode)->i_flags; attr->la_nlink = inode->i_nlink; attr->la_rdev = inode->i_rdev; - attr->la_blksize = ll_inode_blksize(inode); - attr->la_blkbits = inode->i_blkbits; + attr->la_blksize = 1 << inode->i_blkbits; + attr->la_blkbits = inode->i_blkbits; } static int osd_attr_get(const struct lu_env *env, @@ -1560,8 +1574,8 @@ static int osd_attr_set(const struct lu_env *env, OSD_EXEC_OP(handle, attr_set); inode = obj->oo_inode; - if (LDISKFS_HAS_RO_COMPAT_FEATURE(inode->i_sb, - LDISKFS_FEATURE_RO_COMPAT_QUOTA)) { + if (!osd_dt_dev(handle->th_dev)->od_is_md) { + /* OFD support */ rc = osd_quota_transfer(inode, attr); if (rc) return rc; @@ -1580,9 +1594,9 @@ static int osd_attr_set(const struct lu_env *env, iattr.ia_valid |= ATTR_GID; iattr.ia_uid = attr->la_uid; iattr.ia_gid = attr->la_gid; - osd_push_ctxt(env, save); + osd_push_ctxt(env, save, 1); rc = ll_vfs_dq_transfer(inode, &iattr) ? -EDQUOT : 0; - osd_pop_ctxt(save); + osd_pop_ctxt(save, 1); if (rc != 0) return rc; } @@ -1635,14 +1649,14 @@ static int osd_mkfile(struct osd_thread_info *info, struct osd_object *obj, parent = hint->dah_parent; #ifdef HAVE_QUOTA_SUPPORT - osd_push_ctxt(info->oti_env, save); + osd_push_ctxt(info->oti_env, save, osd_dt_dev(th->th_dev)->od_is_md); #endif inode = ldiskfs_create_inode(oth->ot_handle, parent ? osd_dt_obj(parent)->oo_inode : osd_sb(osd)->s_root->d_inode, mode); #ifdef HAVE_QUOTA_SUPPORT - osd_pop_ctxt(save); + osd_pop_ctxt(save, osd_dt_dev(th->th_dev)->od_is_md); #endif if (!IS_ERR(inode)) { /* Do not update file c/mtime in ldiskfs. @@ -1845,8 +1859,8 @@ static void osd_attr_init(struct osd_thread_info *info, struct osd_object *obj, if ((valid & LA_MTIME) && (attr->la_mtime == LTIME_S(inode->i_mtime))) attr->la_valid &= ~LA_MTIME; - if (LDISKFS_HAS_RO_COMPAT_FEATURE(inode->i_sb, - LDISKFS_FEATURE_RO_COMPAT_QUOTA)) { + if (!osd_obj2dev(obj)->od_is_md) { + /* OFD support */ result = osd_quota_transfer(inode, attr); if (result) return; @@ -1917,10 +1931,13 @@ static int __osd_oi_insert(const struct lu_env *env, struct osd_object *obj, struct osd_thread_info *info = osd_oti_get(env); struct osd_inode_id *id = &info->oti_id; struct osd_device *osd = osd_obj2dev(obj); - struct md_ucred *uc = md_ucred(env); LASSERT(obj->oo_inode != NULL); - LASSERT(uc != NULL); + + if (osd->od_is_md) { + struct md_ucred *uc = md_ucred(env); + LASSERT(uc != NULL); + } osd_id_gen(id, obj->oo_inode->i_ino, obj->oo_inode->i_generation); return osd_oi_insert(info, osd, fid, id, th); @@ -2379,22 +2396,20 @@ static int osd_declare_xattr_set(const struct lu_env *env, const struct lu_buf *buf, const char *name, int fl, struct thandle *handle) { - struct osd_thandle *oh; - - LASSERT(handle != NULL); + struct osd_thandle *oh; - if (strcmp(name, XATTR_NAME_VERSION) == 0) { - /* no credits for version */ - return 0; - } + LASSERT(handle != NULL); - oh = container_of0(handle, struct osd_thandle, ot_super); - LASSERT(oh->ot_handle == NULL); + oh = container_of0(handle, struct osd_thandle, ot_super); + LASSERT(oh->ot_handle == NULL); - OSD_DECLARE_OP(oh, xattr_set); - oh->ot_credits += osd_dto_credits_noquota[DTO_XATTR_SET]; + OSD_DECLARE_OP(oh, xattr_set); + if (strcmp(name, XATTR_NAME_VERSION) == 0) + oh->ot_credits += osd_dto_credits_noquota[DTO_ATTR_SET_BASE]; + else + oh->ot_credits += osd_dto_credits_noquota[DTO_XATTR_SET]; - return 0; + return 0; } /* @@ -2597,23 +2612,23 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env, static int osd_object_sync(const struct lu_env *env, struct dt_object *dt) { - struct osd_object *obj = osd_dt_obj(dt); - struct inode *inode = obj->oo_inode; - struct osd_thread_info *info = osd_oti_get(env); - struct dentry *dentry = &info->oti_obj_dentry; - struct file *file = &info->oti_file; - int rc; + struct osd_object *obj = osd_dt_obj(dt); + struct inode *inode = obj->oo_inode; + struct osd_thread_info *info = osd_oti_get(env); + struct dentry *dentry = &info->oti_obj_dentry; + struct file *file = &info->oti_file; + int rc; - ENTRY; + ENTRY; - dentry->d_inode = inode; - file->f_dentry = dentry; - file->f_mapping = inode->i_mapping; - file->f_op = inode->i_fop; - LOCK_INODE_MUTEX(inode); - rc = file->f_op->fsync(file, dentry, 0); - UNLOCK_INODE_MUTEX(inode); - RETURN(rc); + dentry->d_inode = inode; + file->f_dentry = dentry; + file->f_mapping = inode->i_mapping; + file->f_op = inode->i_fop; + mutex_lock(&inode->i_mutex); + rc = file->f_op->fsync(file, dentry, 0); + mutex_unlock(&inode->i_mutex); + RETURN(rc); } static int osd_data_get(const struct lu_env *env, struct dt_object *dt, @@ -2672,17 +2687,6 @@ static int osd_iam_container_init(const struct lu_env *env, return result; result = iam_container_setup(bag); - if (result != 0) - goto out; - - if (osd_obj2dev(obj)->od_iop_mode) { - u32 ptr = bag->ic_descr->id_ops->id_root_ptr(bag); - - bag->ic_root_bh = ldiskfs_bread(NULL, obj->oo_inode, - ptr, 0, &result); - } - - out: if (result == 0) obj->oo_dt.do_index_ops = &osd_index_iam_ops; else @@ -3409,9 +3413,10 @@ static int osd_ea_lookup_rec(const struct lu_env *env, struct osd_object *obj, rc = osd_ea_fid_get(env, obj, ino, fid, &oic->oic_lid); else osd_id_gen(&oic->oic_lid, ino, OSD_OII_NOGEN); - - if (rc != 0 || !fid_is_norm(fid)) + if (rc != 0 || !fid_is_norm(fid)) { + fid_zero(&oic->oic_fid); GOTO(out, rc); + } oic->oic_fid = *fid; if ((scrub->os_pos_current <= ino) && @@ -3859,9 +3864,9 @@ static struct dt_it *osd_it_ea_init(const struct lu_env *env, it->oie_file.f_pos = 0; it->oie_file.f_dentry = obj_dentry; if (attr & LUDA_64BITHASH) - it->oie_file.f_flags = O_64BITHASH; + it->oie_file.f_mode |= FMODE_64BITHASH; else - it->oie_file.f_flags = O_32BITHASH; + it->oie_file.f_mode |= FMODE_32BITHASH; it->oie_file.f_mapping = obj->oo_inode->i_mapping; it->oie_file.f_op = obj->oo_inode->i_fop; it->oie_file.private_data = NULL; @@ -4046,7 +4051,7 @@ static int osd_it_ea_next(const struct lu_env *env, struct dt_it *di) it->oie_it_dirent++; RETURN(0); } else { - if (it->oie_file.f_pos == LDISKFS_HTREE_EOF) + if (it->oie_file.f_pos == ldiskfs_get_htree_eof(&it->oie_file)) rc = +1; else rc = osd_ldiskfs_it_fill(env, di); @@ -4125,9 +4130,10 @@ static inline int osd_it_ea_rec(const struct lu_env *env, it->oie_dirent->oied_name, it->oie_dirent->oied_namelen, it->oie_dirent->oied_type, attr); - - if (!fid_is_norm(fid)) + if (!fid_is_norm(fid)) { + fid_zero(&oic->oic_fid); RETURN(0); + } oic->oic_fid = *fid; if ((scrub->os_pos_current <= ino) && @@ -4457,6 +4463,7 @@ static int osd_process_config(const struct lu_env *env, err = osd_mount(env, o, cfg); break; case LCFG_CLEANUP: + lu_dev_del_linkage(d->ld_site, d); err = osd_shutdown(env, o); break; default: @@ -4493,7 +4500,24 @@ static int osd_prepare(const struct lu_env *env, struct lu_device *pdev, RETURN(result); } - if (!lu_device_is_md(pdev)) +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 3, 55, 0) + /* Unfortunately, the current MDD implementation relies on some specific + * code to be executed in the OSD layer. Since OFD now also uses the OSD + * module, we need a way to skip the metadata-specific code when running + * with OFD. + * The hack here is to check the type of the parent device which is + * either MD (i.e. MDD device) with the current MDT stack or DT (i.e. + * OFD device) on an OST. As a reminder, obdfilter does not use the OSD + * layer and still relies on lvfs. This hack won't work any more when + * LOD is landed since LOD is of DT type. + * This code should be removed once the orion MDT changes (LOD/OSP, ...) + * have been landed */ + osd->od_is_md = lu_device_is_md(pdev); +#else +#warning "all is_md checks must be removed from osd-ldiskfs" +#endif + + if (!osd->od_is_md) RETURN(0); /* 3. setup local objects */