#include <sys/nvpair.h>
#include <sys/zfs_znode.h>
#include <sys/zap.h>
+#include <sys/dbuf.h>
/**
* By design including kmem.h overrides the Linux slab interfaces to provide
uint64_t ctime[2];
};
+/* max.number of regular attrubites the callers may ask for */
+#define OSD_MAX_IN_BULK 13
+
struct osd_thread_info {
const struct lu_env *oti_env;
union {
char oti_key[MAXNAMELEN + 1];
__u64 oti_key64[(MAXNAMELEN + 1)/sizeof(__u64)];
+ sa_bulk_attr_t oti_attr_bulk[OSD_MAX_IN_BULK];
};
struct lustre_mdt_attrs oti_mdt_attrs;
struct osd_oi {
char oi_name[OSD_OI_NAME_SIZE]; /* unused */
uint64_t oi_zapid;
+ dmu_buf_t *oi_db;
};
struct osd_seq {
sa_handle_t *oo_sa_hdl;
nvlist_t *oo_sa_xattr;
struct list_head oo_sa_linkage;
- struct list_head oo_unlinked_linkage;
+ /* used to implement osd_object_*_{lock|unlock} */
struct rw_semaphore oo_sem;
+ /* to serialize some updates: destroy vs. others,
+ * xattr_set, object block size change etc */
+ struct rw_semaphore oo_guard;
+
+ /* protected by oo_guard */
+ struct list_head oo_unlinked_linkage;
+
/* cached attributes */
rwlock_t oo_attr_lock;
struct lu_attr oo_attr;
- /* protects extended attributes and oo_unlinked_linkage */
- struct semaphore oo_guard;
+ /* external dnode holding large EAs, protected by oo_guard */
uint64_t oo_xattr;
enum osd_destroy_type oo_destroy;
/* the i_flags in LMA */
__u32 oo_lma_flags;
- /* record size for index file */
- unsigned char oo_keysize;
- unsigned char oo_recsize;
- unsigned char oo_recusize; /* unit size */
+ union {
+ int oo_ea_in_bonus; /* EA bytes we expect */
+ struct {
+ /* record size for index file */
+ unsigned char oo_keysize;
+ unsigned char oo_recsize;
+ unsigned char oo_recusize; /* unit size */
+ };
+ };
+
+
};
int osd_statfs(const struct lu_env *, struct dt_device *, struct obd_statfs *);
void *buf, uint32_t buflen, struct osd_thandle *oh);
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);
+ zap_flags_t flags);
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);
+ dmu_buf_t **dbp, dmu_tx_t *tx, struct lu_attr *la);
+int __osd_attr_init(const struct lu_env *env, struct osd_device *osd,
+ sa_handle_t *sa_hdl, dmu_tx_t *tx,
+ struct lu_attr *la, uint64_t parent);
/* osd_oi.c */
int osd_oi_init(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 *);
uint64_t osd_get_name_n_idx(const struct lu_env *env, struct osd_device *osd,
- const struct lu_fid *fid, char *buf);
+ const struct lu_fid *fid, char *buf, int bufsize);
int osd_options_init(void);
int osd_ost_seq_exists(const struct lu_env *env, struct osd_device *osd,
__u64 seq);
int __osd_xattr_set(const struct lu_env *env, struct osd_object *obj,
const struct lu_buf *buf, const char *name, int fl,
struct osd_thandle *oh);
+int __osd_sa_xattr_update(const struct lu_env *env, struct osd_object *obj,
+ struct osd_thandle *oh);
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,
{
int rc;
+ if (unlikely(!dt_object_exists(&obj->oo_dt) || obj->oo_destroyed))
+ return -ENOENT;
+
+ LASSERT(obj->oo_db);
if (osd_obj2dev(obj)->od_xattr_in_sa) {
rc = __osd_sa_xattr_set(env, obj, buf, name, fl, oh);
if (rc == -EFBIG)
#define osd_zio_buf_free(buf, size) zio_buf_free(buf, size)
#endif
+#ifdef HAVE_DMU_OBJECT_ALLOC_DNSIZE
+static inline uint64_t
+osd_dmu_object_alloc(objset_t *os, dmu_object_type_t objtype, int blocksize,
+ int dnodesize, dmu_tx_t *tx)
+{
+ if (dnodesize == 0)
+ dnodesize = MAX(dmu_objset_dnodesize(os), DNODE_MIN_SIZE);
+
+ return dmu_object_alloc_dnsize(os, objtype, blocksize, DMU_OT_SA,
+ DN_BONUS_SIZE(dnodesize), dnodesize, tx);
+}
+
+static inline uint64_t
+osd_zap_create_flags(objset_t *os, int normflags, zap_flags_t flags,
+ dmu_object_type_t ot, int leaf_blockshift,
+ int indirect_blockshift, int dnodesize, dmu_tx_t *tx)
+{
+ if (dnodesize == 0)
+ dnodesize = MAX(dmu_objset_dnodesize(os), DNODE_MIN_SIZE);
+
+ return zap_create_flags_dnsize(os, normflags, flags, ot,
+ leaf_blockshift, indirect_blockshift,
+ DMU_OT_SA, DN_BONUS_SIZE(dnodesize),
+ dnodesize, tx);
+}
+#else
+static inline uint64_t
+osd_dmu_object_alloc(objset_t *os, dmu_object_type_t objtype, int blocksize,
+ int dnodesize, dmu_tx_t *tx)
+{
+ return dmu_object_alloc(os, objtype, blocksize, DMU_OT_SA,
+ DN_MAX_BONUSLEN, tx);
+}
+
+static inline uint64_t
+osd_zap_create_flags(objset_t *os, int normflags, zap_flags_t flags,
+ dmu_object_type_t ot, int leaf_blockshift,
+ int indirect_blockshift, int dnodesize, dmu_tx_t *tx)
+{
+ return zap_create_flags(os, normflags, flags, ot, leaf_blockshift,
+ indirect_blockshift, DMU_OT_SA,
+ DN_MAX_BONUSLEN, tx);
+}
+#endif /* HAVE_DMU_OBJECT_ALLOC_DNSIZE */
+
+#ifdef HAVE_DMU_PREFETCH_6ARG
+#define osd_dmu_prefetch(os, obj, lvl, off, len, pri) \
+ dmu_prefetch((os), (obj), (lvl), (off), (len), (pri))
+#else
+#define osd_dmu_prefetch(os, obj, lvl, off, len, pri) \
+ dmu_prefetch((os), (obj), (lvl), (off))
+#endif
+
+#ifndef DN_MAX_BONUSLEN
+#define DN_MAX_BONUSLEN DN_OLD_MAX_BONUSLEN
+#endif
+
#endif /* _OSD_INTERNAL_H */