#include <linux/fs.h>
/* XATTR_{REPLACE,CREATE} */
#include <linux/xattr.h>
-/*
- * XXX temporary stuff: direct access to ldiskfs/jdb. Interface between osd
- * and file system is not yet specified.
- */
-/* handle_t, journal_start(), journal_stop() */
-#include <linux/jbd.h>
-/* LDISKFS_SB() */
-#include <linux/ldiskfs_fs.h>
-#include <linux/ldiskfs_jbd.h>
/* simple_mkdir() */
#include <lvfs.h>
struct osd_device *dev,
const struct osd_inode_id *id)
{
- struct inode *inode;
+ 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);
* be used.
*/
- jh = journal_start(osd_journal(dev), p->tp_credits);
+ jh = ldiskfs_journal_start_sb(osd_sb(dev), p->tp_credits);
if (!IS_ERR(jh)) {
oh->ot_handle = jh;
th = &oh->ot_super;
/* add commit callback */
lu_context_init(&th->th_ctx, LCT_TX_HANDLE);
lu_context_enter(&th->th_ctx);
- journal_callback_set(jh, osd_trans_commit_cb,
- (struct journal_callback *)&oh->ot_jcb);
+ osd_journal_callback_set(jh, osd_trans_commit_cb,
+ (struct journal_callback *)&oh->ot_jcb);
LASSERT(oti->oti_txns == 0);
LASSERT(oti->oti_r_locks == 0);
LASSERT(oti->oti_w_locks == 0);
if (result != 0)
CERROR("Failure in transaction hook: %d\n", result);
oh->ot_handle = NULL;
- result = journal_stop(hdl);
+ result = ldiskfs_journal_stop(hdl);
if (result != 0)
CERROR("Failure to stop transaction: %d\n", result);
}
/**
* Xattr set. The same as xattr of EXT3.
* DATA_TRANS_BLOCKS(14)
- * XXX Note: in original MDS implmentation INDEX_EXTRA_TRANS_BLOCKS are
- * also counted in. Do not know why?
+ * XXX Note: in original MDS implmentation INDEX_EXTRA_TRANS_BLOCKS
+ * are also counted in. Do not know why?
*/
[DTO_XATTR_SET] = 14,
[DTO_LOG_REC] = 14,
[DTO_WRITE_BLOCK] = 14,
/**
* Attr set credits for chown.
- * 3 (inode bit, group, GDT)
+ * This is extra credits for setattr, and it is null without quota
*/
- [DTO_ATTR_SET_CHOWN]= 3
+ [DTO_ATTR_SET_CHOWN]= 0
};
/**
[DTO_WRITE_BLOCK] = 16,
/**
* Attr set credits for chown.
- * 3 (inode bit, group, GDT) +
+ * It is added to already set setattr credits
* 2 * QUOTA_INIT_BLOCKS(25) +
* 2 * QUOTA_DEL_BLOCKS(9)
*/
- [DTO_ATTR_SET_CHOWN]= 71
+ [DTO_ATTR_SET_CHOWN]= 68,
};
static int osd_credit_get(const struct lu_env *env, struct dt_device *d,
*/
result = iam_lvar_create(obj->oo_inode, OSD_NAME_LEN, 4,
- sizeof (struct lu_fid_pack),
+ sizeof (struct osd_fid_pack),
oth->ot_handle);
}
return result;
/**
* Helper function to pack the fid
*/
-static inline void osd_fid_pack(const struct lu_env *env, const struct lu_fid *fid,
- struct dt_rec *pack)
+void osd_fid_pack(struct osd_fid_pack *pack, const struct dt_rec *fid,
+ struct lu_fid *befider)
{
- fid_pack((struct lu_fid_pack *)pack, fid, &osd_oti_get(env)->oti_fid);
+ fid_cpu_to_be(befider, (struct lu_fid *)fid);
+ memcpy(pack->fp_area, befider, sizeof(*befider));
+ pack->fp_len = sizeof(*befider) + 1;
+}
+
+int osd_fid_unpack(struct lu_fid *fid, const struct osd_fid_pack *pack)
+{
+ int result;
+
+ result = 0;
+ switch (pack->fp_len) {
+ case sizeof *fid + 1:
+ memcpy(fid, pack->fp_area, sizeof *fid);
+ fid_be_to_cpu(fid, fid);
+ break;
+ default:
+ CERROR("Unexpected packed fid size: %d\n", pack->fp_len);
+ result = -EIO;
+ }
+ return result;
}
/**
descr = o->oo_dir->od_container.ic_descr;
if (feat == &dt_directory_features) {
- if (descr->id_rec_size == sizeof(struct lu_fid_pack))
+ if (descr->id_rec_size == sizeof(struct osd_fid_pack))
return 1;
else
return 0;
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;
ENTRY;
iam_it_init(it, bag, 0, ipd);
rc = iam_it_get(it, (struct iam_key *)key);
- if (rc >= 0)
- iam_reccpy(&it->ii_path.ip_leaf, (struct iam_rec *)rec);
+ if (rc >= 0) {
+ if (S_ISDIR(obj->oo_inode->i_mode))
+ iam_rec = (struct iam_rec *)oti->oti_fid_packed;
+ else
+ iam_rec = (struct iam_rec *) rec;
+ iam_reccpy(&it->ii_path.ip_leaf, (struct iam_rec *)iam_rec);
+ if (S_ISDIR(obj->oo_inode->i_mode))
+ osd_fid_unpack((struct lu_fid *) rec,
+ (struct osd_fid_pack *)iam_rec);
+ }
iam_it_put(it);
iam_it_fini(it);
osd_ipd_put(env, bag, ipd);
#ifdef HAVE_QUOTA_SUPPORT
cfs_cap_t save = current->cap_effective;
#endif
+ struct osd_thread_info *oti = osd_oti_get(env);
+ struct iam_rec *iam_rec = (struct iam_rec *)oti->oti_fid_packed;
int rc;
ENTRY;
else
current->cap_effective &= ~CFS_CAP_SYS_RESOURCE_MASK;
#endif
+ if (S_ISDIR(obj->oo_inode->i_mode))
+ osd_fid_pack((struct osd_fid_pack *)iam_rec, rec, &oti->oti_fid);
+ else
+ iam_rec = (struct iam_rec *) rec;
rc = iam_insert(oh->ot_handle, bag, (const struct iam_key *)key,
- (struct iam_rec *)rec, ipd);
+ iam_rec, ipd);
#ifdef HAVE_QUOTA_SUPPORT
current->cap_effective = save;
#endif
struct dt_rec *rec, const struct dt_key *key)
{
struct inode *dir = obj->oo_inode;
- struct osd_thread_info *info = osd_oti_get(env);
struct dentry *dentry;
struct ldiskfs_dir_entry_2 *de;
struct buffer_head *bh;
- struct lu_fid *fid = &info->oti_fid;
+ struct lu_fid *fid = (struct lu_fid *) rec;
int ino;
int rc;
ino = le32_to_cpu(de->inode);
brelse(bh);
rc = osd_ea_fid_get(env, obj, ino, fid);
- if (rc == 0)
- osd_fid_pack(env, fid, rec);
} else
rc = -ENOENT;
struct lustre_capa *capa, int ignore_quota)
{
struct osd_object *obj = osd_dt_obj(dt);
- struct lu_fid *fid = &osd_oti_get(env)->oti_fid;
- const struct lu_fid_pack *pack = (const struct lu_fid_pack *)rec;
+ struct lu_fid *fid = (struct lu_fid *) rec;
const char *name = (const char *)key;
struct osd_object *child;
#ifdef HAVE_QUOTA_SUPPORT
if (osd_object_auth(env, dt, capa, CAPA_OPC_INDEX_INSERT))
RETURN(-EACCES);
- rc = fid_unpack(pack, fid);
- if (rc != 0)
- RETURN(rc);
child = osd_object_find(env, dt, fid);
if (!IS_ERR(child)) {
struct inode *inode = obj->oo_inode;
struct osd_it_iam *it = (struct osd_it_iam *)di;
struct osd_thread_info *info = osd_oti_get(env);
struct lu_fid *fid = &info->oti_fid;
- const struct lu_fid_pack *rec;
+ const struct osd_fid_pack *rec;
char *name;
int namelen;
__u64 hash;
namelen = iam_it_key_size(&it->oi_it);
- rec = (const struct lu_fid_pack *) iam_it_rec_get(&it->oi_it);
+ rec = (const struct osd_fid_pack *) iam_it_rec_get(&it->oi_it);
if (IS_ERR(rec))
RETURN(PTR_ERR(rec));
- rc = fid_unpack(rec, fid);
+ rc = osd_fid_unpack(fid, rec);
if (rc)
RETURN(rc);
it->oie_file.f_op = obj->oo_inode->i_fop;
it->oie_file.private_data = NULL;
lu_object_get(lo);
- RETURN((struct dt_it*) it);
+ RETURN((struct dt_it *) it);
}
/**
struct lustre_sb_info *lsi;
ENTRY;
-
if (o->od_mount != NULL) {
CERROR("Already mounted (%s)\n", dev);
RETURN(-EEXIST);
static int osd_recovery_complete(const struct lu_env *env,
struct lu_device *d)
{
- struct osd_device *o = osd_dev(d);
- ENTRY;
- /* TODO: orphans handling */
- ldiskfs_orphan_cleanup(osd_sb(o), LDISKFS_SB(osd_sb(o))->s_es);
RETURN(0);
}