Whamcloud - gitweb
b=23588 conf-sanity.sh:test_50g - wait for new OST addition propagation to a client
[fs/lustre-release.git] / lustre / obdclass / md_local_object.c
index 919c284..1d459a7 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
 
 
 /** List head to hold list of objects to be created. */
-static struct list_head llo_lobj_list;
+static cfs_list_t llo_lobj_list;
 
 /** Lock to protect list manipulations */
-static struct mutex     llo_lock;
+static cfs_mutex_t     llo_lock;
 
 /**
  * Structure used to maintain state of path parsing.
@@ -135,7 +135,7 @@ static int llo_lookup(const struct lu_env  *env,
 
         spec->sp_feat = NULL;
         spec->sp_cr_flags = 0;
-        spec->sp_cr_lookup = 1;
+        spec->sp_cr_lookup = 0;
         spec->sp_cr_mode = 0;
         spec->sp_ck_split = 0;
 
@@ -148,6 +148,10 @@ static int llo_lookup(const struct lu_env  *env,
 /**
  * Function to look up path component, this is passed to parsing
  * function. \see llo_store_resolve
+ *
+ * \retval      rc returns error code for lookup or locate operation
+ *
+ * pointer to object is returned in data (lfh->lfh_pobj)
  */
 static int llo_find_entry(const struct lu_env  *env,
                           const char *name, void *data)
@@ -205,7 +209,7 @@ struct md_object *llo_store_resolve(const struct lu_env *env,
         struct llo_thread_info *info = llo_env_info(env);
         struct llo_find_hint *lfh = &info->lti_lfh;
         char *local = info->lti_buf;
-        struct md_object        *obj = lfh->lfh_pobj;
+        struct md_object        *obj;
         int result;
 
         strncpy(local, path, DT_MAX_PATH);
@@ -224,6 +228,8 @@ struct md_object *llo_store_resolve(const struct lu_env *env,
                         result = dt_path_parser(env, local, llo_find_entry, lfh);
                         if (result != 0)
                                 obj = ERR_PTR(result);
+                        else
+                                obj = lfh->lfh_pobj;
                 }
         } else {
                 obj = ERR_PTR(result);
@@ -286,7 +292,7 @@ static struct md_object *llo_create_obj(const struct lu_env *env,
         spec->sp_ck_split = 0;
 
         if (feat == &dt_directory_features)
-                la->la_mode = S_IFDIR;
+                la->la_mode = S_IFDIR | S_IXUGO;
         else
                 la->la_mode = S_IFREG;
 
@@ -312,7 +318,7 @@ static struct md_object *llo_create_obj(const struct lu_env *env,
  * special index defined by \a feat in \a directory.
  *
  *       \param  md       device
- *       \param  dir      parent directory
+ *       \param  dirname  parent directory
  *       \param  objname  file name
  *       \param  fid      object fid
  *       \param  feat     index features required for directory create
@@ -347,7 +353,7 @@ EXPORT_SYMBOL(llo_store_create_index);
  * Create md object for regular file in \a directory.
  *
  *       \param  md       device
- *       \param  dir      parent directory
+ *       \param  dirname  parent directory
  *       \param  objname  file name
  *       \param  fid      object fid.
  */
@@ -367,19 +373,27 @@ EXPORT_SYMBOL(llo_store_create);
 
 /**
  * Register object for 'create on first mount' facility.
+ * objects are created in order of registration.
  */
 
-int llo_local_obj_register(struct lu_local_obj_desc *llod)
+void llo_local_obj_register(struct lu_local_obj_desc *llod)
 {
-        mutex_lock(&llo_lock);
-        list_add(&llod->llod_linkage, &llo_lobj_list);
-        mutex_unlock(&llo_lock);
-
-        return 0;
+        cfs_mutex_lock(&llo_lock);
+        cfs_list_add_tail(&llod->llod_linkage, &llo_lobj_list);
+        cfs_mutex_unlock(&llo_lock);
 }
 
 EXPORT_SYMBOL(llo_local_obj_register);
 
+void llo_local_obj_unregister(struct lu_local_obj_desc *llod)
+{
+        cfs_mutex_lock(&llo_lock);
+        cfs_list_del(&llod->llod_linkage);
+        cfs_mutex_unlock(&llo_lock);
+}
+
+EXPORT_SYMBOL(llo_local_obj_unregister);
+
 /**
  * Created registed objects.
  */
@@ -392,24 +406,26 @@ int llo_local_objects_setup(const struct lu_env *env,
         struct lu_fid *fid;
         struct lu_local_obj_desc *scan;
         struct md_object *mdo;
+        const char *dir;
         int rc = 0;
 
         fid = &info->lti_cfid;
+        cfs_mutex_lock(&llo_lock);
 
-        mutex_lock(&llo_lock);
-
-        list_for_each_entry(scan, &llo_lobj_list, llod_linkage) {
-
+        cfs_list_for_each_entry(scan, &llo_lobj_list, llod_linkage) {
                 lu_local_obj_fid(fid, scan->llod_oid);
+                dir = "";
+                if (scan->llod_dir)
+                        dir = scan->llod_dir;
 
                 if (scan->llod_is_index)
                         mdo = llo_store_create_index(env, md, dt ,
-                                                     "", scan->llod_name,
+                                                     dir, scan->llod_name,
                                                      fid,
                                                      scan->llod_feat);
                 else
                         mdo = llo_store_create(env, md, dt,
-                                               "", scan->llod_name,
+                                               dir, scan->llod_name,
                                                fid);
                 if (IS_ERR(mdo) && PTR_ERR(mdo) != -EEXIST) {
                         rc = PTR_ERR(mdo);
@@ -423,7 +439,7 @@ int llo_local_objects_setup(const struct lu_env *env,
         }
 
 out:
-        mutex_unlock(&llo_lock);
+        cfs_mutex_unlock(&llo_lock);
         return rc;
 }
 
@@ -434,7 +450,7 @@ int llo_global_init(void)
         int result;
 
         CFS_INIT_LIST_HEAD(&llo_lobj_list);
-        mutex_init(&llo_lock);
+        cfs_mutex_init(&llo_lock);
 
         LU_CONTEXT_KEY_INIT(&llod_key);
         result = lu_context_key_register(&llod_key);
@@ -444,4 +460,5 @@ int llo_global_init(void)
 void llo_global_fini(void)
 {
         lu_context_key_degister(&llod_key);
+        LASSERT(cfs_list_empty(&llo_lobj_list));
 }