Whamcloud - gitweb
LU-5855 lfsck: misc fixes for zfs-based backend
[fs/lustre-release.git] / lustre / osd-zfs / osd_internal.h
index a621c32..9bb7f98 100644 (file)
 #endif
 
 #include <sys/arc.h>
-
 #include <sys/nvpair.h>
-
 #include <sys/zfs_znode.h>
-#include "udmu.h"
+#include <sys/zap.h>
 
 #define LUSTRE_ROOT_FID_SEQ    0
 #define DMU_OSD_SVNAME         "svname"
 
 #define OSD_GFP_IO             (GFP_NOFS | __GFP_HIGHMEM)
 
+/* Statfs space reservation for grant, fragmentation, and unlink space. */
+#define OSD_STATFS_RESERVED_BLKS  (1ULL << (22 - SPA_MAXBLOCKSHIFT)) /* 4MB */
+#define OSD_STATFS_RESERVED_SHIFT (7)         /* reserve 0.78% of all space */
+
+/* Statfs {minimum, safe estimate, and maximum} dnodes per block */
+#define OSD_DNODE_MIN_BLKSHIFT (SPA_MAXBLOCKSHIFT - DNODE_SHIFT) /* 17-9 =8 */
+#define OSD_DNODE_EST_BLKSHIFT (SPA_MAXBLOCKSHIFT - 12)          /* 17-12=5 */
+#define OSD_DNODE_EST_COUNT    1024
+
+#define OSD_GRANT_FOR_LOCAL_OIDS (2ULL << 20) /* 2MB for last_rcvd, ... */
+
 /**
  * Iterator's in-memory data structure for quota file.
  */
@@ -82,8 +91,6 @@ struct osd_it_quota {
        zap_cursor_t            *oiq_zc;
        /** identifier for current quota record */
        __u64                    oiq_id;
-       /* the hash where object accounting is cached */
-       cfs_hash_t              *oiq_hash;
        unsigned                 oiq_reset:1; /* 1 -- no need to advance */
 };
 
@@ -183,6 +190,7 @@ struct osd_thread_info {
 
        struct lquota_id_info    oti_qi;
        struct lu_seq_range      oti_seq_range;
+       unsigned int             oti_it_inline:1;
 };
 
 extern struct lu_context_key osd_key;
@@ -194,8 +202,8 @@ static inline struct osd_thread_info *osd_oti_get(const struct lu_env *env)
 
 struct osd_thandle {
        struct thandle           ot_super;
-       cfs_list_t               ot_dcb_list;
-       cfs_list_t               ot_sa_list;
+       struct list_head         ot_dcb_list;
+       struct list_head         ot_sa_list;
        struct semaphore         ot_sa_lock;
        dmu_tx_t                *ot_tx;
        struct lquota_trans      ot_quota_trans;
@@ -217,35 +225,29 @@ struct osd_seq {
        uint64_t         *os_compat_dirs;
        int              os_subdir_count; /* subdir count for each seq */
        obd_seq          os_seq;          /* seq number */
-       cfs_list_t       os_seq_list;     /* list to seq_list */
+       struct list_head os_seq_list;     /* list to seq_list */
 };
 
 struct osd_seq_list {
-       rwlock_t         osl_seq_list_lock;     /* lock for seq_list */
-       cfs_list_t       osl_seq_list;      /* list head for seq */
+       rwlock_t         osl_seq_list_lock;     /* lock for seq_list */
+       struct list_head osl_seq_list;          /* list head for seq */
        struct semaphore osl_seq_init_sem;
 };
 
 #define OSD_OST_MAP_SIZE       32
 
 /*
- * this structure tracks changes made to the accounting within specific TXG
- */
-struct osd_zfs_acct_txg {
-       uint64_t                 zat_txg;
-       cfs_hash_t              *zat_usr;
-       cfs_hash_t              *zat_grp;
-       struct osd_device       *zat_osd;
-};
-
-/*
  * osd device.
  */
 struct osd_device {
        /* super-class */
        struct dt_device         od_dt_dev;
        /* information about underlying file system */
-       udmu_objset_t            od_objset;
+       struct objset           *od_os;
+       uint64_t                 od_rootid;  /* id of root znode */
+       /* SA attr mapping->id,
+        * name is the same as in ZFS to use defines SA_ZPL_...*/
+       sa_attr_type_t           *z_attr_table;
 
        /*
         * Fid Capability
@@ -254,9 +256,9 @@ struct osd_device {
        unsigned long            od_capa_timeout;
        __u32                    od_capa_alg;
        struct lustre_capa_key  *od_capa_keys;
-       cfs_hlist_head_t        *od_capa_hash;
+       struct hlist_head       *od_capa_hash;
 
-       cfs_proc_dir_entry_t    *od_proc_entry;
+       struct proc_dir_entry   *od_proc_entry;
        struct lprocfs_stats    *od_stats;
 
        uint64_t                 od_root;
@@ -268,7 +270,8 @@ struct osd_device {
        unsigned int             od_rdonly:1,
                                 od_xattr_in_sa:1,
                                 od_quota_iused_est:1,
-                                od_is_ost:1;
+                                od_is_ost:1,
+                                od_posix_acl:1;
 
        char                     od_mntdev[128];
        char                     od_svname[128];
@@ -292,13 +295,6 @@ struct osd_device {
 
        arc_prune_t             *arc_prune_cb;
 
-       /* quota: object accounting */
-       spinlock_t               od_known_txg_lock;
-       uint64_t                 od_known_txg;
-       struct osd_zfs_acct_txg *od_acct_delta;
-       cfs_hash_t              *od_acct_usr;
-       cfs_hash_t              *od_acct_grp;
-
        /* osd seq instance */
        struct lu_client_seq    *od_cl_seq;
 };
@@ -315,7 +311,7 @@ struct osd_object {
        dmu_buf_t               *oo_db;
        sa_handle_t             *oo_sa_hdl;
        nvlist_t                *oo_sa_xattr;
-       cfs_list_t               oo_sa_linkage;
+       struct list_head         oo_sa_linkage;
 
        struct rw_semaphore      oo_sem;
 
@@ -335,11 +331,15 @@ struct osd_object {
 
 int osd_statfs(const struct lu_env *, struct dt_device *, struct obd_statfs *);
 extern const struct dt_index_operations osd_acct_index_ops;
+uint64_t osd_quota_fid2dmu(const struct lu_fid *fid);
 extern struct lu_device_operations  osd_lu_ops;
+extern 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, long long space,
                      struct osd_thandle *oh, bool is_blk, int *flags,
                      bool force);
+uint64_t osd_objs_count_estimate(uint64_t refdbytes, uint64_t usedobjs,
+                                uint64_t nrblocks);
 
 /*
  * Helpers.
@@ -384,7 +384,7 @@ static inline struct lu_device *osd2lu_dev(struct osd_device *osd)
 
 static inline struct objset * osd_dtobj2objset(struct dt_object *o)
 {
-       return osd_dev(o->do_lu.lo_dev)->od_objset.os;
+       return osd_dev(o->do_lu.lo_dev)->od_os;
 }
 
 static inline int osd_invariant(const struct osd_object *obj)
@@ -423,34 +423,27 @@ enum {
 };
 
 /* osd_lproc.c */
-extern struct lprocfs_vars lprocfs_osd_obd_vars[];
-extern struct lprocfs_vars lprocfs_osd_module_vars[];
+extern struct lprocfs_seq_vars lprocfs_osd_obd_vars[];
 
 int osd_procfs_init(struct osd_device *osd, const char *name);
 int osd_procfs_fini(struct osd_device *osd);
 
-int udmu_zap_cursor_retrieve_key(const struct lu_env *env,
-                                zap_cursor_t *zc, char *key, int max);
-int udmu_zap_cursor_retrieve_value(const struct lu_env *env,
-                                  zap_cursor_t *zc,  char *buf,
-                                  int buf_size, int *bytes_read);
-
 /* osd_object.c */
+extern char *osd_obj_tag;
 void osd_object_sa_dirty_rele(struct osd_thandle *oh);
 int __osd_obj2dbuf(const struct lu_env *env, objset_t *os,
-                  uint64_t oid, dmu_buf_t **dbp, void *tag);
+                  uint64_t oid, dmu_buf_t **dbp);
 struct lu_object *osd_object_alloc(const struct lu_env *env,
                                   const struct lu_object_header *hdr,
                                   struct lu_device *d);
 int osd_object_sa_update(struct osd_object *obj, sa_attr_type_t type,
                         void *buf, uint32_t buflen, struct osd_thandle *oh);
-int __osd_zap_create(const struct lu_env *env, udmu_objset_t *uos,
+int __osd_zap_create(const struct lu_env *env, struct osd_device *osd,
                     dmu_buf_t **zap_dbp, dmu_tx_t *tx, struct lu_attr *la,
-                    uint64_t parent, void *tag, zap_flags_t flags);
-int __osd_object_create(const struct lu_env *env, udmu_objset_t *uos,
+                    uint64_t parent, zap_flags_t flags);
+int __osd_object_create(const struct lu_env *env, struct osd_device *osd,
                        dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la,
-                       uint64_t parent, void *tag);
-int __osd_object_free(udmu_objset_t *uos, uint64_t oid, dmu_tx_t *tx);
+                       uint64_t parent);
 
 /* osd_oi.c */
 int osd_oi_init(const struct lu_env *env, struct osd_device *o);
@@ -469,10 +462,17 @@ 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,
                   obd_seq seq, struct lu_seq_range *range);
+void osd_zap_cursor_init_serialized(zap_cursor_t *zc, struct objset *os,
+                                   uint64_t id, uint64_t dirhash);
+int osd_zap_cursor_init(zap_cursor_t **zc, struct objset *os,
+                       uint64_t id, uint64_t dirhash);
+void osd_zap_cursor_fini(zap_cursor_t *zc);
+uint64_t osd_zap_cursor_serialize(zap_cursor_t *zc);
 
 /* osd_xattr.c */
-int __osd_xattr_load(udmu_objset_t *uos, uint64_t dnode, nvlist_t **sa_xattr);
-int __osd_xattr_get_large(const struct lu_env *env, udmu_objset_t *uos,
+int __osd_xattr_load(struct osd_device *osd, uint64_t dnode,
+                    nvlist_t **sa_xattr);
+int __osd_xattr_get_large(const struct lu_env *env, struct osd_device *osd,
                          uint64_t xattr, struct lu_buf *buf,
                          const char *name, int *sizep);
 int osd_xattr_get(const struct lu_env *env, struct dt_object *dt,
@@ -517,13 +517,6 @@ osd_xattr_set_internal(const struct lu_env *env, struct osd_object *obj,
        return rc;
 }
 
-void osd_zfs_acct_uid(const struct lu_env *env, struct osd_device *osd,
-                    __u64 uid, int delta, struct osd_thandle *oh);
-void osd_zfs_acct_gid(const struct lu_env *env, struct osd_device *osd,
-                    __u64 gid, int delta, struct osd_thandle *oh);
-int osd_zfs_acct_init(const struct lu_env *env, struct osd_device *osd);
-void osd_zfs_acct_fini(const struct lu_env *env, struct osd_device *osd);
-
 static inline uint64_t attrs_fs2zfs(const uint32_t flags)
 {
        return (((flags & FS_APPEND_FL)         ? ZFS_APPENDONLY        : 0) |