#include <sys/zap.h>
#include <sys/dbuf.h>
#include <sys/dmu_objset.h>
+#include <lustre_scrub.h>
/**
* By design including kmem.h overrides the Linux slab interfaces to provide
#define OSD_GRANT_FOR_LOCAL_OIDS (2ULL << 20) /* 2MB for last_rcvd, ... */
+#define OSD_MAX_CACHE_SIZE OBD_OBJECT_EOF
+
+#ifndef HAVE_ZFS_REFCOUNT_ADD
+#define zfs_refcount_add refcount_add
+#endif
+
+extern struct dt_body_operations osd_body_scrub_ops;
+
/**
* Iterator's in-memory data structure for quota file.
*/
unsigned oiq_reset:1; /* 1 -- no need to advance */
};
+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 */
+};
+
/**
* Iterator's in-memory data structure for ZAPs
*
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;
+ /* ozi_pos - position of the cursor */
+ enum osd_zap_pos ozi_pos;
union {
char ozi_name[MAXNAMELEN]; /* file name for dir */
__u64 ozi_key; /* binary key for index files */
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_attr oti_la;
struct osa_attr oti_osa;
zap_attribute_t oti_za;
+ zap_attribute_t oti_za2;
dmu_object_info_t oti_doi;
struct luz_direntry oti_zde;
struct osd_idmap_cache *oti_ins_cache;
int oti_ins_cache_size;
int oti_ins_cache_used;
+ /* inc by osd_trans_create and dec by osd_trans_stop */
+ int oti_ins_cache_depth;
struct lu_buf oti_xattr_lbuf;
zap_cursor_t oti_zc;
+ zap_cursor_t oti_zc2;
};
extern struct lu_context_key osd_key;
struct list_head ot_sa_list;
dmu_tx_t *ot_tx;
struct lquota_trans ot_quota_trans;
- __u32 ot_write_commit:1,
- ot_assigned:1;
+ __u32 ot_assigned:1;
};
#define OSD_OI_NAME_SIZE 24
struct lprocfs_stats *od_stats;
uint64_t od_remote_parent_dir;
+ uint64_t od_index_backup_id;
uint64_t od_max_blksz;
uint64_t od_root;
uint64_t od_O_id;
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;
struct osd_otable_it *od_otable_it;
struct lustre_scrub od_scrub;
struct list_head od_ios_list;
+ struct list_head od_index_backup_list;
+ struct list_head od_index_restore_list;
+ spinlock_t od_lock;
+ 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;
struct lu_attr *la, uint64_t parent, nvlist_t *);
int osd_find_new_dnode(const struct lu_env *env, dmu_tx_t *tx,
uint64_t oid, dnode_t **dnp);
-int osd_object_init0(const struct lu_env *env, struct osd_object *obj);
/* osd_oi.c */
int osd_oi_init(const struct lu_env *env, struct osd_device *o);
extern unsigned int osd_oi_count;
/* osd_index.c */
+int osd_get_fid_by_oid(const struct lu_env *env, struct osd_device *osd,
+ uint64_t oid, struct lu_fid *fid);
int osd_index_try(const struct lu_env *env, struct dt_object *dt,
const struct dt_index_features *feat);
int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd,
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);
+void osd_scrub_stop(struct osd_device *dev);
int osd_oii_insert(const struct lu_env *env, struct osd_device *dev,
const struct lu_fid *fid, uint64_t oid, bool insert);
int osd_oii_lookup(struct osd_device *dev, const struct lu_fid *fid,
}
#endif
+static inline int osd_object_is_zap(dnode_t *dn)
+{
+ return (dn->dn_type == DMU_OT_DIRECTORY_CONTENTS ||
+ dn->dn_type == DMU_OT_USERGROUP_USED);
+}
+
/* XXX: f_ver is not counted, but may differ too */
static inline void osd_fid2str(char *buf, const struct lu_fid *fid, int len)
{
#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
SA_HDL_PRIVATE, &obj->oo_sa_hdl);
if (rc)
return rc;
- refcount_add(&dn->dn_bonus->db_holds, osd_obj_tag);
+ zfs_refcount_add(&dn->dn_bonus->db_holds, osd_obj_tag);
return 0;
}
LASSERT(dn->dn_bonus);
db = dn->dn_bonus;
- DB_DNODE_EXIT(db);
dmu_buf_rele(&db->db, osd_obj_tag);
}
dmu_objset_disown((os), (tag))
#endif
+static inline int
+osd_index_register(struct osd_device *osd, const struct lu_fid *fid,
+ __u32 keysize, __u32 recsize)
+{
+ return lustre_index_register(&osd->od_dt_dev, osd_name(osd),
+ &osd->od_index_backup_list, &osd->od_lock,
+ &osd->od_index_backup_stop,
+ fid, keysize, recsize);
+}
+
+static inline void
+osd_index_backup(const struct lu_env *env, struct osd_device *osd, bool backup)
+{
+ struct lu_fid *fid = &osd_oti_get(env)->oti_fid;
+ int rc;
+
+ lu_local_obj_fid(fid, INDEX_BACKUP_OID);
+ rc = osd_idc_find_and_init_with_oid(env, osd, fid,
+ osd->od_index_backup_id);
+ if (rc)
+ backup = false;
+
+ lustre_index_backup(env, &osd->od_dt_dev, osd_name(osd),
+ &osd->od_index_backup_list, &osd->od_lock,
+ &osd->od_index_backup_stop, backup);
+}
+
+#ifndef HAVE_DMU_TX_MARK_NETFREE
+#define dmu_tx_mark_netfree(tx)
+#endif
+
+#ifndef HAVE_ZFS_INODE_TIMESPEC
+#define inode_timespec_t timestruc_t
+#endif
+
#endif /* _OSD_INTERNAL_H */