struct osd_compat_objid_seq {
/* protects on-fly initialization */
- cfs_semaphore_t dir_init_sem;
+ struct semaphore dir_init_sem;
/* file storing last created objid */
struct osd_inode_id last_id;
struct dentry *groot; /* O/<seq> */
if (grp->groot != NULL)
RETURN(0);
- cfs_down(&grp->dir_init_sem);
+ down(&grp->dir_init_sem);
sprintf(name, "%d", seq);
d = simple_mkdir(map->root, osd->od_mnt, name, 0755, 1);
if (rc)
osd_compat_seq_fini(osd, seq);
out:
- cfs_up(&grp->dir_init_sem);
+ up(&grp->dir_init_sem);
RETURN(rc);
}
/* Initialize all groups */
for (i = 0; i < MAX_OBJID_GROUP; i++) {
- cfs_sema_init(&dev->od_ost_map->groups[i].dir_init_sem, 1);
+ sema_init(&dev->od_ost_map->groups[i].dir_init_sem, 1);
rc = osd_compat_seq_init(dev, i);
if (rc) {
osd_compat_fini(dev);
child->d_parent = dird;
child->d_inode = NULL;
+ ll_vfs_dq_init(dir);
mutex_lock(&dir->i_mutex);
rc = -ENOENT;
bh = osd_ldiskfs_find_entry(dir, child, &de, NULL);
inode = &info->oti_inode;
inode->i_sb = osd_sb(osd);
osd_id_to_inode(inode, id);
+ inode->i_mode = S_IFREG; /* for type in ldiskfs dir entry */
child = &info->oti_child_dentry;
child->d_name.hash = 0;
child->d_parent = dir;
child->d_inode = inode;
+ ll_vfs_dq_init(dir->d_inode);
mutex_lock(&dir->d_inode->i_mutex);
rc = osd_ldiskfs_add_entry(oh->ot_handle, child, inode, NULL);
mutex_unlock(&dir->d_inode->i_mutex);
};
static const struct named_oid oids[] = {
- { FLD_INDEX_OID, "" /* "fld" */ },
- { FID_SEQ_CTL_OID, "" /* "seq_ctl" */ },
- { FID_SEQ_SRV_OID, "" /* "seq_srv" */ },
+ { FLD_INDEX_OID, "fld" },
+ { FID_SEQ_CTL_OID, "seq_ctl" },
+ { FID_SEQ_SRV_OID, "seq_srv" },
{ MDD_ROOT_INDEX_OID, "" /* "ROOT" */ },
{ MDD_ORPHAN_OID, "" /* "PENDING" */ },
{ MDD_LOV_OBJ_OID, LOV_OBJID },
{ MDT_LAST_RECV_OID, LAST_RCVD },
{ LFSCK_BOOKMARK_OID, "" /* "lfsck_bookmark" */ },
{ OTABLE_IT_OID, "" /* "otable iterator" */},
- { OFD_LAST_RECV_OID, "" /* LAST_RCVD */ },
+ { OFD_LAST_RECV_OID, LAST_RCVD },
{ OFD_LAST_GROUP_OID, "LAST_GROUP" },
{ LLOG_CATALOGS_OID, "CATALOGS" },
{ MGS_CONFIGS_OID, "" /* MOUNT_CONFIGS_DIR */ },
seq = fid_oid(fid) - OFD_GROUP0_LAST_OID;
LASSERT(seq < MAX_OBJID_GROUP);
LASSERT(map->groups[seq].groot);
+ rc = osd_compat_add_entry(info, osd, map->groups[seq].groot,
+ "LAST_ID", id, th);
} else {
name = oid2name(fid_oid(fid));
if (name == NULL)
struct osd_device *osd, const struct lu_fid *fid,
struct osd_inode_id *id)
{
+ struct dentry *root;
struct dentry *dentry;
struct inode *inode;
char *name;
int rc = -ENOENT;
ENTRY;
- name = oid2name(fid_oid(fid));
- if (name == NULL || strlen(name) == 0)
- RETURN(-ENOENT);
+ if (fid_oid(fid) >= OFD_GROUP0_LAST_OID &&
+ fid_oid(fid) < OFD_GROUP4K_LAST_OID) {
+ struct osd_compat_objid *map = osd->od_ost_map;
+ int seq;
+
+ LASSERT(map);
+ seq = fid_oid(fid) - OFD_GROUP0_LAST_OID;
+ LASSERT(seq < MAX_OBJID_GROUP);
+ LASSERT(map->groups[seq].groot);
+ root = map->groups[seq].groot;
+ name = "LAST_ID";
+ } else {
+ root = osd_sb(osd)->s_root;
+ name = oid2name(fid_oid(fid));
+ if (name == NULL || strlen(name) == 0)
+ RETURN(-ENOENT);
+ }
- dentry = ll_lookup_one_len(name, osd_sb(osd)->s_root, strlen(name));
+ dentry = ll_lookup_one_len(name, root, strlen(name));
if (!IS_ERR(dentry)) {
inode = dentry->d_inode;
if (inode) {
rc = 0;
}
}
+ /* if dentry is accessible after osd_compat_spec_insert it
+ * will still contain NULL inode, so don't keep it in cache */
+ d_invalidate(dentry);
dput(dentry);
}