*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*
* lustre/osd-zfs/osd_internal.h
* Shared definitions and declarations for zfs/dmu osd
#define zfs_refcount_add refcount_add
#endif
-extern struct dt_body_operations osd_body_scrub_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;
/**
* Iterator's in-memory data structure for quota file.
unsigned oiq_reset:1; /* 1 -- no need to advance */
};
-/**
- * Iterator's in-memory data structure for ZAPs
- *
- * ZFS does not store . and .. on a disk, instead they are
- * generated up on request
- * to follow this format we do the same
- */
-struct osd_zap_it {
- zap_cursor_t *ozi_zc;
- struct osd_object *ozi_obj;
- unsigned ozi_reset:1; /* 1 -- no need to advance */
- /* ozi_pos - position of the cursor:
- * 0 - before any record
- * 1 - "."
- * 2 - ".."
- * 3 - real records */
- unsigned ozi_pos:3;
- union {
- char ozi_name[MAXNAMELEN]; /* file name for dir */
- __u64 ozi_key; /* binary key for index files */
- };
+enum osd_zap_pos {
+ OZI_POS_INIT = 0,
+ OZI_POS_DOT = 1, /* cursor at . */
+ OZI_POS_DOTDOT = 2, /* cursor at .. */
+ OZI_POS_REAL = 3, /* cursor at real entries */
};
-#define DT_IT2DT(it) (&((struct osd_zap_it *)it)->ozi_obj->oo_dt)
/*
* regular ZFS direntry
struct lu_fid lzd_fid;
} __attribute__((packed));
+/**
+ * Iterator's in-memory data structure for ZAPs
+ *
+ * ZFS does not store . and .. on a disk, instead they are
+ * generated up on request
+ * to follow this format we do the same
+ */
+struct osd_zap_it {
+ zap_cursor_t *ozi_zc;
+ struct osd_object *ozi_obj;
+ unsigned ozi_reset:1; /* 1 -- no need to advance */
+ /* ozi_pos - position of the cursor */
+ enum osd_zap_pos ozi_pos;
+ struct luz_direntry ozi_zde;
+ zap_attribute_t ozi_za;
+ union {
+ char ozi_name[MAXNAMELEN]; /* file name for dir */
+ __u64 ozi_key; /* binary key for index files */
+ };
+};
+#define DT_IT2DT(it) (&((struct osd_zap_it *)it)->ozi_obj->oo_dt)
/* cached SA attributes */
struct osa_attr {
uint64_t atime[2];
uint64_t mtime[2];
uint64_t ctime[2];
+ uint64_t btime[2];
};
const struct lu_env *oti_env;
struct lu_fid oti_fid;
- /*
- * XXX temporary: for ->i_op calls.
- */
- struct timespec oti_time;
struct ost_id oti_ostid;
struct lu_buf oti_xattr_lbuf;
zap_cursor_t oti_zc;
zap_cursor_t oti_zc2;
+
+ char *oti_seq_name;
+ char *oti_dir_name;
};
extern struct lu_context_key osd_key;
od_xattr_in_sa:1,
od_is_ost:1,
od_in_init:1,
- od_posix_acl:1;
+ od_posix_acl:1,
+ od_nonrotational:1;
unsigned int od_dnsize;
int od_index_backup_stop;
enum lustre_index_backup_policy od_index_backup_policy;
char od_mntdev[128];
char od_svname[128];
- char od_uuid[16];
+ uuid_t od_uuid;
int od_connects;
int od_index;
dnode_t *od_projectused_dn;
#endif
- /* quota slave instance */
- struct qsd_instance *od_quota_slave;
+ /* quota slave instance for inode */
+ struct qsd_instance *od_quota_slave_md;
+
+ /* quota slave instance for block */
+ struct qsd_instance *od_quota_slave_dt;
struct brw_stats od_brw_stats;
atomic_t od_r_in_flight;
unsigned long long od_readcache_max_filesize;
};
+static inline struct qsd_instance *osd_def_qsd(struct osd_device *osd)
+{
+ if (osd->od_is_ost)
+ return osd->od_quota_slave_dt;
+ else
+ return osd->od_quota_slave_md;
+}
+
enum osd_destroy_type {
OSD_DESTROY_NONE = 0,
OSD_DESTROY_SYNC = 1,
struct lu_object_header *oo_header;
};
-int osd_statfs(const struct lu_env *, struct dt_device *, struct obd_statfs *);
+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,
#endif
#ifndef HAVE_DSL_POOL_CONFIG
-static inline void dsl_pool_config_enter(dsl_pool_t *dp, char *name)
+static inline void dsl_pool_config_enter(dsl_pool_t *dp, void *name)
{
}
-static inline void dsl_pool_config_exit(dsl_pool_t *dp, char *name)
+static inline void dsl_pool_config_exit(dsl_pool_t *dp, void *name)
{
}
#endif
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,
LASSERT(dn->dn_bonus);
db = dn->dn_bonus;
- DB_DNODE_EXIT(db);
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 */