struct osd_directory {
struct iam_container od_container;
struct iam_descr od_descr;
- struct semaphore od_sem;
};
struct osd_object {
* creation, or assigned by osd_object_create() under write lock).
*/
struct inode *oo_inode;
+ /**
+ * to protect index ops.
+ */
+ struct rw_semaphore oo_ext_idx_sem;
struct rw_semaphore oo_sem;
struct osd_directory *oo_dir;
/** protects inode attributes. */
l->lo_ops = &osd_lu_obj_ops;
init_rwsem(&mo->oo_sem);
+ init_rwsem(&mo->oo_ext_idx_sem);
spin_lock_init(&mo->oo_guard);
return l;
} else
static int osd_create_post(struct osd_thread_info *info, struct osd_object *obj,
struct lu_attr *attr, struct thandle *th)
{
- LASSERT(obj->oo_inode != NULL);
-
osd_object_init0(obj);
return 0;
}
OBD_ALLOC_PTR(dir);
if (dir != NULL) {
- sema_init(&dir->od_sem, 1);
spin_lock(&obj->oo_guard);
if (obj->oo_dir == NULL)
* Now, that we have container data, serialize its
* initialization.
*/
- down(&obj->oo_dir->od_sem);
+ down_write(&obj->oo_ext_idx_sem);
/*
* recheck under lock.
*/
result = osd_iam_container_init(env, obj, dir);
else
result = 0;
- up(&obj->oo_dir->od_sem);
+ up_write(&obj->oo_ext_idx_sem);
} else
result = -ENOMEM;
} else
dentry = osd_child_dentry_get(env, obj,
(char *)key, strlen((char *)key));
+
+ down_write(&obj->oo_ext_idx_sem);
bh = ldiskfs_find_entry(dentry, &de);
if (bh) {
struct osd_thread_info *oti = osd_oti_get(env);
} else
rc = -ENOENT;
+ up_write(&obj->oo_ext_idx_sem);
LASSERT(osd_invariant(obj));
RETURN(rc);
}
dentry = osd_child_dentry_get(env, obj,
(char *)key, strlen((char *)key));
+
+ down_read(&obj->oo_ext_idx_sem);
bh = ldiskfs_find_entry(dentry, &de);
if (bh) {
ino = le32_to_cpu(de->inode);
rc = osd_ea_fid_get(env, dentry, rec);
iput(inode);
} else
- rc = -ENOENT;
+ rc = PTR_ERR(inode);
} else
rc = -ENOENT;
+ up_read(&obj->oo_ext_idx_sem);
RETURN (rc);
}
else
current->cap_effective &= ~CFS_CAP_SYS_RESOURCE_MASK;
#endif
+ down_write(&obj->oo_ext_idx_sem);
rc = osd_ea_add_rec(env, obj, child, name, th);
-
+ up_write(&obj->oo_ext_idx_sem);
#ifdef HAVE_QUOTA_SUPPORT
current->cap_effective = save;
#endif
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);
}
it->oie_namelen = 0;
it->oie_file.f_pos = it->oie_curr_pos;
+ down_read(&obj->oo_ext_idx_sem);
result = inode->i_fop->readdir(&it->oie_file, it,
(filldir_t) osd_ldiskfs_filldir);
+ up_read(&obj->oo_ext_idx_sem);
it->oie_next_pos = it->oie_file.f_pos;
if (it->oie_namelen == 0)