struct osd_device *osd = osd_obj2dev(obj);
struct osd_thread_info *oti = osd_oti_get(env);
struct txn_param *prm = &oti->oti_txn;
+ struct lu_env *env_del_obj = &oti->oti_obj_delete_tx_env;
struct thandle *th;
int result;
+ lu_env_init(env_del_obj, LCT_DT_THREAD);
txn_param_init(prm, OSD_TXN_OI_DELETE_CREDITS +
OSD_TXN_INODE_DELETE_CREDITS);
- th = osd_trans_start(env, &osd->od_dt_dev, prm);
+ th = osd_trans_start(env_del_obj, &osd->od_dt_dev, prm);
if (!IS_ERR(th)) {
- result = osd_oi_delete(oti, &osd->od_oi, fid, th);
- osd_trans_stop(env, th);
+ result = osd_oi_delete(osd_oti_get(env_del_obj),
+ &osd->od_oi, fid, th);
+ osd_trans_stop(env_del_obj, th);
} else
result = PTR_ERR(th);
+
+ lu_env_fini(env_del_obj);
return result;
}
LDISKFS_I(inode)->i_disksize = attr->la_size;
i_size_write(inode, attr->la_size);
}
-# if 0
- /*
- * OSD should not change "i_blocks" which is used by quota.
+
+ /* OSD should not change "i_blocks" which is used by quota.
* "i_blocks" should be changed by ldiskfs only.
- * Disable this assignment until SOM to fix some EA field. */
+ * Enable this assignment for SOM purpose now, until it is
+ * stored in SOM EA. */
if (bits & LA_BLOCKS)
inode->i_blocks = attr->la_blocks;
-#endif
+
if (bits & LA_MODE)
inode->i_mode = (inode->i_mode & S_IFMT) |
(attr->la_mode & ~S_IFMT);
if (inode == NULL) {
CERROR("no inode\n");
inode = ERR_PTR(-EACCES);
- } else if (is_bad_inode(inode)) {
- CERROR("bad inode\n");
- iput(inode);
- inode = ERR_PTR(-ENOENT);
} else if (id->oii_gen != OSD_OII_NOGEN &&
inode->i_generation != id->oii_gen) {
- CERROR("stale inode\n");
iput(inode);
inode = ERR_PTR(-ESTALE);
} else if (inode->i_nlink == 0) {
/* due to parallel readdir and unlink,
* we can have dead inode here. */
+ CWARN("stale inode\n");
make_bad_inode(inode);
iput(inode);
inode = ERR_PTR(-ESTALE);
+ } else if (is_bad_inode(inode)) {
+ CERROR("bad inode %lx\n",inode->i_ino);
+ iput(inode);
+ inode = ERR_PTR(-ENOENT);
}
-
return inode;
}