Whamcloud - gitweb
LU-2237 tests: new test for re-recreating last_rcvd
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_compat.c
index 2c4098b..aab00b2 100644 (file)
@@ -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/<seq> */
@@ -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);
        }