#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 */
+#define OSD_STATFS_RESERVED_SIZE (16ULL << 20) /* reserve 16MB minimum */
+#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_DNODE_MIN_BLKSHIFT (DNODES_PER_BLOCK_SHIFT)
+#define OSD_DNODE_EST_BLKSHIFT (DNODES_PER_BLOCK_SHIFT >> 1)
+#define OSD_DNODE_EST_COUNT 1024
#define OSD_GRANT_FOR_LOCAL_OIDS (2ULL << 20) /* 2MB for last_rcvd, ... */
struct osd_zap_it {
zap_cursor_t *ozi_zc;
struct osd_object *ozi_obj;
- struct lustre_capa *ozi_capa;
unsigned ozi_reset:1; /* 1 -- no need to advance */
/* ozi_pos - position of the cursor:
* 0 - before any record
* XXX temporary: for ->i_op calls.
*/
struct timespec oti_time;
- /*
- * XXX temporary: for capa operations.
- */
- struct lustre_capa_key oti_capa_key;
- struct lustre_capa oti_capa;
struct ost_id oti_ostid;
struct osd_thandle {
struct thandle ot_super;
struct list_head ot_dcb_list;
+ struct list_head ot_stop_dcb_list;
+ struct list_head ot_unlinked_list;
struct list_head ot_sa_list;
struct semaphore ot_sa_lock;
dmu_tx_t *ot_tx;
/* information about underlying file system */
struct objset *od_os;
uint64_t od_rootid; /* id of root znode */
+ uint64_t od_unlinkedid; /* id of unlinked zapobj */
/* 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
- */
- unsigned int od_fl_capa:1;
- unsigned long od_capa_timeout;
- __u32 od_capa_alg;
- struct lustre_capa_key *od_capa_keys;
- struct hlist_head *od_capa_hash;
-
struct proc_dir_entry *od_proc_entry;
struct lprocfs_stats *od_stats;
+ uint64_t od_max_blksz;
uint64_t od_root;
uint64_t od_O_id;
struct osd_oi **od_oi_table;
struct lu_client_seq *od_cl_seq;
};
+enum osd_destroy_type {
+ OSD_DESTROY_NONE = 0,
+ OSD_DESTROY_SYNC = 1,
+ OSD_DESTROY_ASYNC = 2,
+};
+
struct osd_object {
struct dt_object oo_dt;
/*
sa_handle_t *oo_sa_hdl;
nvlist_t *oo_sa_xattr;
struct list_head oo_sa_linkage;
+ struct list_head oo_unlinked_linkage;
struct rw_semaphore oo_sem;
rwlock_t oo_attr_lock;
struct lu_attr oo_attr;
- /* protects extended attributes */
+ /* protects extended attributes and oo_unlinked_linkage */
struct semaphore oo_guard;
uint64_t oo_xattr;
+ enum osd_destroy_type oo_destroy;
/* record size for index file */
unsigned char oo_keysize;
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);
+ uint64_t nrblocks, uint64_t est_maxblockshift);
/*
* Helpers.
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, zap_flags_t flags);
-int __osd_object_create(const struct lu_env *env, struct osd_device *osd,
+int __osd_object_create(const struct lu_env *env, struct osd_object *obj,
dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la,
uint64_t parent);
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,
- struct lu_buf *buf, const char *name,
- struct lustre_capa *capa);
+ struct lu_buf *buf, const char *name);
int osd_declare_xattr_set(const struct lu_env *env, struct dt_object *dt,
const struct lu_buf *buf, const char *name,
int fl, struct thandle *handle);
int osd_xattr_set(const struct lu_env *env, struct dt_object *dt,
const struct lu_buf *buf, const char *name, int fl,
- struct thandle *handle, struct lustre_capa *capa);
+ struct thandle *handle);
int osd_declare_xattr_del(const struct lu_env *env, struct dt_object *dt,
const char *name, struct thandle *handle);
int osd_xattr_del(const struct lu_env *env, struct dt_object *dt,
- const char *name, struct thandle *handle,
- struct lustre_capa *capa);
+ const char *name, struct thandle *handle);
+void osd_declare_xattrs_destroy(const struct lu_env *env,
+ struct osd_object *obj,
+ struct osd_thandle *oh);
+int osd_xattrs_destroy(const struct lu_env *env,
+ struct osd_object *obj, struct osd_thandle *oh);
int osd_xattr_list(const struct lu_env *env, struct dt_object *dt,
- const struct lu_buf *lb, struct lustre_capa *capa);
+ const struct lu_buf *lb);
void __osd_xattr_declare_set(const struct lu_env *env, struct osd_object *obj,
int vallen, const char *name, struct osd_thandle *oh);
int __osd_sa_xattr_set(const struct lu_env *env, struct osd_object *obj,
static inline int
osd_xattr_set_internal(const struct lu_env *env, struct osd_object *obj,
const struct lu_buf *buf, const char *name, int fl,
- struct osd_thandle *oh, struct lustre_capa *capa)
+ struct osd_thandle *oh)
{
int rc;
static inline void dsl_pool_config_exit(dsl_pool_t *dp, char *name)
{
}
+#endif
+#ifdef HAVE_SPA_MAXBLOCKSIZE
+#define osd_spa_maxblocksize(spa) spa_maxblocksize(spa)
+#define osd_spa_maxblockshift(spa) fls64(spa_maxblocksize(spa) - 1)
+#else
+#define osd_spa_maxblocksize(spa) SPA_MAXBLOCKSIZE
+#define osd_spa_maxblockshift(spa) SPA_MAXBLOCKSHIFT
+#define SPA_OLD_MAXBLOCKSIZE SPA_MAXBLOCKSIZE
+#endif
+
+#ifdef HAVE_SA_SPILL_ALLOC
+static inline void *
+osd_zio_buf_alloc(size_t size)
+{
+ return sa_spill_alloc(KM_SLEEP);
+}
+
+static inline void
+osd_zio_buf_free(void *buf, size_t size)
+{
+ sa_spill_free(buf);
+}
+#else
+#define osd_zio_buf_alloc(size) zio_buf_alloc(size)
+#define osd_zio_buf_free(buf, size) zio_buf_free(buf, size)
#endif
#endif /* _OSD_INTERNAL_H */