static struct dt_object_operations osd_obj_ops;
static struct lu_object_operations osd_lu_obj_ops;
-extern struct dt_body_operations osd_body_ops;
static struct dt_object_operations osd_obj_otable_it_ops;
-extern struct kmem_cache *osd_object_kmem;
-
static void
osd_object_sa_fini(struct osd_object *obj)
{
dbi = (dmu_buf_impl_t *)db;
DB_DNODE_ENTER(dbi);
*dnp = DB_DNODE(dbi);
+ DB_DNODE_EXIT(dbi);
LASSERT(*dnp != NULL);
return 0;
}
#ifdef ZFS_PROJINHERIT
if (attr && attr->la_valid & LA_PROJID) {
- if (!osd->od_projectused_dn)
- GOTO(out, rc = -EOPNOTSUPP);
-
- /* Usually, if project quota is upgradable for the device,
- * then the upgrade will be done before or when mount the
- * device. So when we come here, this project should have
- * project ID attribute already (that is zero by default).
- * Otherwise, there was something wrong during the former
- * upgrade, let's return failure to report that.
- *
- * Please note that, different from other attributes, you
- * can NOT simply set the project ID attribute under such
- * case, because adding (NOT change) project ID attribute
- * needs to change the object's attribute layout to match
- * zfs backend quota accounting requirement. */
- if (unlikely(!obj->oo_with_projid))
- GOTO(out, rc = -ENXIO);
-
/* quota enforcement for project */
if (attr->la_projid != obj->oo_attr.la_projid) {
+ if (!osd->od_projectused_dn)
+ GOTO(out, rc = -EOPNOTSUPP);
+
+ /* Usually, if project quota is upgradable for the
+ * device, then the upgrade will be done before or when
+ * mount the device. So when we come here, this project
+ * should have project ID attribute already (that is
+ * zero by default). Otherwise, there was something
+ * wrong during the former upgrade, let's return failure
+ * to report that.
+ *
+ * Please note that, different from other attributes,
+ * you can NOT simply set the project ID attribute under
+ * such case, because adding (NOT change) project ID
+ * attribute needs to change the object's attribute
+ * layout to match zfs backend quota accounting
+ * requirement. */
+ if (unlikely(!obj->oo_with_projid))
+ GOTO(out, rc = -ENXIO);
+
rc = qsd_transfer(env, osd_def_qsd(osd),
&oh->ot_quota_trans, PRJQUOTA,
obj->oo_attr.la_projid,
if (valid & LA_PROJID) {
#ifdef ZFS_PROJINHERIT
- /* osd_declare_attr_set() must be called firstly.
- * If osd::od_projectused_dn is not set, then we
- * can not arrive at here. */
- LASSERT(osd->od_projectused_dn);
- LASSERT(obj->oo_with_projid);
+ if (osd->od_projectused_dn) {
+ LASSERT(obj->oo_with_projid);
- osa->projid = obj->oo_attr.la_projid = la->la_projid;
- SA_ADD_BULK_ATTR(bulk, cnt, SA_ZPL_PROJID(osd), NULL,
- &osa->projid, 8);
-#else
- valid &= ~LA_PROJID;
+ osa->projid = obj->oo_attr.la_projid = la->la_projid;
+ SA_ADD_BULK_ATTR(bulk, cnt, SA_ZPL_PROJID(osd), NULL,
+ &osa->projid, 8);
+ } else
#endif
+ valid &= ~LA_PROJID;
}
if (valid & LA_ATIME) {
* copy */
obj->oo_attr.la_flags = attrs_zfs2fs(osa->flags);
#ifdef ZFS_PROJINHERIT
- if (obj->oo_with_projid)
+ if (obj->oo_with_projid && osd->od_projectused_dn)
osa->flags |= ZFS_PROJID;
#endif
SA_ADD_BULK_ATTR(bulk, cnt, SA_ZPL_FLAGS(osd), NULL,
switch (dof->dof_type) {
case DFT_DIR:
dt->do_index_ops = &osd_dir_ops;
+ /* fallthrough */
case DFT_INDEX:
/* for zap create */
dmu_tx_hold_zap(oh->ot_tx, DMU_NEW_OBJECT, FALSE, NULL);
atomic_inc_32(&dn->dn_dbufs_count);
}
*dnp = dn;
+ DB_DNODE_EXIT(db);
dbuf_read(db, NULL, DB_RF_MUST_SUCCEED | DB_RF_NOPREFETCH);
break;
}
__u64 start, __u64 end)
{
struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
+ struct dmu_buf_impl *db = osd_dt_obj(dt)->oo_dn->dn_dbuf;
+ uint64_t txg = 0;
ENTRY;
- /* XXX: no other option than syncing the whole filesystem until we
- * support ZIL. If the object tracked the txg that it was last
- * modified in, it could pass that txg here instead of "0". Maybe
- * the changes are already committed, so no wait is needed at all? */
- if (!osd->od_dt_dev.dd_rdonly) {
+ if (osd->od_dt_dev.dd_rdonly)
+ RETURN(0);
+
+ mutex_enter(&db->db_mtx);
+ if (db->db_last_dirty)
+ txg = db->db_last_dirty->dr_txg;
+ mutex_exit(&db->db_mtx);
+
+ if (txg) {
+ /* the object is dirty or being synced */
if (osd_object_sync_delay_us < 0)
- txg_wait_synced(dmu_objset_pool(osd->od_os), 0ULL);
+ txg_wait_synced(dmu_objset_pool(osd->od_os), txg);
else
udelay(osd_object_sync_delay_us);
}