Whamcloud - gitweb
LU-8619 osd: define DN_MAX_BONUSLEN
[fs/lustre-release.git] / lustre / osd-zfs / osd_internal.h
index 850290f..ea15344 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -54,6 +54,7 @@
 #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
@@ -163,6 +164,9 @@ struct osa_attr {
        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;
 
@@ -180,6 +184,7 @@ struct osd_thread_info {
        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;
 
@@ -221,6 +226,7 @@ struct osd_thandle {
 struct osd_oi {
        char                    oi_name[OSD_OI_NAME_SIZE]; /* unused */
        uint64_t                oi_zapid;
+       dmu_buf_t              *oi_db;
 };
 
 struct osd_seq {
@@ -262,7 +268,8 @@ struct osd_device {
        unsigned int             od_oi_count;
        struct osd_seq_list     od_seq_list;
 
-       unsigned int             od_rdonly:1,
+       unsigned int             od_dev_set_rdonly:1, /**< osd_ro() called */
+                                od_prop_rdonly:1,  /**< ZFS property readonly */
                                 od_xattr_in_sa:1,
                                 od_quota_iused_est:1,
                                 od_is_ost:1,
@@ -317,23 +324,40 @@ struct osd_object {
        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;
 
-       /* record size for index file */
-       unsigned char            oo_keysize;
-       unsigned char            oo_recsize;
-       unsigned char            oo_recusize;   /* unit size */
+       __u32                    oo_destroyed:1;
+
+       /* the i_flags in LMA */
+       __u32                    oo_lma_flags;
+       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 *);
@@ -448,10 +472,12 @@ 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, 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);
@@ -459,10 +485,8 @@ void osd_oi_fini(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_convert_root_to_new_seq(const struct lu_env *env,
-                               struct osd_device *o);
 int osd_ost_seq_exists(const struct lu_env *env, struct osd_device *osd,
                       __u64 seq);
 /* osd_index.c */
@@ -510,6 +534,8 @@ int __osd_sa_xattr_set(const struct lu_env *env, struct osd_object *obj,
 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,
@@ -517,6 +543,10 @@ osd_xattr_set_internal(const struct lu_env *env, struct osd_object *obj,
 {
        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)
@@ -530,16 +560,16 @@ osd_xattr_set_internal(const struct lu_env *env, struct osd_object *obj,
 
 static inline uint64_t attrs_fs2zfs(const uint32_t flags)
 {
-       return (((flags & FS_APPEND_FL)         ? ZFS_APPENDONLY        : 0) |
-               ((flags & FS_NODUMP_FL)         ? ZFS_NODUMP            : 0) |
-               ((flags & FS_IMMUTABLE_FL)      ? ZFS_IMMUTABLE         : 0));
+       return (flags & LUSTRE_APPEND_FL        ? ZFS_APPENDONLY        : 0) |
+               (flags & LUSTRE_NODUMP_FL       ? ZFS_NODUMP            : 0) |
+               (flags & LUSTRE_IMMUTABLE_FL    ? ZFS_IMMUTABLE         : 0);
 }
 
 static inline uint32_t attrs_zfs2fs(const uint64_t flags)
 {
-       return (((flags & ZFS_APPENDONLY)       ? FS_APPEND_FL          : 0) |
-               ((flags & ZFS_NODUMP)           ? FS_NODUMP_FL          : 0) |
-               ((flags & ZFS_IMMUTABLE)        ? FS_IMMUTABLE_FL       : 0));
+       return (flags & ZFS_APPENDONLY  ? LUSTRE_APPEND_FL      : 0) |
+               (flags & ZFS_NODUMP     ? LUSTRE_NODUMP_FL      : 0) |
+               (flags & ZFS_IMMUTABLE  ? LUSTRE_IMMUTABLE_FL   : 0);
 }
 
 #endif
@@ -580,4 +610,61 @@ osd_zio_buf_free(void *buf, size_t size)
 #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 */