Whamcloud - gitweb
LU-7991 quota: project quota against ZFS backend
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_internal.h
index dba78c1..c0bf3e8 100644 (file)
@@ -90,6 +90,13 @@ extern struct kmem_cache *dynlock_cachep;
 #define OSD_STATFS_RESERVED            (1ULL << 23) /* 8MB */
 #define OSD_STATFS_RESERVED_SHIFT      (7) /* reserve 0.78% of all space */
 
+/* check if ldiskfs support project quota */
+#ifndef LDISKFS_IOC_FSSETXATTR
+#undef HAVE_PROJECT_QUOTA
+#endif
+
+#define OBD_BRW_MAPPED OBD_BRW_LOCAL1
+
 struct osd_directory {
         struct iam_container od_container;
         struct iam_descr     od_descr;
@@ -109,19 +116,19 @@ struct osd_oi {
 extern const int osd_dto_credits_noquota[];
 
 struct osd_object {
-        struct dt_object        oo_dt;
-        /**
-         * Inode for file system object represented by this osd_object. This
-         * inode is pinned for the whole duration of lu_object life.
-         *
-         * Not modified concurrently (either setup early during object
-         * creation, or assigned by osd_object_create() under write lock).
-         */
-        struct inode           *oo_inode;
-        /**
-         * to protect index ops.
-         */
-        struct htree_lock_head *oo_hl_head;
+       struct dt_object        oo_dt;
+       /**
+        * Inode for file system object represented by this osd_object. This
+        * inode is pinned for the whole duration of lu_object life.
+        *
+        * Not modified concurrently (either setup early during object
+        * creation, or assigned by osd_create() under write lock).
+        */
+       struct inode           *oo_inode;
+       /**
+        * to protect index ops.
+        */
+       struct htree_lock_head *oo_hl_head;
        struct rw_semaphore     oo_ext_idx_sem;
        struct rw_semaphore     oo_sem;
        struct osd_directory    *oo_dir;
@@ -211,6 +218,7 @@ struct osd_otable_cache {
 struct osd_otable_it {
        struct osd_device       *ooi_dev;
        struct osd_otable_cache  ooi_cache;
+       struct osd_iit_param     ooi_iit_param;
 
        /* The following bits can be updated/checked w/o lock protection.
         * If more bits will be introduced in the future and need lock to
@@ -316,16 +324,17 @@ enum osd_full_scrub_ratio {
 
 #define FULL_SCRUB_THRESHOLD_RATE_DEFAULT      60
 
-/* There are at most 10 uid/gids are affected in a transaction, and
+/* There are at most 15 uid/gid/projids are affected in a transaction, and
  * that's rename case:
- * - 2 for source parent uid & gid;
- * - 2 for source child uid & gid ('..' entry update when child is directory);
- * - 2 for target parent uid & gid;
- * - 2 for target child uid & gid (if the target child exists);
- * - 2 for root uid & gid (last_rcvd, llog, etc);
+ * - 3 for source parent uid & gid & projid;
+ * - 3 for source child uid & gid & projid ('..' entry update when
+ * child is directory);
+ * - 3 for target parent uid & gid & projid;
+ * - 3 for target child uid & gid & projid(if the target child exists);
+ * - 3 for root uid & gid(last_rcvd, llog, etc);
  *
  */
-#define OSD_MAX_UGID_CNT        10
+#define OSD_MAX_UGID_CNT        15
 
 enum osd_op_type {
        OSD_OT_ATTR_SET         = 0,
@@ -737,14 +746,13 @@ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh,
                    struct lquota_id_info *qi, struct osd_object *obj,
                    bool enforce, int *flags);
 int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid,
-                         long long space, struct osd_thandle *oh,
-                         struct osd_object *obj, bool is_blk, int *flags,
-                         bool force);
+                         __u32 projid, long long space, struct osd_thandle *oh,
+                         struct osd_object *obj, int *flags,
+                         enum osd_qid_declare_flags);
 const struct dt_rec *osd_quota_pack(struct osd_object *obj,
                                    const struct dt_rec *rec,
                                    union lquota_rec *quota_rec);
 void osd_quota_unpack(struct osd_object *obj, const struct dt_rec *rec);
-int osd_quota_migration(const struct lu_env *env, struct dt_object *dt);
 
 #ifndef HAVE_I_UID_READ
 static inline uid_t i_uid_read(const struct inode *inode)
@@ -768,6 +776,29 @@ static inline void i_gid_write(struct inode *inode, gid_t gid)
 }
 #endif
 
+#ifdef HAVE_PROJECT_QUOTA
+static inline __u32 i_projid_read(struct inode *inode)
+{
+       return (__u32)from_kprojid(&init_user_ns, LDISKFS_I(inode)->i_projid);
+}
+
+static inline void i_projid_write(struct inode *inode, __u32 projid)
+{
+       kprojid_t kprojid;
+       kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
+       LDISKFS_I(inode)->i_projid = kprojid;
+}
+#else
+static inline uid_t i_projid_read(struct inode *inode)
+{
+       return 0;
+}
+static inline void i_projid_write(struct inode *inode, __u32 projid)
+{
+       return;
+}
+#endif
+
 #ifdef HAVE_LDISKFS_INFO_JINODE
 # define osd_attach_jinode(inode) ldiskfs_inode_attach_jinode(inode)
 #else  /* HAVE_LDISKFS_INFO_JINODE */
@@ -900,6 +931,16 @@ static inline struct super_block *osd_sb(const struct osd_device *dev)
        return dev->od_mnt->mnt_sb;
 }
 
+static inline const char *osd_dev2name(const struct osd_device *dev)
+{
+       return osd_sb(dev)->s_id;
+}
+
+static inline const char *osd_ino2name(const struct inode *inode)
+{
+       return inode->i_sb->s_id;
+}
+
 /**
  * Put the osd object once done with it.
  *