#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;
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;
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
#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,
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)
}
#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 */
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.
*