X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_compat.c;h=aab00b2f1574be81aa021c020c2db0dc99321ba8;hp=2c4098b4dc7b8dd8704317da655bbfb55e4d72bb;hb=c49ff6ff89725052a29aa91d780a881e7829dfa2;hpb=aca8e7a05cf52774c7233b6c21ba5172b3b2b3c2 diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c index 2c4098b..aab00b2 100644 --- a/lustre/osd-ldiskfs/osd_compat.c +++ b/lustre/osd-ldiskfs/osd_compat.c @@ -59,7 +59,7 @@ 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/ */ @@ -130,7 +130,7 @@ int osd_compat_seq_init(struct osd_device *osd, int 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); @@ -169,7 +169,7 @@ int osd_compat_seq_init(struct osd_device *osd, int seq) if (rc) osd_compat_seq_fini(osd, seq); out: - cfs_up(&grp->dir_init_sem); + up(&grp->dir_init_sem); RETURN(rc); } @@ -279,7 +279,7 @@ int osd_compat_init(struct osd_device *dev) /* 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); @@ -314,6 +314,7 @@ int osd_compat_del_entry(struct osd_thread_info *info, struct osd_device *osd, 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); @@ -344,6 +345,7 @@ int osd_compat_add_entry(struct osd_thread_info *info, struct osd_device *osd, 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; @@ -352,6 +354,7 @@ int osd_compat_add_entry(struct osd_thread_info *info, struct osd_device *osd, 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); @@ -483,19 +486,19 @@ struct named_oid { }; 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 */ }, + { MDD_LOV_OBJ_OID, LOV_OBJID }, { MDD_CAPA_KEYS_OID, "" /* CAPA_KEYS */ }, { 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" */ }, + { LLOG_CATALOGS_OID, "CATALOGS" }, { MGS_CONFIGS_OID, "" /* MOUNT_CONFIGS_DIR */ }, { OFD_HEALTH_CHECK_OID, HEALTH_CHECK }, { 0, NULL } @@ -531,6 +534,8 @@ int osd_compat_spec_insert(struct osd_thread_info *info, 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) @@ -547,17 +552,32 @@ int osd_compat_spec_lookup(struct osd_thread_info *info, 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) { @@ -569,6 +589,9 @@ int osd_compat_spec_lookup(struct osd_thread_info *info, 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); }