From 14ede0dd6b76c4161a95c7f021e4857942415a7b Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Wed, 23 Nov 2011 10:48:03 +0300 Subject: [PATCH] LU-911 osd: minor code reorganization to make structures and helpers usable outside of osd_handler.c in other files (within ldiskfs osd) Signed-off-by: Alex Zhuravlev Change-Id: I1b421a0a6ad148dea0e453d8b01942fe63cf1397 Reviewed-on: http://review.whamcloud.com/1833 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Andreas Dilger --- lustre/osd-ldiskfs/osd_handler.c | 421 ++++++++++---------------------------- lustre/osd-ldiskfs/osd_internal.h | 209 +++++++++++++++++-- 2 files changed, 302 insertions(+), 328 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 4252479..18a3a86 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -90,194 +90,13 @@ static const char dot[] = "."; static const char dotdot[] = ".."; static const char remote_obj_dir[] = "REM_OBJ_DIR"; -struct osd_directory { - struct iam_container od_container; - struct iam_descr od_descr; -}; - -struct osd_object { - struct dt_object oo_dt; - /** - * Inode for file system object represented by this osd_object. This - * inode is pinned for the whole duration of lu_object life. - * - * Not modified concurrently (either setup early during object - * creation, or assigned by osd_object_create() under write lock). - */ - struct inode *oo_inode; - /** - * to protect index ops. - */ - struct htree_lock_head *oo_hl_head; - cfs_rw_semaphore_t oo_ext_idx_sem; - cfs_rw_semaphore_t oo_sem; - struct osd_directory *oo_dir; - /** protects inode attributes. */ - cfs_spinlock_t oo_guard; - /** - * Following two members are used to indicate the presence of dot and - * dotdot in the given directory. This is required for interop mode - * (b11826). - */ - int oo_compat_dot_created; - int oo_compat_dotdot_created; - - const struct lu_env *oo_owner; -#ifdef CONFIG_LOCKDEP - struct lockdep_map oo_dep_map; -#endif -}; - static const struct lu_object_operations osd_lu_obj_ops; -static const struct lu_device_operations osd_lu_ops; -static struct lu_context_key osd_key; static const struct dt_object_operations osd_obj_ops; static const struct dt_object_operations osd_obj_ea_ops; -static const struct dt_body_operations osd_body_ops; static const struct dt_body_operations osd_body_ops_new; static const struct dt_index_operations osd_index_iam_ops; static const struct dt_index_operations osd_index_ea_ops; -#define OSD_TRACK_DECLARES -#ifdef OSD_TRACK_DECLARES -#define OSD_DECLARE_OP(oh, op) { \ - LASSERT(oh->ot_handle == NULL); \ - ((oh)->ot_declare_ ##op)++; } -#define OSD_EXEC_OP(handle, op) { \ - struct osd_thandle *oh; \ - oh = container_of0(handle, struct osd_thandle, ot_super);\ - if (((oh)->ot_declare_ ##op) > 0) { \ - ((oh)->ot_declare_ ##op)--; \ - } \ - } -#else -#define OSD_DECLARE_OP(oh, op) -#define OSD_EXEC_OP(oh, op) -#endif - -/* There are at most 10 uid/gids are affected in a transaction, and - * that's rename case: - * - 2 for source parent uid & gid; - * - 2 for source child uid & gid ('..' entry update when the child - * is directory); - * - 2 for target parent uid & gid; - * - 2 for target child uid & gid (if the target child exists); - * - 2 for root uid & gid (last_rcvd, llog, etc); - * - * The 0 to (OSD_MAX_UGID_CNT - 1) bits of ot_id_type is for indicating - * the id type of each id in the ot_id_array. - */ -#define OSD_MAX_UGID_CNT 10 - -struct osd_thandle { - struct thandle ot_super; - handle_t *ot_handle; - struct journal_callback ot_jcb; - cfs_list_t ot_dcb_list; - /* Link to the device, for debugging. */ - struct lu_ref_link *ot_dev_link; - unsigned short ot_credits; - unsigned short ot_id_cnt; - unsigned short ot_id_type; - uid_t ot_id_array[OSD_MAX_UGID_CNT]; - -#ifdef OSD_TRACK_DECLARES - unsigned char ot_declare_attr_set; - unsigned char ot_declare_punch; - unsigned char ot_declare_xattr_set; - unsigned char ot_declare_create; - unsigned char ot_declare_destroy; - unsigned char ot_declare_ref_add; - unsigned char ot_declare_ref_del; - unsigned char ot_declare_write; - unsigned char ot_declare_insert; - unsigned char ot_declare_delete; -#endif - -#if OSD_THANDLE_STATS - /** time when this handle was allocated */ - cfs_time_t oth_alloced; - - /** time when this thanle was started */ - cfs_time_t oth_started; -#endif -}; - -/** - * Basic transaction credit op - */ -enum dt_txn_op { - DTO_INDEX_INSERT, - DTO_INDEX_DELETE, - DTO_INDEX_UPDATE, - DTO_OBJECT_CREATE, - DTO_OBJECT_DELETE, - DTO_ATTR_SET_BASE, - DTO_XATTR_SET, - DTO_LOG_REC, /**< XXX temporary: dt layer knows nothing about llog. */ - DTO_WRITE_BASE, - DTO_WRITE_BLOCK, - DTO_ATTR_SET_CHOWN, - - DTO_NR -}; - -/* - * Helpers. - */ -static int lu_device_is_osd(const struct lu_device *d) -{ - return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &osd_lu_ops); -} - -static struct osd_device *osd_dt_dev(const struct dt_device *d) -{ - LASSERT(lu_device_is_osd(&d->dd_lu_dev)); - return container_of0(d, struct osd_device, od_dt_dev); -} - -static struct osd_device *osd_dev(const struct lu_device *d) -{ - LASSERT(lu_device_is_osd(d)); - return osd_dt_dev(container_of0(d, struct dt_device, dd_lu_dev)); -} - -static struct osd_device *osd_obj2dev(const struct osd_object *o) -{ - return osd_dev(o->oo_dt.do_lu.lo_dev); -} - -static struct super_block *osd_sb(const struct osd_device *dev) -{ - return dev->od_mount->lmi_mnt->mnt_sb; -} - -static int osd_object_is_root(const struct osd_object *obj) -{ - return osd_sb(osd_obj2dev(obj))->s_root->d_inode == obj->oo_inode; -} - -static struct osd_object *osd_obj(const struct lu_object *o) -{ - LASSERT(lu_device_is_osd(o->lo_dev)); - return container_of0(o, struct osd_object, oo_dt.do_lu); -} - -static struct osd_object *osd_dt_obj(const struct dt_object *d) -{ - return osd_obj(&d->do_lu); -} - -static struct lu_device *osd2lu_dev(struct osd_device *osd) -{ - return &osd->od_dt_dev.dd_lu_dev; -} - -static journal_t *osd_journal(const struct osd_device *dev) -{ - return LDISKFS_SB(osd_sb(dev))->s_journal; -} - static int osd_has_index(const struct osd_object *obj) { return obj->oo_dt.do_index_ops != NULL; @@ -323,11 +142,6 @@ osd_pop_ctxt(struct osd_ctxt *save) } #endif -static inline struct osd_thread_info *osd_oti_get(const struct lu_env *env) -{ - return lu_context_key_get(&env->le_ctx, &osd_key); -} - /* * Concurrency: doesn't matter */ @@ -447,17 +261,9 @@ static struct inode *osd_iget(struct osd_thread_info *info, { struct inode *inode = NULL; -#ifdef HAVE_EXT4_LDISKFS inode = ldiskfs_iget(osd_sb(dev), id->oii_ino); - if (IS_ERR(inode)) - /* Newer kernels return an error instead of a NULL pointer */ - inode = NULL; -#else - inode = iget(osd_sb(dev), id->oii_ino); -#endif - if (inode == NULL) { - CERROR("no inode\n"); - inode = ERR_PTR(-EACCES); + if (IS_ERR(inode)) { + CERROR("Cannot get inode, rc = %li\n", PTR_ERR(inode)); } else if (id->oii_gen != OSD_OII_NOGEN && inode->i_generation != id->oii_gen) { iput(inode); @@ -1176,7 +982,7 @@ static void osd_init_quota_ctxt(const struct lu_env *env, struct dt_device *d, * Note: we do not count into QUOTA here. * If we mount with --data_journal we may need more. */ -static const int osd_dto_credits_noquota[DTO_NR] = { +const int osd_dto_credits_noquota[DTO_NR] = { /** * Insert/Delete. * INDEX_EXTRA_TRANS_BLOCKS(8) + @@ -1367,8 +1173,8 @@ static int capa_is_sane(const struct lu_env *env, RETURN(0); } -static int osd_object_auth(const struct lu_env *env, struct dt_object *dt, - struct lustre_capa *capa, __u64 opc) +int osd_object_auth(const struct lu_env *env, struct dt_object *dt, + struct lustre_capa *capa, __u64 opc) { const struct lu_fid *fid = lu_object_fid(&dt->do_lu); struct osd_device *dev = osd_dev(dt->do_lu.lo_dev); @@ -1984,9 +1790,10 @@ static int osd_declare_object_destroy(const struct lu_env *env, struct dt_object *dt, struct thandle *th) { - struct osd_object *obj = osd_dt_obj(dt); - struct inode *inode = obj->oo_inode; - struct osd_thandle *oh; + struct osd_object *obj = osd_dt_obj(dt); + struct inode *inode = obj->oo_inode; + struct osd_thandle *oh; + ENTRY; oh = container_of0(th, struct osd_thandle, ot_super); @@ -2057,7 +1864,7 @@ static int __osd_xattr_set(const struct lu_env *env, struct dt_object *dt, struct osd_thread_info *info = osd_oti_get(env); struct dentry *dentry = &info->oti_child_dentry; int fs_flags = 0; - int rc; + int rc; LASSERT(dt_object_exists(dt)); LASSERT(inode->i_op != NULL && inode->i_op->setxattr != NULL); @@ -2222,15 +2029,15 @@ out: * \retval -ve, on error */ static int osd_object_ea_create(const struct lu_env *env, struct dt_object *dt, - struct lu_attr *attr, - struct dt_allocation_hint *hint, - struct dt_object_format *dof, - struct thandle *th) + struct lu_attr *attr, + struct dt_allocation_hint *hint, + struct dt_object_format *dof, + struct thandle *th) { const struct lu_fid *fid = lu_object_fid(&dt->do_lu); struct osd_object *obj = osd_dt_obj(dt); struct osd_thread_info *info = osd_oti_get(env); - int result; + int result; ENTRY; @@ -2256,8 +2063,8 @@ static int osd_object_ea_create(const struct lu_env *env, struct dt_object *dt, } static int osd_declare_object_ref_add(const struct lu_env *env, - struct dt_object *dt, - struct thandle *handle) + struct dt_object *dt, + struct thandle *handle) { struct osd_thandle *oh; @@ -2277,11 +2084,10 @@ static int osd_declare_object_ref_add(const struct lu_env *env, * Concurrency: @dt is write locked. */ static int osd_object_ref_add(const struct lu_env *env, - struct dt_object *dt, - struct thandle *th) + struct dt_object *dt, struct thandle *th) { struct osd_object *obj = osd_dt_obj(dt); - struct inode *inode = obj->oo_inode; + struct inode *inode = obj->oo_inode; LINVRNT(osd_invariant(obj)); LASSERT(dt_object_exists(dt)); @@ -2316,8 +2122,8 @@ static int osd_object_ref_add(const struct lu_env *env, } static int osd_declare_object_ref_del(const struct lu_env *env, - struct dt_object *dt, - struct thandle *handle) + struct dt_object *dt, + struct thandle *handle) { struct osd_thandle *oh; @@ -2336,12 +2142,11 @@ static int osd_declare_object_ref_del(const struct lu_env *env, /* * Concurrency: @dt is write locked. */ -static int osd_object_ref_del(const struct lu_env *env, - struct dt_object *dt, +static int osd_object_ref_del(const struct lu_env *env, struct dt_object *dt, struct thandle *th) { struct osd_object *obj = osd_dt_obj(dt); - struct inode *inode = obj->oo_inode; + struct inode *inode = obj->oo_inode; LINVRNT(osd_invariant(obj)); LASSERT(dt_object_exists(dt)); @@ -2382,10 +2187,8 @@ static int osd_object_version_get(const struct lu_env *env, /* * Concurrency: @dt is read locked. */ -static int osd_xattr_get(const struct lu_env *env, - struct dt_object *dt, - struct lu_buf *buf, - const char *name, +static int osd_xattr_get(const struct lu_env *env, struct dt_object *dt, + struct lu_buf *buf, const char *name, struct lustre_capa *capa) { struct osd_object *obj = osd_dt_obj(dt); @@ -2414,7 +2217,8 @@ static int osd_xattr_get(const struct lu_env *env, } -static int osd_declare_xattr_set(const struct lu_env *env, struct dt_object *dt, +static int osd_declare_xattr_set(const struct lu_env *env, + struct dt_object *dt, const struct lu_buf *buf, const char *name, int fl, struct thandle *handle) { @@ -2482,10 +2286,8 @@ static int osd_xattr_set(const struct lu_env *env, struct dt_object *dt, /* * Concurrency: @dt is read locked. */ -static int osd_xattr_list(const struct lu_env *env, - struct dt_object *dt, - struct lu_buf *buf, - struct lustre_capa *capa) +static int osd_xattr_list(const struct lu_env *env, struct dt_object *dt, + struct lu_buf *buf, struct lustre_capa *capa) { struct osd_object *obj = osd_dt_obj(dt); struct inode *inode = obj->oo_inode; @@ -2504,9 +2306,8 @@ static int osd_xattr_list(const struct lu_env *env, } static int osd_declare_xattr_del(const struct lu_env *env, - struct dt_object *dt, - const char *name, - struct thandle *handle) + struct dt_object *dt, const char *name, + struct thandle *handle) { struct osd_thandle *oh; @@ -2525,10 +2326,8 @@ static int osd_declare_xattr_del(const struct lu_env *env, /* * Concurrency: @dt is write locked. */ -static int osd_xattr_del(const struct lu_env *env, - struct dt_object *dt, - const char *name, - struct thandle *handle, +static int osd_xattr_del(const struct lu_env *env, struct dt_object *dt, + const char *name, struct thandle *handle, struct lustre_capa *capa) { struct osd_object *obj = osd_dt_obj(dt); @@ -2641,12 +2440,13 @@ 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) { - 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; dentry->d_inode = inode; @@ -3132,7 +2932,7 @@ static const struct dt_body_operations osd_body_ops_new = { .dbo_declare_write = osd_declare_write, }; -static const struct dt_body_operations osd_body_ops = { +const struct dt_body_operations osd_body_ops = { .dbo_read = osd_read, .dbo_declare_write = osd_declare_write, .dbo_write = osd_write @@ -3167,14 +2967,15 @@ static int osd_index_declare_iam_delete(const struct lu_env *env, */ static int osd_index_iam_delete(const struct lu_env *env, struct dt_object *dt, - const struct dt_key *key, struct thandle *handle, + const struct dt_key *key, + struct thandle *handle, struct lustre_capa *capa) { struct osd_object *obj = osd_dt_obj(dt); struct osd_thandle *oh; struct iam_path_descr *ipd; struct iam_container *bag = &obj->oo_dir->od_container; - int rc; + int rc; ENTRY; @@ -3231,7 +3032,7 @@ static inline int osd_get_fid_from_dentry(struct ldiskfs_dir_entry_2 *de, struct dt_rec *fid) { struct osd_fid_pack *rec; - int rc = -ENODATA; + int rc = -ENODATA; if (de->file_type & LDISKFS_DIRENT_LUFID) { rec = (struct osd_fid_pack *) (de->name + de->name_len + 1); @@ -3251,7 +3052,8 @@ static inline int osd_get_fid_from_dentry(struct ldiskfs_dir_entry_2 *de, * \retval -ve, on error */ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt, - const struct dt_key *key, struct thandle *handle, + const struct dt_key *key, + struct thandle *handle, struct lustre_capa *capa) { struct osd_object *obj = osd_dt_obj(dt); @@ -3261,8 +3063,7 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt, struct ldiskfs_dir_entry_2 *de; struct buffer_head *bh; struct htree_lock *hlock = NULL; - - int rc; + int rc; ENTRY; @@ -3322,13 +3123,14 @@ static int osd_index_iam_lookup(const struct lu_env *env, struct dt_object *dt, struct dt_rec *rec, const struct dt_key *key, struct lustre_capa *capa) { - struct osd_object *obj = osd_dt_obj(dt); - struct iam_path_descr *ipd; - struct iam_container *bag = &obj->oo_dir->od_container; + struct osd_object *obj = osd_dt_obj(dt); + struct iam_path_descr *ipd; + struct iam_container *bag = &obj->oo_dir->od_container; struct osd_thread_info *oti = osd_oti_get(env); struct iam_iterator *it = &oti->oti_idx_it; - struct iam_rec *iam_rec; - int rc; + struct iam_rec *iam_rec; + int rc; + ENTRY; LASSERT(osd_invariant(obj)); @@ -3398,9 +3200,9 @@ static int osd_index_declare_iam_insert(const struct lu_env *env, * \retval -ve failure */ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, - const struct dt_rec *rec, const struct dt_key *key, - struct thandle *th, struct lustre_capa *capa, - int ignore_quota) + const struct dt_rec *rec, + const struct dt_key *key, struct thandle *th, + struct lustre_capa *capa, int ignore_quota) { struct osd_object *obj = osd_dt_obj(dt); struct iam_path_descr *ipd; @@ -3410,8 +3212,8 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, cfs_cap_t save = cfs_curproc_cap_pack(); #endif struct osd_thread_info *oti = osd_oti_get(env); - struct iam_rec *iam_rec = (struct iam_rec *)oti->oti_ldp; - int rc; + struct iam_rec *iam_rec = (struct iam_rec *)oti->oti_ldp; + int rc; ENTRY; @@ -3461,17 +3263,14 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, * \retval -ve, on error */ static int __osd_ea_add_rec(struct osd_thread_info *info, - struct osd_object *pobj, - struct inode *cinode, - const char *name, - const struct dt_rec *fid, - struct htree_lock *hlock, - struct thandle *th) + struct osd_object *pobj, struct inode *cinode, + const char *name, const struct dt_rec *fid, + struct htree_lock *hlock, struct thandle *th) { struct ldiskfs_dentry_param *ldp; - struct dentry *child; - struct osd_thandle *oth; - int rc; + struct dentry *child; + struct osd_thandle *oth; + int rc; oth = container_of(th, struct osd_thandle, ot_super); LASSERT(oth->ot_handle != NULL); @@ -3561,16 +3360,13 @@ static int osd_add_dot_dotdot(struct osd_thread_info *info, * It will call the appropriate osd_add* function and return the * value, return by respective functions. */ -static int osd_ea_add_rec(const struct lu_env *env, - struct osd_object *pobj, - struct inode *cinode, - const char *name, - const struct dt_rec *fid, - struct thandle *th) -{ - struct osd_thread_info *info = osd_oti_get(env); - struct htree_lock *hlock; - int rc; +static int osd_ea_add_rec(const struct lu_env *env, struct osd_object *pobj, + struct inode *cinode, const char *name, + const struct dt_rec *fid, struct thandle *th) +{ + struct osd_thread_info *info = osd_oti_get(env); + struct htree_lock *hlock; + int rc; hlock = pobj->oo_hl_head != NULL ? info->oti_hlock : NULL; @@ -3621,8 +3417,8 @@ static int osd_ea_lookup_rec(const struct lu_env *env, struct osd_object *obj, struct buffer_head *bh; struct lu_fid *fid = (struct lu_fid *) rec; struct htree_lock *hlock = NULL; - int ino; - int rc; + int ino; + int rc; LASSERT(dir->i_op != NULL && dir->i_op->lookup != NULL); @@ -3669,10 +3465,10 @@ struct osd_object *osd_object_find(const struct lu_env *env, struct dt_object *dt, const struct lu_fid *fid) { - struct lu_device *ludev = dt->do_lu.lo_dev; - struct osd_object *child = NULL; - struct lu_object *luch; - struct lu_object *lo; + struct lu_device *ludev = dt->do_lu.lo_dev; + struct osd_object *child = NULL; + struct lu_object *luch; + struct lu_object *lo; luch = lu_object_find(env, ludev, fid, NULL); if (!IS_ERR(luch)) { @@ -3755,14 +3551,14 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt, const struct dt_key *key, struct thandle *th, struct lustre_capa *capa, int ignore_quota) { - struct osd_object *obj = osd_dt_obj(dt); - struct lu_fid *fid = (struct lu_fid *) rec; - const char *name = (const char *)key; - struct osd_object *child; + struct osd_object *obj = osd_dt_obj(dt); + struct lu_fid *fid = (struct lu_fid *) rec; + const char *name = (const char *)key; + struct osd_object *child; #ifdef HAVE_QUOTA_SUPPORT - cfs_cap_t save = cfs_curproc_cap_pack(); + cfs_cap_t save = cfs_curproc_cap_pack(); #endif - int rc; + int rc; ENTRY; @@ -3805,12 +3601,12 @@ static struct dt_it *osd_it_iam_init(const struct lu_env *env, __u32 unused, struct lustre_capa *capa) { - struct osd_it_iam *it; + struct osd_it_iam *it; struct osd_thread_info *oti = osd_oti_get(env); - struct osd_object *obj = osd_dt_obj(dt); - struct lu_object *lo = &dt->do_lu; - struct iam_path_descr *ipd; - struct iam_container *bag = &obj->oo_dir->od_container; + struct osd_object *obj = osd_dt_obj(dt); + struct lu_object *lo = &dt->do_lu; + struct iam_path_descr *ipd; + struct iam_container *bag = &obj->oo_dir->od_container; LASSERT(lu_object_exists(lo)); @@ -3835,7 +3631,7 @@ static struct dt_it *osd_it_iam_init(const struct lu_env *env, static void osd_it_iam_fini(const struct lu_env *env, struct dt_it *di) { - struct osd_it_iam *it = (struct osd_it_iam *)di; + struct osd_it_iam *it = (struct osd_it_iam *)di; struct osd_object *obj = it->oi_obj; iam_it_fini(&it->oi_it); @@ -3855,7 +3651,7 @@ static void osd_it_iam_fini(const struct lu_env *env, struct dt_it *di) */ static int osd_it_iam_get(const struct lu_env *env, - struct dt_it *di, const struct dt_key *key) + struct dt_it *di, const struct dt_key *key) { struct osd_it_iam *it = (struct osd_it_iam *)di; @@ -3915,13 +3711,11 @@ static int osd_it_iam_key_size(const struct lu_env *env, const struct dt_it *di) return iam_it_key_size(&it->oi_it); } -static inline void osd_it_append_attrs(struct lu_dirent*ent, - __u32 attr, - int len, - __u16 type) +static inline void osd_it_append_attrs(struct lu_dirent *ent, __u32 attr, + int len, __u16 type) { - struct luda_type *lt; - const unsigned align = sizeof(struct luda_type) - 1; + struct luda_type *lt; + const unsigned align = sizeof(struct luda_type) - 1; /* check if file type is required */ if (attr & LUDA_TYPE) { @@ -3940,12 +3734,9 @@ static inline void osd_it_append_attrs(struct lu_dirent*ent, */ static inline void osd_it_pack_dirent(struct lu_dirent *ent, - struct lu_fid *fid, - __u64 offset, - char *name, - __u16 namelen, - __u16 type, - __u32 attr) + struct lu_fid *fid, __u64 offset, + char *name, __u16 namelen, + __u16 type, __u32 attr) { fid_cpu_to_le(&ent->lde_fid, fid); ent->lde_attrs = LUDA_FID; @@ -3965,8 +3756,7 @@ static inline void osd_it_pack_dirent(struct lu_dirent *ent, */ static int osd_it_iam_rec(const struct lu_env *env, const struct dt_it *di, - struct dt_rec *dtrec, - __u32 attr) + struct dt_rec *dtrec, __u32 attr) { struct osd_it_iam *it = (struct osd_it_iam *)di; struct osd_thread_info *info = osd_oti_get(env); @@ -4023,7 +3813,7 @@ static __u64 osd_it_iam_store(const struct lu_env *env, const struct dt_it *di) */ static int osd_it_iam_load(const struct lu_env *env, - const struct dt_it *di, __u64 hash) + const struct dt_it *di, __u64 hash) { struct osd_it_iam *it = (struct osd_it_iam *)di; @@ -4288,8 +4078,8 @@ static struct dt_key *osd_it_ea_key(const struct lu_env *env, const struct dt_it *di) { struct osd_it_ea *it = (struct osd_it_ea *)di; - ENTRY; - RETURN((struct dt_key *)it->oie_dirent->oied_name); + + return (struct dt_key *)it->oie_dirent->oied_name; } /** @@ -4302,8 +4092,8 @@ static struct dt_key *osd_it_ea_key(const struct lu_env *env, static int osd_it_ea_key_size(const struct lu_env *env, const struct dt_it *di) { struct osd_it_ea *it = (struct osd_it_ea *)di; - ENTRY; - RETURN(it->oie_dirent->oied_namelen); + + return it->oie_dirent->oied_namelen; } @@ -4320,8 +4110,7 @@ static int osd_it_ea_key_size(const struct lu_env *env, const struct dt_it *di) */ static inline int osd_it_ea_rec(const struct lu_env *env, const struct dt_it *di, - struct dt_rec *dtrec, - __u32 attr) + struct dt_rec *dtrec, __u32 attr) { struct osd_it_ea *it = (struct osd_it_ea *)di; struct osd_object *obj = it->oie_obj; @@ -4354,8 +4143,8 @@ static inline int osd_it_ea_rec(const struct lu_env *env, static __u64 osd_it_ea_store(const struct lu_env *env, const struct dt_it *di) { struct osd_it_ea *it = (struct osd_it_ea *)di; - ENTRY; - RETURN(it->oie_dirent->oied_off); + + return it->oie_dirent->oied_off; } /** @@ -4490,7 +4279,7 @@ static void osd_key_exit(const struct lu_context *ctx, /* type constructor/destructor: osd_type_init, osd_type_fini */ LU_TYPE_INIT_FINI(osd, &osd_key); -static struct lu_context_key osd_key = { +struct lu_context_key osd_key = { .lct_tags = LCT_DT_THREAD | LCT_MD_THREAD, .lct_init = osd_key_init, .lct_fini = osd_key_fini, @@ -4706,7 +4495,7 @@ static const struct lu_object_operations osd_lu_obj_ops = { .loo_object_invariant = osd_object_invariant }; -static const struct lu_device_operations osd_lu_ops = { +const struct lu_device_operations osd_lu_ops = { .ldo_object_alloc = osd_object_alloc, .ldo_process_config = osd_process_config, .ldo_recovery_complete = osd_recovery_complete, @@ -4769,4 +4558,4 @@ MODULE_AUTHOR("Sun Microsystems, Inc. "); MODULE_DESCRIPTION("Lustre Object Storage Device ("LUSTRE_OSD_NAME")"); MODULE_LICENSE("GPL"); -cfs_module(osd, "0.0.2", osd_mod_init, osd_mod_exit); +cfs_module(osd, "0.1.0", osd_mod_init, osd_mod_exit); diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index ca6749b..b5c6114 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -54,20 +54,15 @@ /* struct dirent64 */ #include -#ifdef HAVE_EXT4_LDISKFS #include #include -# ifdef HAVE_LDISKFS_JOURNAL_CALLBACK_ADD -# define journal_callback ldiskfs_journal_cb_entry -# define osd_journal_callback_set(handle, func, jcb) ldiskfs_journal_callback_add(handle, func, jcb) -# else -# define osd_journal_callback_set(handle, func, jcb) jbd2_journal_callback_set(handle, func, jcb) -# endif +#ifdef HAVE_LDISKFS_JOURNAL_CALLBACK_ADD +# define journal_callback ldiskfs_journal_cb_entry +# define osd_journal_callback_set(handle, func, jcb) \ + ldiskfs_journal_callback_add(handle, func, jcb) #else -#include -#include -#include -#define osd_journal_callback_set(handle, func, jcb) journal_callback_set(handle, func, jcb) +# define osd_journal_callback_set(handle, func, jcb) \ + jbd2_journal_callback_set(handle, func, jcb) #endif @@ -76,8 +71,8 @@ /* class_register_type(), class_unregister_type(), class_get_type() */ #include #include - #include + #include "osd_oi.h" #include "osd_iam.h" @@ -97,6 +92,44 @@ struct osd_ctxt { }; #endif +struct osd_directory { + struct iam_container od_container; + struct iam_descr od_descr; +}; + +struct osd_object { + struct dt_object oo_dt; + /** + * Inode for file system object represented by this osd_object. This + * inode is pinned for the whole duration of lu_object life. + * + * Not modified concurrently (either setup early during object + * creation, or assigned by osd_object_create() under write lock). + */ + struct inode *oo_inode; + /** + * to protect index ops. + */ + struct htree_lock_head *oo_hl_head; + cfs_rw_semaphore_t oo_ext_idx_sem; + cfs_rw_semaphore_t oo_sem; + struct osd_directory *oo_dir; + /** protects inode attributes. */ + cfs_spinlock_t oo_guard; + /** + * Following two members are used to indicate the presence of dot and + * dotdot in the given directory. This is required for interop mode + * (b11826). + */ + int oo_compat_dot_created; + int oo_compat_dotdot_created; + + const struct lu_env *oo_owner; +#ifdef CONFIG_LOCKDEP + struct lockdep_map oo_dep_map; +#endif +}; + #ifdef HAVE_LDISKFS_PDO #define osd_ldiskfs_find_entry(dir, dentry, de, lock) \ @@ -146,6 +179,8 @@ static inline void ldiskfs_htree_lock_free(struct htree_lock *lk) #endif /* HAVE_LDISKFS_PDO */ +extern const int osd_dto_credits_noquota[]; + /* * osd device. */ @@ -188,6 +223,88 @@ struct osd_device { __u32 od_iop_mode; }; +#define OSD_TRACK_DECLARES +#ifdef OSD_TRACK_DECLARES +#define OSD_DECLARE_OP(oh, op) { \ + LASSERT(oh->ot_handle == NULL); \ + ((oh)->ot_declare_ ##op)++; } +#define OSD_EXEC_OP(handle, op) { \ + struct osd_thandle *oh; \ + oh = container_of0(handle, struct osd_thandle, ot_super);\ + LASSERT((oh)->ot_declare_ ##op > 0); \ + ((oh)->ot_declare_ ##op)--; } +#else +#define OSD_DECLARE_OP(oh, op) +#define OSD_EXEC_OP(oh, op) +#endif + +/* There are at most 10 uid/gids are affected in a transaction, and + * that's rename case: + * - 2 for source parent uid & gid; + * - 2 for source child uid & gid ('..' entry update when the child + * is directory); + * - 2 for target parent uid & gid; + * - 2 for target child uid & gid (if the target child exists); + * - 2 for root uid & gid (last_rcvd, llog, etc); + * + * The 0 to (OSD_MAX_UGID_CNT - 1) bits of ot_id_type is for indicating + * the id type of each id in the ot_id_array. + */ +#define OSD_MAX_UGID_CNT 10 + +struct osd_thandle { + struct thandle ot_super; + handle_t *ot_handle; + struct journal_callback ot_jcb; + cfs_list_t ot_dcb_list; + /* Link to the device, for debugging. */ + struct lu_ref_link *ot_dev_link; + unsigned short ot_credits; + unsigned short ot_id_cnt; + unsigned short ot_id_type; + uid_t ot_id_array[OSD_MAX_UGID_CNT]; + +#ifdef OSD_TRACK_DECLARES + unsigned char ot_declare_attr_set; + unsigned char ot_declare_punch; + unsigned char ot_declare_xattr_set; + unsigned char ot_declare_create; + unsigned char ot_declare_destroy; + unsigned char ot_declare_ref_add; + unsigned char ot_declare_ref_del; + unsigned char ot_declare_write; + unsigned char ot_declare_insert; + unsigned char ot_declare_delete; +#endif + +#if OSD_THANDLE_STATS + /** time when this handle was allocated */ + cfs_time_t oth_alloced; + + /** time when this thanle was started */ + cfs_time_t oth_started; +#endif +}; + +/** + * Basic transaction credit op + */ +enum dt_txn_op { + DTO_INDEX_INSERT, + DTO_INDEX_DELETE, + DTO_INDEX_UPDATE, + DTO_OBJECT_CREATE, + DTO_OBJECT_DELETE, + DTO_ATTR_SET_BASE, + DTO_XATTR_SET, + DTO_LOG_REC, /**< XXX temporary: dt layer knows nothing about llog. */ + DTO_WRITE_BASE, + DTO_WRITE_BLOCK, + DTO_ATTR_SET_CHOWN, + + DTO_NR +}; + /* * osd dev stats */ @@ -351,6 +468,8 @@ void osd_lprocfs_time_end(const struct lu_env *env, #endif int osd_statfs(const struct lu_env *env, struct dt_device *dev, cfs_kstatfs_t *sfs); +int osd_object_auth(const struct lu_env *env, struct dt_object *dt, + struct lustre_capa *capa, __u64 opc); /* * Invariants, assertions. @@ -406,5 +525,71 @@ osd_fid2oi(struct osd_device *osd, const struct lu_fid *fid) return &osd->od_oi_table[fid->f_seq & (osd->od_oi_count - 1)]; } +/* + * Helpers. + */ +extern const struct lu_device_operations osd_lu_ops; + +static inline int lu_device_is_osd(const struct lu_device *d) +{ + return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &osd_lu_ops); +} + +static inline struct osd_device *osd_dt_dev(const struct dt_device *d) +{ + LASSERT(lu_device_is_osd(&d->dd_lu_dev)); + return container_of0(d, struct osd_device, od_dt_dev); +} + +static inline struct osd_device *osd_dev(const struct lu_device *d) +{ + LASSERT(lu_device_is_osd(d)); + return osd_dt_dev(container_of0(d, struct dt_device, dd_lu_dev)); +} + +static inline struct osd_device *osd_obj2dev(const struct osd_object *o) +{ + return osd_dev(o->oo_dt.do_lu.lo_dev); +} + +static inline struct super_block *osd_sb(const struct osd_device *dev) +{ + return dev->od_mount->lmi_mnt->mnt_sb; +} + +static inline int osd_object_is_root(const struct osd_object *obj) +{ + return osd_sb(osd_obj2dev(obj))->s_root->d_inode == obj->oo_inode; +} + +static inline struct osd_object *osd_obj(const struct lu_object *o) +{ + LASSERT(lu_device_is_osd(o->lo_dev)); + return container_of0(o, struct osd_object, oo_dt.do_lu); +} + +static inline struct osd_object *osd_dt_obj(const struct dt_object *d) +{ + return osd_obj(&d->do_lu); +} + +static inline struct lu_device *osd2lu_dev(struct osd_device *osd) +{ + return &osd->od_dt_dev.dd_lu_dev; +} + +static inline journal_t *osd_journal(const struct osd_device *dev) +{ + return LDISKFS_SB(osd_sb(dev))->s_journal; +} + +extern const struct dt_body_operations osd_body_ops; +extern struct lu_context_key osd_key; + +static inline struct osd_thread_info *osd_oti_get(const struct lu_env *env) +{ + return lu_context_key_get(&env->le_ctx, &osd_key); +} + #endif /* __KERNEL__ */ #endif /* _OSD_INTERNAL_H */ -- 1.8.3.1