#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);
*
- * The 0 to (OSD_MAX_UGID_CNT - 1) bits of ot_id_type is for indicating
- * the id type of each id in the ot_id_array.
*/
-#define OSD_MAX_UGID_CNT 10
+#define OSD_MAX_UGID_CNT 15
enum osd_op_type {
OSD_OT_ATTR_SET = 0,
struct lu_ref_link ot_dev_link;
unsigned int ot_credits;
unsigned short ot_id_cnt;
- unsigned short ot_id_type;
+ __u8 ot_id_types[OSD_MAX_UGID_CNT];
unsigned int ot_remove_agents:1;
uid_t ot_id_array[OSD_MAX_UGID_CNT];
struct lquota_trans *ot_quota_trans;
#if OSD_THANDLE_STATS
/** time when this handle was allocated */
- cfs_time_t oth_alloced;
+ ktime_t oth_alloced;
/** time when this thanle was started */
- cfs_time_t oth_started;
+ ktime_t oth_started;
#endif
};
struct lu_buf oti_big_buf;
/** used in osd_ea_fid_set() to set fid into common ea */
union {
- struct lustre_mdt_attrs oti_mdt_attrs;
- /* old LMA for compatibility */
- char oti_mdt_attrs_old[LMA_OLD_SIZE];
+ struct lustre_ost_attrs oti_ost_attrs;
struct filter_fid_old oti_ff;
struct filter_fid oti_ff_new;
};
int osd_ea_fid_set(struct osd_thread_info *info, struct inode *inode,
const struct lu_fid *fid, __u32 compat, __u32 incompat);
int osd_get_lma(struct osd_thread_info *info, struct inode *inode,
- struct dentry *dentry, struct lustre_mdt_attrs *lma);
+ struct dentry *dentry, struct lustre_ost_attrs *loa);
void osd_add_oi_cache(struct osd_thread_info *info, struct osd_device *osd,
struct osd_inode_id *id, const struct lu_fid *fid);
int osd_get_idif(struct osd_thread_info *info, struct inode *inode,
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 */
+# define osd_attach_jinode(inode) 0
+#endif /* HAVE_LDISKFS_INFO_JINODE */
+
#ifdef LDISKFS_HT_MISC
# define osd_journal_start_sb(sb, type, nblock) \
ldiskfs_journal_start_sb(sb, type, nblock)
-# define osd_ldiskfs_append(handle, inode, nblock) \
- ldiskfs_append(handle, inode, nblock)
+static inline struct buffer_head *osd_ldiskfs_append(handle_t *handle,
+ struct inode *inode,
+ ldiskfs_lblk_t *nblock)
+{
+ int rc;
+
+ rc = osd_attach_jinode(inode);
+ if (rc)
+ return ERR_PTR(rc);
+ return ldiskfs_append(handle, inode, nblock);
+}
# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \
(__ldiskfs_find_entry(dir, name, de, inlined, lock) ?: \
ERR_PTR(-ENOENT))
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.
+ *
+ * \param obj osd object that needs to be put
+ */
+static inline void osd_object_put(const struct lu_env *env,
+ struct osd_object *obj)
+{
+ dt_object_put(env, &obj->oo_dt);
+}
+
static inline int osd_object_is_root(const struct osd_object *obj)
{
return osd_sb(osd_obj2dev(obj))->s_root->d_inode == obj->oo_inode;
ldiskfs_lblk_t block,
int create)
{
-#ifdef HAVE_EXT4_BREAD_4ARGS
- return ldiskfs_bread(handle, inode, block, create);
-#else
+ int rc = 0;
struct buffer_head *bh;
- int error = 0;
- bh = ldiskfs_bread(handle, inode, block, create, &error);
- if (bh == NULL && error != 0)
- bh = ERR_PTR(error);
+ if (create) {
+ rc = osd_attach_jinode(inode);
+ if (rc)
+ return ERR_PTR(rc);
+ }
+#ifdef HAVE_EXT4_BREAD_4ARGS
+ bh = ldiskfs_bread(handle, inode, block, create);
+#else
- return bh;
+ bh = ldiskfs_bread(handle, inode, block, create, &rc);
+ if (bh == NULL && rc != 0)
+ bh = ERR_PTR(rc);
#endif
+ return bh;
}
void ldiskfs_inc_count(handle_t *handle, struct inode *inode);
void osd_fini_iobuf(struct osd_device *d, struct osd_iobuf *iobuf);
+
#endif /* _OSD_INTERNAL_H */