static void osd_conf_get (const struct lu_context *ctx,
const struct dt_device *dev,
struct dt_device_param *param);
+static int osd_read_locked (const struct lu_context *ctx,
+ struct osd_object *o);
+static int osd_write_locked (const struct lu_context *ctx,
+ struct osd_object *o);
static struct osd_object *osd_obj (const struct lu_object *o);
static struct osd_device *osd_dev (const struct lu_device *d);
#define osd_invariant(obj) (1)
#endif
+static int osd_read_locked(const struct lu_context *ctx, struct osd_object *o)
+{
+ struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
+
+ return oti->oti_r_locks > 0;
+}
+
+static int osd_write_locked(const struct lu_context *ctx, struct osd_object *o)
+{
+ struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
+
+ return oti->oti_w_locks > 0 && o->oo_owner == ctx;
+}
+
/* helper to push us into KERNEL_DS context */
static struct file *osd_rw_init(const struct lu_context *ctxt,
struct inode *inode, mm_segment_t *seg)
struct osd_object *obj = osd_dt_obj(dt);
LASSERT(dt_object_exists(dt));
LASSERT(osd_invariant(obj));
+ LASSERT(osd_read_locked(ctxt, obj) || osd_write_locked(ctxt, obj));
+
return osd_inode_getattr(ctxt, obj->oo_inode, attr);
}
struct osd_object *obj = osd_dt_obj(dt);
LASSERT(dt_object_exists(dt));
LASSERT(osd_invariant(obj));
+ LASSERT(osd_write_locked(ctxt, obj));
+
return osd_inode_setattr(ctxt, obj->oo_inode, attr);
}
LASSERT(osd_invariant(obj));
LASSERT(!dt_object_exists(dt));
+ LASSERT(osd_write_locked(ctx, obj));
/*
* XXX missing: permission checks.
LASSERT(osd_invariant(obj));
LASSERT(dt_object_exists(dt));
+ LASSERT(osd_write_locked(ctxt, obj));
+
if (inode->i_nlink < LDISKFS_LINK_MAX) {
inode->i_nlink ++;
mark_inode_dirty(inode);
LASSERT(osd_invariant(obj));
LASSERT(dt_object_exists(dt));
+ LASSERT(osd_write_locked(ctxt, obj));
+
if (inode->i_nlink > 0) {
inode->i_nlink --;
mark_inode_dirty(inode);
static int osd_xattr_get(const struct lu_context *ctxt, struct dt_object *dt,
void *buf, int size, const char *name)
{
- struct inode *inode = osd_dt_obj(dt)->oo_inode;
+ struct osd_object *obj = osd_dt_obj(dt);
+ struct inode *inode = obj->oo_inode;
struct osd_thread_info *info = lu_context_key_get(ctxt, &osd_key);
struct dentry *dentry = &info->oti_dentry;
LASSERT(dt_object_exists(dt));
LASSERT(inode->i_op != NULL && inode->i_op->getxattr != NULL);
+ LASSERT(osd_read_locked(ctxt, obj) || osd_write_locked(ctxt, obj));
+
dentry->d_inode = inode;
return inode->i_op->getxattr(dentry, name, buf, size);
}
{
int fs_flags;
- struct inode *inode = osd_dt_obj(dt)->oo_inode;
+ struct osd_object *obj = osd_dt_obj(dt);
+ struct inode *inode = obj->oo_inode;
struct osd_thread_info *info = lu_context_key_get(ctxt, &osd_key);
struct dentry *dentry = &info->oti_dentry;
LASSERT(dt_object_exists(dt));
LASSERT(inode->i_op != NULL && inode->i_op->setxattr != NULL);
+ LASSERT(osd_write_locked(ctxt, obj));
+
dentry->d_inode = inode;
fs_flags = 0;
static int osd_xattr_list(const struct lu_context *ctxt, struct dt_object *dt,
void *buf, int size)
{
- struct inode *inode = osd_dt_obj(dt)->oo_inode;
+ struct osd_object *obj = osd_dt_obj(dt);
+ struct inode *inode = obj->oo_inode;
struct osd_thread_info *info = lu_context_key_get(ctxt, &osd_key);
struct dentry *dentry = &info->oti_dentry;
LASSERT(dt_object_exists(dt));
LASSERT(inode->i_op != NULL && inode->i_op->listxattr != NULL);
+ LASSERT(osd_read_locked(ctxt, obj) || osd_write_locked(ctxt, obj));
+
dentry->d_inode = inode;
return inode->i_op->listxattr(dentry, buf, size);
}
static int osd_xattr_del(const struct lu_context *ctxt, struct dt_object *dt,
const char *name, struct thandle *handle)
{
- struct inode *inode = osd_dt_obj(dt)->oo_inode;
+ struct osd_object *obj = osd_dt_obj(dt);
+ struct inode *inode = obj->oo_inode;
struct osd_thread_info *info = lu_context_key_get(ctxt, &osd_key);
struct dentry *dentry = &info->oti_dentry;
LASSERT(dt_object_exists(dt));
LASSERT(inode->i_op != NULL && inode->i_op->removexattr != NULL);
+ LASSERT(osd_write_locked(ctxt, obj));
+
dentry->d_inode = inode;
return inode->i_op->removexattr(dentry, name);
}
LASSERT(dt_object_exists(dt));
LASSERT(osd_invariant(obj));
LASSERT(osd_has_index(obj));
+ LASSERT(osd_read_locked(ctxt, obj) || osd_write_locked(ctxt, obj));
LASSERT(rdpg->rp_pages != NULL);