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;
}
#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
*/
{
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);
* 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) +
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);
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);
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);
* \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;
}
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;
* 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));
}
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;
/*
* 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));
/*
* 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);
}
-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)
{
/*
* 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;
}
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;
/*
* 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);
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;
.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
*/
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;
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);
* \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);
struct ldiskfs_dir_entry_2 *de;
struct buffer_head *bh;
struct htree_lock *hlock = NULL;
-
- int rc;
+ int rc;
ENTRY;
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));
* \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;
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;
* \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);
* 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;
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);
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)) {
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;
__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));
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);
*/
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;
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) {
*/
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;
*/
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);
*/
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;
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;
}
/**
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;
}
*/
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;
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;
}
/**
/* 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,
.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,
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);