#define zfs_refcount_add refcount_add
#endif
-extern struct dt_body_operations osd_body_scrub_ops;
-extern struct dt_body_operations osd_body_ops;
+extern const struct dt_body_operations osd_body_scrub_ops;
+extern const struct dt_body_operations osd_body_ops;
extern struct kmem_cache *osd_object_kmem;
/**
uint64_t atime[2];
uint64_t mtime[2];
uint64_t ctime[2];
+ uint64_t btime[2];
};
int osd_statfs(const struct lu_env *, struct dt_device *, struct obd_statfs *,
struct obd_statfs_info *);
extern const struct dt_index_operations osd_acct_index_ops;
-extern struct lu_device_operations osd_lu_ops;
-extern struct dt_index_operations osd_dir_ops;
+extern const struct lu_device_operations osd_lu_ops;
+extern const struct dt_index_operations osd_dir_ops;
int osd_declare_quota(const struct lu_env *env, struct osd_device *osd,
qid_t uid, qid_t gid, qid_t projid, long long space,
- struct osd_thandle *oh, int *flags,
+ struct osd_thandle *oh,
+ enum osd_quota_local_flags *local_flags,
enum osd_qid_declare_flags osd_qid_declare_flags);
uint64_t osd_objs_count_estimate(uint64_t refdbytes, uint64_t usedobjs,
uint64_t nrblocks, uint64_t est_maxblockshift);
static inline struct osd_object *osd_obj(const struct lu_object *o)
{
LASSERT(lu_device_is_osd(o->lo_dev));
- return container_of0(o, struct osd_object, oo_dt.do_lu);
+ return container_of(o, struct osd_object, oo_dt.do_lu);
}
static inline struct osd_device *osd_dt_dev(const struct dt_device *d)
{
LASSERT(lu_device_is_osd(&d->dd_lu_dev));
- return container_of0(d, struct osd_device, od_dt_dev);
+ return container_of(d, struct osd_device, od_dt_dev);
}
static inline struct osd_device *osd_dev(const struct lu_device *d)
{
LASSERT(lu_device_is_osd(d));
- return osd_dt_dev(container_of0(d, struct dt_device, dd_lu_dev));
+ return osd_dt_dev(container_of(d, struct dt_device, dd_lu_dev));
}
static inline struct osd_object *osd_dt_obj(const struct dt_object *d)
uint64_t oid, dnode_t **dnp);
/* osd_oi.c */
-int osd_oi_init(const struct lu_env *env, struct osd_device *o);
+int osd_oi_init(const struct lu_env *env, struct osd_device *o, bool reset);
void osd_oi_fini(const struct lu_env *env, struct osd_device *o);
int osd_fid_lookup(const struct lu_env *env,
struct osd_device *, const struct lu_fid *, uint64_t *);
nvlist_t **sa);
/* osd_scrub.c */
-int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev);
+int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev,
+ bool resetoi);
void osd_scrub_cleanup(const struct lu_env *env, struct osd_device *dev);
int osd_scrub_start(const struct lu_env *env, struct osd_device *dev,
__u32 flags);
int osd_oii_lookup(struct osd_device *dev, const struct lu_fid *fid,
uint64_t *oid);
+/**
+ * Basic transaction credit op
+ */
+enum dt_txn_op {
+ DTO_INDEX_INSERT,
+ DTO_INDEX_DELETE,
+ DTO_INDEX_UPDATE,
+ DTO_NR
+};
+
+int osd_scrub_refresh_mapping(const struct lu_env *env,
+ struct osd_device *dev,
+ const struct lu_fid *fid,
+ uint64_t oid, enum dt_txn_op ops,
+ bool force, const char *name);
+
+
/* osd_xattr.c */
int __osd_sa_xattr_schedule_update(const struct lu_env *env,
struct osd_object *obj,
const char *name, int *sizep);
int osd_xattr_get_internal(const struct lu_env *env, struct osd_object *obj,
struct lu_buf *buf, const char *name, int *sizep);
+int osd_xattr_get_lma(const struct lu_env *env, struct osd_object *obj,
+ struct lu_buf *buf);
int osd_xattr_get(const struct lu_env *env, struct dt_object *dt,
struct lu_buf *buf, const char *name);
int osd_declare_xattr_set(const struct lu_env *env, struct dt_object *dt,
int dnodesize, dmu_tx_t *tx)
{
if (dnodesize == 0)
- dnodesize = MAX(dmu_objset_dnodesize(os), DNODE_MIN_SIZE);
+ dnodesize = max_t(int, dmu_objset_dnodesize(os),
+ DNODE_MIN_SIZE);
return dmu_object_alloc_dnsize(os, objtype, blocksize, DMU_OT_SA,
DN_BONUS_SIZE(dnodesize), dnodesize, tx);
int indirect_blockshift, int dnodesize, dmu_tx_t *tx)
{
if (dnodesize == 0)
- dnodesize = MAX(dmu_objset_dnodesize(os), DNODE_MIN_SIZE);
+ dnodesize = max_t(int, dmu_objset_dnodesize(os),
+ DNODE_MIN_SIZE);
return zap_create_flags_dnsize(os, normflags, flags, ot,
leaf_blockshift, indirect_blockshift,
dmu_buf_rele(&db->db, osd_obj_tag);
}
+static inline uint64_t osd_db_dirty_txg(dmu_buf_impl_t *db)
+{
+ dbuf_dirty_record_t *dr;
+ uint64_t txg = 0;
+
+ mutex_enter(&db->db_mtx);
+#ifdef HAVE_DB_DIRTY_RECORDS_LIST
+ dr = list_head(&db->db_dirty_records);
+#else
+ dr = db->db_last_dirty;
+#endif
+ if (dr != NULL)
+ txg = dr->dr_txg;
+ mutex_exit(&db->db_mtx);
+
+ return txg;
+}
+
#ifdef HAVE_DMU_USEROBJ_ACCOUNTING
#define OSD_DMU_USEROBJ_PREFIX DMU_OBJACCT_PREFIX
#define inode_timespec_t timestruc_t
#endif
+#ifdef HAVE_DMU_OFFSET_NEXT
+#define osd_dmu_offset_next(os, obj, hole, res) \
+ dmu_offset_next((os), (obj), (hole), (res))
+#else
+#define osd_dmu_offset_next(os, obj, hole, res) (EBUSY)
+#endif
+
#endif /* _OSD_INTERNAL_H */