#define DEBUG_SUBSYSTEM S_OSD
-#include <lustre_ver.h>
#include <libcfs/libcfs.h>
#include <obd_support.h>
#include <lustre_net.h>
#include <obd_class.h>
#include <lustre_disk.h>
#include <lustre_fid.h>
-#include <lustre_param.h>
+#include <uapi/linux/lustre/lustre_param.h>
#include <md_object.h>
#include "osd_internal.h"
struct lu_env env;
int rc;
+ LASSERT(site->ls_obj_hash);
+
rc = lu_env_init(&env, LCT_SHRINKER);
if (rc) {
CERROR("%s: can't initialize shrinker env: rc = %d\n",
lu_device_put(lud);
th->th_dev = NULL;
- lu_context_exit(&th->th_ctx);
- lu_context_fini(&th->th_ctx);
OBD_FREE_PTR(oh);
EXIT;
/* add commit callback */
dmu_tx_callback_register(oh->ot_tx, osd_trans_commit_cb, oh);
oh->ot_assigned = 1;
- lu_context_init(&th->th_ctx, th->th_tags);
- lu_context_enter(&th->th_ctx);
lu_device_get(&d->dd_lu_dev);
}
if (oh->ot_assigned == 0) {
LASSERT(oh->ot_tx);
dmu_tx_abort(oh->ot_tx);
- osd_object_sa_dirty_rele(oh);
+ osd_object_sa_dirty_rele(env, oh);
osd_unlinked_list_emptify(env, osd, &unlinked, false);
/* there won't be any commit, release reserved quota space now,
* if any */
LASSERT(oh->ot_tx);
txg = oh->ot_tx->tx_txg;
- osd_object_sa_dirty_rele(oh);
+ osd_object_sa_dirty_rele(env, oh);
/* XXX: Once dmu_tx_commit() called, oh/th could have been freed
* by osd_trans_commit_cb already. */
dmu_tx_commit(oh->ot_tx);
INIT_LIST_HEAD(&oh->ot_stop_dcb_list);
INIT_LIST_HEAD(&oh->ot_unlinked_list);
INIT_LIST_HEAD(&oh->ot_sa_list);
- sema_init(&oh->ot_sa_lock, 1);
memset(&oh->ot_quota_trans, 0, sizeof(oh->ot_quota_trans));
th = &oh->ot_super;
th->th_dev = dt;
th->th_result = 0;
- th->th_tags = LCT_TX_HANDLE;
RETURN(th);
}
info->oti_ins_cache = NULL;
info->oti_ins_cache_size = 0;
}
+ lu_buf_free(&info->oti_xattr_lbuf);
OBD_FREE_PTR(info);
}
osd->od_prop_rdonly = !!newval;
}
+static void osd_dnodesize_changed_cb(void *arg, uint64_t newval)
+{
+ struct osd_device *osd = arg;
+
+ osd->od_dnsize = newval;
+}
+
/*
* This function unregisters all registered callbacks. It's harmless to
* unregister callbacks that were never registered so it is used to safely
osd_recordsize_changed_cb, o);
(void) dsl_prop_unregister(ds, zfs_prop_to_name(ZFS_PROP_READONLY),
osd_readonly_changed_cb, o);
+ (void) dsl_prop_unregister(ds, zfs_prop_to_name(ZFS_PROP_DNODESIZE),
+ osd_readonly_changed_cb, o);
if (o->arc_prune_cb != NULL) {
arc_remove_prune_callback(o->arc_prune_cb);
if (rc)
GOTO(err, rc);
+ rc = -dsl_prop_register(ds, zfs_prop_to_name(ZFS_PROP_DNODESIZE),
+ osd_dnodesize_changed_cb, o);
+ if (rc)
+ GOTO(err, rc);
+
o->arc_prune_cb = arc_add_prune_callback(arc_prune_func, o);
err:
dsl_pool_config_exit(dp, FTAG);
int rc;
ENTRY;
- rc = -dmu_objset_own(o->od_mntdev, DMU_OST_ZFS,
+ rc = -osd_dmu_objset_own(o->od_mntdev, DMU_OST_ZFS,
o->od_dt_dev.dd_rdonly ? B_TRUE : B_FALSE,
- o, &o->od_os);
+ B_FALSE, o, &o->od_os);
+
if (rc) {
CERROR("%s: can't open %s\n", o->od_svname, o->od_mntdev);
o->od_os = NULL;
out:
if (rc != 0 && o->od_os != NULL) {
- dmu_objset_disown(o->od_os, o);
+ osd_dmu_objset_disown(o->od_os, B_FALSE, o);
o->od_os = NULL;
}
o->od_xattr_in_sa = B_TRUE;
o->od_max_blksz = osd_spa_maxblocksize(o->od_os->os_spa);
- rc = osd_objset_register_callbacks(o);
- if (rc)
- GOTO(err, rc);
-
rc = __osd_obj2dnode(o->od_os, o->od_rootid, &rootdn);
if (rc)
GOTO(err, rc);
if (rc)
GOTO(err, rc);
+#ifdef ZFS_PROJINHERIT
+ if (dmu_objset_projectquota_enabled(o->od_os)) {
+ rc = __osd_obj2dnode(o->od_os, DMU_PROJECTUSED_OBJECT,
+ &o->od_projectused_dn);
+ if (rc && rc != -ENOENT)
+ GOTO(err, rc);
+ }
+#endif
+
/* 1. initialize oi before any file create or file open */
rc = osd_oi_init(env, o);
if (rc)
if (rc)
GOTO(err, rc);
+ rc = osd_objset_register_callbacks(o);
+ if (rc)
+ GOTO(err, rc);
+
rc = osd_procfs_init(o, o->od_svname);
if (rc)
GOTO(err, rc);
GOTO(err, rc);
}
+#ifdef HAVE_DMU_USEROBJ_ACCOUNTING
+ if (!osd_dmu_userobj_accounting_available(o))
+ CWARN("%s: dnode accounting not enabled: "
+ "enable feature@userobj_accounting in pool\n",
+ o->od_mntdev);
+#endif
+
/* parse mount option "noacl", and enable ACL by default */
opts = lustre_cfg_string(cfg, 3);
if (opts == NULL || strstr(opts, "noacl") == NULL)
osd_unlinked_drain(env, o);
err:
if (rc && o->od_os) {
- dmu_objset_disown(o->od_os, o);
+ osd_dmu_objset_disown(o->od_os, B_FALSE, o);
o->od_os = NULL;
}
o->od_groupused_dn = NULL;
}
+#ifdef ZFS_PROJINHERIT
+ if (o->od_projectused_dn) {
+ osd_dnode_rele(o->od_projectused_dn);
+ o->od_projectused_dn = NULL;
+ }
+#endif
+
if (o->od_os != NULL) {
if (!o->od_dt_dev.dd_rdonly)
/* force a txg sync to get all commit callbacks */
txg_wait_synced(dmu_objset_pool(o->od_os), 0ULL);
/* close the object set */
- dmu_objset_disown(o->od_os, o);
-
+ osd_dmu_objset_disown(o->od_os, B_FALSE, o);
o->od_os = NULL;
}
LASSERT(&o->od_dt_dev);
rc = class_process_proc_param(PARAM_OSD, lprocfs_osd_obd_vars,
cfg, &o->od_dt_dev);
- if (rc > 0 || rc == -ENOSYS)
+ if (rc > 0 || rc == -ENOSYS) {
rc = class_process_proc_param(PARAM_OST,
lprocfs_osd_obd_vars,
cfg, &o->od_dt_dev);
+ if (rc > 0)
+ rc = 0;
+ }
break;
}
default: