* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2016, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <dt_object.h>
#include <md_object.h>
#include <lustre_quota.h>
+#include <lustre_scrub.h>
+#include <obd.h>
#ifdef SHRINK_STOP
#undef SHRINK_STOP
#endif
#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, ... */
+extern struct dt_body_operations osd_body_scrub_ops;
+
/**
* Iterator's in-memory data structure for quota file.
*/
oic_remote:1; /* FID isn't local */
};
+struct osd_inconsistent_item {
+ /* link into lustre_scrub::os_inconsistent_items,
+ * protected by lustr_scrub::os_lock. */
+ struct list_head oii_list;
+
+ /* The right FID <=> oid mapping. */
+ struct osd_idmap_cache oii_cache;
+
+ unsigned int oii_insert:1; /* insert or update mapping. */
+};
+
+struct osd_otable_it {
+ struct osd_device *ooi_dev;
+ struct lu_fid ooi_fid;
+ __u64 ooi_pos;
+ __u64 ooi_prefetched_dnode;
+ int ooi_prefetched;
+
+ /* The following bits can be updated/checked w/o lock protection.
+ * If more bits will be introduced in the future and need lock to
+ * protect, please add comment. */
+ unsigned int ooi_used_outside:1, /* Some user out of OSD
+ * uses the iteration. */
+ ooi_all_cached:1, /* No more entries can be
+ * filled into cache. */
+ ooi_user_ready:1, /* The user out of OSD is
+ * ready to iterate. */
+ ooi_waiting:1; /* it::next is waiting. */
+};
+
+extern const struct dt_index_operations osd_otable_ops;
+
/* max.number of regular attributes the callers may ask for */
# define OSD_MAX_IN_BULK (sizeof(struct osa_attr)/sizeof(uint64_t))
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 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_prop_rdonly:1, /**< ZFS property readonly */
od_xattr_in_sa:1,
od_is_ost:1,
+ od_in_init:1,
od_posix_acl: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];
int od_connects;
+ int od_index;
+ __s64 od_auto_scrub_interval;
struct lu_site od_site;
dnode_t *od_groupused_dn;
/* osd seq instance */
struct lu_client_seq *od_cl_seq;
+
+ struct semaphore od_otable_sem;
+ 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;
};
enum osd_destroy_type {
};
uint64_t oo_parent; /* used only at object creation */
};
+ struct lu_object_header *oo_header;
};
int osd_statfs(const struct lu_env *, struct dt_device *, struct obd_statfs *);
static inline char *osd_name(struct osd_device *osd)
{
- return osd->od_dt_dev.dd_lu_dev.ld_obd->obd_name;
+ return osd->od_svname;
+}
+
+static inline void zfs_set_bit(int nr, __u8 *addr)
+{
+ set_bit(nr, (unsigned long *)addr);
+}
+
+static inline int zfs_test_bit(int nr, __u8 *addr)
+{
+ return test_bit(nr, (const unsigned long *)addr);
+}
+
+static inline int osd_oi_fid2idx(struct osd_device *dev,
+ const struct lu_fid *fid)
+{
+ return fid->f_seq & (dev->od_oi_count - 1);
+}
+
+static inline struct osd_oi *osd_fid2oi(struct osd_device *osd,
+ const struct lu_fid *fid)
+{
+ LASSERTF(osd->od_oi_table && osd->od_oi_count >= 1,
+ "%s: "DFID", oi_count %d\n",
+ osd_name(osd), PFID(fid), osd->od_oi_count);
+
+ return osd->od_oi_table[osd_oi_fid2idx(osd, fid)];
}
#ifdef CONFIG_PROC_FS
int __osd_attr_init(const struct lu_env *env, struct osd_device *osd,
struct osd_object *obj, sa_handle_t *sa_hdl, dmu_tx_t *tx,
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);
/* osd_oi.c */
int osd_oi_init(const struct lu_env *env, struct osd_device *o);
struct osd_idmap_cache *osd_idc_find(const struct lu_env *env,
struct osd_device *osd,
const struct lu_fid *fid);
+int osd_idc_find_and_init_with_oid(const struct lu_env *env,
+ struct osd_device *osd,
+ const struct lu_fid *fid,
+ uint64_t oid);
+int fid_is_on_ost(const struct lu_env *env, struct osd_device *osd,
+ const struct lu_fid *fid);
+int osd_obj_find_or_create(const struct lu_env *env, struct osd_device *o,
+ uint64_t parent, const char *name, uint64_t *child,
+ const struct lu_fid *fid, bool isdir);
+
+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,
struct osd_device *osd,
struct osd_object *obj,
struct osd_thandle *oh, bool destroy);
+int __osd_xattr_load_by_oid(struct osd_device *osd, uint64_t oid,
+ nvlist_t **sa);
+
+/* osd_scrub.c */
+int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev);
+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,
+ uint64_t *oid);
/* osd_xattr.c */
int __osd_sa_xattr_schedule_update(const struct lu_env *env,
}
#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)
{
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);
+}
+
#endif /* _OSD_INTERNAL_H */