X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_internal.h;h=705d8b0bfbab484d20b477ce1ca86125531b5549;hp=9afd83b075e26d1f87c841041f6df2bc6aa06cea;hb=e6c7fcdaf40b130c39af2e3ee8b108c6e31a8ca8;hpb=d30f9e6b6c5df9dcf1510b5c2414600165d904a8 diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 9afd83b..705d8b0 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -27,7 +27,6 @@ */ /* * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. * * lustre/osd/osd_internal.h * @@ -55,7 +54,7 @@ /* LUSTRE_OSD_NAME */ #include -/* class_register_type(), class_unregister_type(), class_get_type() */ +/* class_register_type(), class_unregister_type() */ #include #include #include @@ -91,6 +90,9 @@ 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 */ +/* Default extent bytes when declaring write commit */ +#define OSD_DEFAULT_EXTENT_BYTES (1U << 20) + /* check if ldiskfs support project quota */ #ifndef LDISKFS_IOC_FSSETXATTR #undef HAVE_PROJECT_QUOTA @@ -153,6 +155,7 @@ struct osd_object { struct list_head oo_xattr_list; struct lu_object_header *oo_header; + __u64 oo_dirent_count; }; struct osd_obj_seq { @@ -239,11 +242,14 @@ struct osd_obj_orphan { }; enum osd_t10_type { - OSD_T10_TYPE_UNKNOWN = 0, - OSD_T10_TYPE1_CRC, - OSD_T10_TYPE3_CRC, - OSD_T10_TYPE1_IP, - OSD_T10_TYPE3_IP + OSD_T10_TYPE_UNKNOWN = 0, + OSD_T10_TYPE1 = 0x1, + OSD_T10_TYPE3 = 0x2, + OSD_T10_TYPE_CRC = 0x4, + OSD_T10_TYPE1_CRC = OSD_T10_TYPE1 | OSD_T10_TYPE_CRC, + OSD_T10_TYPE3_CRC = OSD_T10_TYPE3 | OSD_T10_TYPE_CRC, + OSD_T10_TYPE1_IP = OSD_T10_TYPE1, + OSD_T10_TYPE3_IP = OSD_T10_TYPE3, }; /* @@ -267,9 +273,13 @@ struct osd_device { od_check_ff:1, od_is_ost:1, od_in_init:1, - od_index_in_idif:1; + od_index_in_idif:1, + /* Other flags */ + od_read_cache:1, + od_writethrough_cache:1, + od_nonrotational:1; + - __s64 od_auto_scrub_interval; __u32 od_dirent_journal; int od_index; struct proc_dir_entry *od_proc_entry; @@ -277,15 +287,24 @@ struct osd_device { spinlock_t od_osfs_lock; + int od_fallocate_zero_blocks; int od_connects; struct lu_site od_site; struct osd_obj_map *od_ost_map; struct osd_mdobj_map *od_mdt_map; + /* objects with size > od_readcache_max_filesize will be + * served bypassing pagecache unless already cached */ unsigned long long od_readcache_max_filesize; - int od_read_cache; - int od_writethrough_cache; + + /* reads > od_readcache_max_iosize will be + * served bypassing pagecache unless already cached */ + unsigned long od_readcache_max_iosize; + + /* writes > od_writethough_max_iosize will be + * served bypassing pagecache unless already cached */ + unsigned long od_writethrough_max_iosize; struct brw_stats od_brw_stats; atomic_t od_r_in_flight; @@ -299,6 +318,7 @@ struct osd_device { /* service name associated with the osd device */ char od_svname[MAX_OBD_NAME]; char od_mntdev[MAX_OBD_NAME]; + uuid_t od_uuid; /* quota slave instance for inode */ struct qsd_instance *od_quota_slave_md; @@ -328,6 +348,9 @@ struct osd_device { int od_index_backup_stop; /* T10PI type, zero if not supported */ enum osd_t10_type od_t10_type; + atomic_t od_commit_cb_in_flight; + wait_queue_head_t od_commit_cb_done; + unsigned int __percpu *od_extent_bytes_percpu; }; static inline struct qsd_instance *osd_def_qsd(struct osd_device *osd) @@ -366,24 +389,29 @@ enum osd_full_scrub_ratio { enum osd_op_type { OSD_OT_ATTR_SET = 0, - OSD_OT_PUNCH = 1, - OSD_OT_XATTR_SET = 2, - OSD_OT_CREATE = 3, - OSD_OT_DESTROY = 4, - OSD_OT_REF_ADD = 5, - OSD_OT_REF_DEL = 6, - OSD_OT_WRITE = 7, - OSD_OT_INSERT = 8, - OSD_OT_DELETE = 9, - OSD_OT_QUOTA = 10, - OSD_OT_MAX = 11 + OSD_OT_PUNCH, + OSD_OT_XATTR_SET, + OSD_OT_CREATE, + OSD_OT_DESTROY, + OSD_OT_REF_ADD, + OSD_OT_REF_DEL, + OSD_OT_WRITE, + OSD_OT_INSERT, + OSD_OT_DELETE, + OSD_OT_QUOTA, + OSD_OT_PREALLOC, + OSD_OT_MAX }; struct osd_access_lock { struct list_head tl_list; struct osd_object *tl_obj; + loff_t tl_start; + loff_t tl_end; + int tl_mode; bool tl_shared; bool tl_truncate; + bool tl_punch; }; struct osd_thandle { @@ -395,6 +423,7 @@ struct osd_thandle { /* Link to the device, for debugging. */ struct lu_ref_link ot_dev_link; unsigned int ot_credits; + unsigned int oh_declared_ext; /* quota IDs related to the transaction */ unsigned short ot_id_cnt; @@ -556,6 +585,24 @@ struct osd_iobuf { unsigned int dr_init_at; /* the line iobuf was initialized */ }; +int osd_security_file_alloc(struct file *file); + +#define osd_dirty_inode(inode, flag) (inode)->i_sb->s_op->dirty_inode((inode), flag) + +#ifdef HAVE_INODE_TIMESPEC64 +# define osd_timespec timespec64 +#else +# define osd_timespec timespec +#endif + +static inline struct osd_timespec osd_inode_time(struct inode *inode, + s64 seconds) +{ + struct osd_timespec ts = { .tv_sec = seconds }; + + return ts; +} + #define OSD_INS_CACHE_SIZE 8 struct osd_thread_info { @@ -586,11 +633,6 @@ struct osd_thread_info { struct osd_inode_id oti_id3; struct ost_id oti_ostid; - /* - * XXX temporary: for ->i_op calls. - */ - struct timespec oti_time; - /** * following ipd and it structures are used for osd_index_iam_lookup() * these are defined separately as we might do index operation @@ -619,40 +661,38 @@ struct osd_thread_info { struct osd_idmap_cache oti_cache; /* dedicated OI cache for insert (which needs inum) */ - struct osd_idmap_cache *oti_ins_cache; - int oti_ins_cache_size; - int oti_ins_cache_used; + struct osd_idmap_cache *oti_ins_cache; + int oti_ins_cache_size; + int oti_ins_cache_used; /* inc by osd_trans_create and dec by osd_trans_stop */ - int oti_ins_cache_depth; - - int oti_r_locks; - int oti_w_locks; - int oti_txns; - /** used in osd_fid_set() to put xattr */ - struct lu_buf oti_buf; - struct lu_buf oti_big_buf; - /** used in osd_ea_fid_set() to set fid into common ea */ + int oti_ins_cache_depth; + + int oti_r_locks; + int oti_w_locks; + int oti_txns; + /** used in osd_fid_set() to put xattr */ + struct lu_buf oti_buf; + struct lu_buf oti_big_buf; + /** used in osd_ea_fid_set() to set fid into common ea */ union { struct lustre_ost_attrs oti_ost_attrs; - struct filter_fid_old oti_ff; - struct filter_fid oti_ff_new; + struct filter_fid_18_23 oti_ff_old; + struct filter_fid oti_ff; }; /** 0-copy IO */ - struct osd_iobuf oti_iobuf; + struct osd_iobuf oti_iobuf; /* used to access objects in /O */ - struct inode *oti_inode; + struct inode *oti_inode; #define OSD_FID_REC_SZ 32 - char oti_ldp[OSD_FID_REC_SZ]; - char oti_ldp2[OSD_FID_REC_SZ]; + char oti_ldp[OSD_FID_REC_SZ]; + char oti_ldp2[OSD_FID_REC_SZ]; /* used by quota code */ union { #if defined(HAVE_DQUOT_QC_DQBLK) struct qc_dqblk oti_qdq; -#elif defined(HAVE_DQUOT_FS_DISK_QUOTA) - struct fs_disk_quota oti_fdq; #else - struct if_dqblk oti_dqblk; + struct fs_disk_quota oti_fdq; #endif struct if_dqinfo oti_dqinfo; }; @@ -673,25 +713,19 @@ struct osd_thread_info { struct page **oti_dio_pages; int oti_dio_pages_used; + + struct osd_it_ea_dirent *oti_seq_dirent; + struct osd_it_ea_dirent *oti_dir_dirent; }; extern int ldiskfs_pdo; -#ifndef HAVE_VFS_SETXATTR -#define osd_setxattr(dentry, inode, name, buf, len, flag) \ - ((inode)->i_op->setxattr(dentry, name, buf, len, flag)) -#define osd_getxattr(dentry, inode, name, buf, len) \ - ((inode)->i_op->getxattr(dentry, name, buf, len)) -#define osd_removexattr(dentry, inode, name) \ - ((inode)->i_op->removexattr(dentry, name)) -#else /* HAVE_VFS_SETXATTR */ -#define osd_setxattr(dentry, inode, name, buf, len, flag) \ - __vfs_setxattr(dentry, inode, name, buf, len, flag) -#define osd_getxattr(dentry, inode, name, buf, len) \ - __vfs_getxattr(dentry, inode, name, buf, len) -#define osd_removexattr(dentry, inode, name) \ - __vfs_removexattr(dentry, name) -#endif /* !HAVE_VFS_SETXATTR */ +/* autoconf test is in lustre-build-ldiskfs.m4 */ +#ifdef HAVE_BVEC_ITER_ALL +#define DECLARE_BVEC_ITER_ALL(iter) struct bvec_iter_all iter +#else +#define DECLARE_BVEC_ITER_ALL(iter) int iter +#endif static inline int __osd_xattr_get(struct inode *inode, struct dentry *dentry, const char *name, void *buf, int len) @@ -701,7 +735,7 @@ static inline int __osd_xattr_get(struct inode *inode, struct dentry *dentry, dentry->d_inode = inode; dentry->d_sb = inode->i_sb; - return osd_getxattr(dentry, inode, name, buf, len); + return ll_vfs_getxattr(dentry, inode, name, buf, len); } static inline int __osd_xattr_set(struct osd_thread_info *info, @@ -710,16 +744,26 @@ static inline int __osd_xattr_set(struct osd_thread_info *info, { struct dentry *dentry = &info->oti_child_dentry; - ll_vfs_dq_init(inode); + dquot_initialize(inode); dentry->d_inode = inode; dentry->d_sb = inode->i_sb; - return osd_setxattr(dentry, inode, name, buf, buflen, fl); + return ll_vfs_setxattr(dentry, inode, name, buf, buflen, fl); +} + +static inline char *osd_oid_name(char *name, size_t name_size, + const struct lu_fid *fid, u64 id) +{ + snprintf(name, name_size, + (fid_seq_is_rsvd(fid_seq(fid)) || + fid_seq_is_mdt0(fid_seq(fid)) || + fid_seq_is_idif(fid_seq(fid))) ? "%llu" : "%llx", id); + + return name; } #ifdef CONFIG_PROC_FS /* osd_lproc.c */ extern struct lprocfs_vars lprocfs_osd_obd_vars[]; -extern struct lprocfs_vars lprocfs_osd_module_vars[]; int osd_procfs_init(struct osd_device *osd, const char *name); int osd_procfs_fini(struct osd_device *osd); void osd_brw_stats_update(struct osd_device *osd, struct osd_iobuf *iobuf); @@ -729,7 +773,7 @@ int osd_register_proc_index_in_idif(struct osd_device *osd); #endif int osd_statfs(const struct lu_env *env, struct dt_device *dev, - struct obd_statfs *sfs); + struct obd_statfs *sfs, struct obd_statfs_info *info); struct inode *osd_iget(struct osd_thread_info *info, struct osd_device *dev, struct osd_inode_id *id); struct inode * @@ -737,12 +781,19 @@ osd_iget_fid(struct osd_thread_info *info, struct osd_device *dev, struct osd_inode_id *id, struct lu_fid *fid); int osd_ea_fid_set(struct osd_thread_info *info, struct inode *inode, const struct lu_fid *fid, __u32 compat, __u32 incompat); +struct osd_obj_seq *osd_seq_load(struct osd_thread_info *info, + struct osd_device *osd, u64 seq); int osd_get_lma(struct osd_thread_info *info, struct inode *inode, 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 dentry *dentry, struct lu_fid *fid); +struct osd_it_ea *osd_it_dir_init(const struct lu_env *env, struct inode *inode, + __u32 attr); +void osd_it_dir_fini(const struct lu_env *env, struct osd_it_ea *oie, + struct inode *inode); +int osd_ldiskfs_it_fill(const struct lu_env *env, const struct dt_it *di); int osd_obj_map_init(const struct lu_env *env, struct osd_device *osd); void osd_obj_map_fini(struct osd_device *dev); @@ -760,26 +811,37 @@ int osd_obj_map_recover(struct osd_thread_info *info, struct osd_device *osd, struct inode *src_parent, struct dentry *src_child, const struct lu_fid *fid); int osd_obj_spec_lookup(struct osd_thread_info *info, struct osd_device *osd, - const struct lu_fid *fid, struct osd_inode_id *id); + const struct lu_fid *fid, struct osd_inode_id *id, + enum oi_check_flags flags); int osd_obj_spec_insert(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, const struct osd_inode_id *id, handle_t *th); int osd_obj_spec_update(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, const struct osd_inode_id *id, handle_t *th); +int osd_obj_del_entry(struct osd_thread_info *info, struct osd_device *osd, + struct dentry *dird, char *name, int namelen, + handle_t *th); char *osd_lf_fid2name(const struct lu_fid *fid); int osd_scrub_start(const struct lu_env *env, struct osd_device *dev, __u32 flags); void osd_scrub_stop(struct osd_device *dev); -int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev); +int osd_scrub_setup(const struct lu_env *env, struct osd_device *dev, + bool restored); void osd_scrub_cleanup(const struct lu_env *env, struct osd_device *dev); -int osd_oii_insert(struct osd_device *dev, struct osd_idmap_cache *oic, - int insert); +int osd_oii_insert(struct osd_device *dev, const struct lu_fid *fid, + struct osd_inode_id *id, int insert); int osd_oii_lookup(struct osd_device *dev, const struct lu_fid *fid, struct osd_inode_id *id); void osd_scrub_dump(struct seq_file *m, struct osd_device *dev); +struct dentry *osd_lookup_one_len_unlocked(struct osd_device *dev, + const char *name, + struct dentry *base, int len); +struct dentry *osd_lookup_one_len(struct osd_device *dev, const char *name, + struct dentry *base, int len); + int osd_fld_lookup(const struct lu_env *env, struct osd_device *osd, u64 seq, struct lu_seq_range *range); @@ -796,6 +858,13 @@ int osd_lookup_in_remote_parent(struct osd_thread_info *oti, int osd_ost_seq_exists(struct osd_thread_info *info, struct osd_device *osd, __u64 seq); +int osd_scrub_refresh_mapping(struct osd_thread_info *info, + struct osd_device *dev, + const struct lu_fid *fid, + const struct osd_inode_id *id, + int ops, bool force, + enum oi_check_flags flags, bool *exist); + /* osd_quota_fmt.c */ int walk_tree_dqentry(const struct lu_env *env, struct osd_object *obj, int type, uint blk, int depth, uint index, @@ -810,38 +879,17 @@ loff_t find_tree_dqentry(const struct lu_env *env, /* osd_quota.c */ 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); + bool enforce, enum osd_quota_local_flags *local_flags); int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid, __u32 projid, long long space, struct osd_thandle *oh, - struct osd_object *obj, int *flags, + struct osd_object *obj, + enum osd_quota_local_flags *local_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); -#ifndef HAVE_I_UID_READ -static inline uid_t i_uid_read(const struct inode *inode) -{ - return inode->i_uid; -} - -static inline gid_t i_gid_read(const struct inode *inode) -{ - return inode->i_gid; -} - -static inline void i_uid_write(struct inode *inode, uid_t uid) -{ - inode->i_uid = uid; -} - -static inline void i_gid_write(struct inode *inode, gid_t gid) -{ - inode->i_gid = gid; -} -#endif - #ifdef HAVE_PROJECT_QUOTA static inline __u32 i_projid_read(struct inode *inode) { @@ -865,6 +913,14 @@ static inline void i_projid_write(struct inode *inode, __u32 projid) } #endif +#ifdef HAVE_LDISKFS_IGET_WITH_FLAGS +# define osd_ldiskfs_iget(sb, ino) \ + ldiskfs_iget((sb), (ino), \ + LDISKFS_IGET_HANDLE | LDISKFS_IGET_SPECIAL) +#else +# define osd_ldiskfs_iget(sb, ino) ldiskfs_iget((sb), (ino)) +#endif + #ifdef HAVE_LDISKFS_INFO_JINODE # define osd_attach_jinode(inode) ldiskfs_inode_attach_jinode(inode) #else /* HAVE_LDISKFS_INFO_JINODE */ @@ -885,14 +941,22 @@ static inline struct buffer_head *osd_ldiskfs_append(handle_t *handle, return ERR_PTR(rc); return ldiskfs_append(handle, inode, nblock); } -# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ + +# ifdef HAVE___LDISKFS_FIND_ENTRY +# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ (__ldiskfs_find_entry(dir, name, de, inlined, lock) ?: \ ERR_PTR(-ENOENT)) +# else +# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ + (ldiskfs_find_entry_locked(dir, name, de, inlined, lock) ?: \ + ERR_PTR(-ENOENT)) +# endif + # define osd_journal_start(inode, type, nblocks) \ ldiskfs_journal_start(inode, type, nblocks) # define osd_transaction_size(dev) \ (osd_journal(dev)->j_max_transaction_buffers / 2) -#else +#else /* ! defined LDISKFS_HT_MISC */ # define LDISKFS_HT_MISC 0 # define osd_journal_start_sb(sb, type, nblock) \ ldiskfs_journal_start_sb(sb, nblock) @@ -911,13 +975,24 @@ static inline struct buffer_head *osd_ldiskfs_append(handle_t *handle, return bh; } -# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ +# ifdef HAVE___LDISKFS_FIND_ENTRY +# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ (__ldiskfs_find_entry(dir, name, de, lock) ?: \ ERR_PTR(-ENOENT)) +# else +# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ + (ldiskfs_find_entry_locked(dir, name, de, lock) ?: \ + ERR_PTR(-ENOENT)) +# endif # define osd_journal_start(inode, type, nblocks) \ ldiskfs_journal_start(inode, nblocks) # define osd_transaction_size(dev) \ (osd_journal(dev)->j_max_transaction_buffers) +#endif /* LDISKFS_HT_MISC */ + +#ifndef HAVE___LDISKFS_FIND_ENTRY +# define __ldiskfs_add_entry(handle, child, inode, hlock) \ + ldiskfs_add_entry_locked(handle, child, inode, hlock) #endif /* @@ -947,6 +1022,8 @@ static inline int osd_invariant(const struct osd_object *obj) #endif #define OSD_MAX_CACHE_SIZE OBD_OBJECT_EOF +#define OSD_READCACHE_MAX_IO_MB 8 +#define OSD_WRITECACHE_MAX_IO_MB 8 extern const struct dt_index_operations osd_otable_ops; @@ -977,14 +1054,14 @@ static inline int lu_device_is_osd(const struct lu_device *d) static inline struct osd_device *osd_dt_dev(const struct dt_device *d) { - LASSERT(lu_device_is_osd(&d->dd_lu_dev)); - return container_of0(d, struct osd_device, od_dt_dev); + LASSERT(lu_device_is_osd(&d->dd_lu_dev)); + return container_of(d, struct osd_device, od_dt_dev); } static inline struct osd_device *osd_dev(const struct lu_device *d) { - LASSERT(lu_device_is_osd(d)); - return osd_dt_dev(container_of0(d, struct dt_device, dd_lu_dev)); + LASSERT(lu_device_is_osd(d)); + return osd_dt_dev(container_of(d, struct dt_device, dd_lu_dev)); } static inline struct osd_device *osd_obj2dev(const struct osd_object *o) @@ -997,14 +1074,22 @@ static inline struct super_block *osd_sb(const struct osd_device *dev) return dev->od_mnt->mnt_sb; } +static inline const char *osd_sb2name(const struct super_block *sb) +{ + /* this is LDISKFS_SB(sb), but preserves "const" */ + const struct ldiskfs_sb_info *sbi = sb->s_fs_info; + + return sbi->s_es->s_volume_name; +} + static inline const char *osd_dev2name(const struct osd_device *dev) { - return osd_sb(dev)->s_id; + return osd_sb2name(osd_sb(dev)); } static inline const char *osd_ino2name(const struct inode *inode) { - return inode->i_sb->s_id; + return osd_sb2name(inode->i_sb); } /** @@ -1020,13 +1105,13 @@ static inline void osd_object_put(const struct lu_env *env, 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; + return obj->oo_inode && is_root_inode(obj->oo_inode); } static inline struct osd_object *osd_obj(const struct lu_object *o) { - LASSERT(lu_device_is_osd(o->lo_dev)); - return container_of0(o, struct osd_object, oo_dt.do_lu); + LASSERT(lu_device_is_osd(o->lo_dev)); + return container_of(o, struct osd_object, oo_dt.do_lu); } static inline struct osd_object *osd_dt_obj(const struct dt_object *d) @@ -1100,8 +1185,6 @@ int osd_calc_bkmap_credits(struct super_block *sb, struct inode *inode, const int blocks); int osd_ldiskfs_read(struct inode *inode, void *buf, int size, loff_t *offs); -int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, - int write_NUL, loff_t *offs, handle_t *handle); static inline struct dentry *osd_child_dentry_by_inode(const struct lu_env *env, @@ -1123,6 +1206,43 @@ struct dentry *osd_child_dentry_by_inode(const struct lu_env *env, return child_dentry; } +/* build quasi file structure when it is needed to call an inode i_fop */ +static inline struct file *osd_quasi_file_init(const struct lu_env *env, + struct dentry *dentry, + struct inode *inode) +{ + struct osd_thread_info *info = osd_oti_get(env); + + info->oti_file.f_path.dentry = dentry; + info->oti_file.f_mapping = inode->i_mapping; + info->oti_file.f_op = inode->i_fop; + info->oti_file.f_inode = inode; + info->oti_file.f_pos = 0; + info->oti_file.private_data = NULL; + info->oti_file.f_cred = current_cred(); + info->oti_file.f_flags = O_NOATIME; + info->oti_file.f_mode = FMODE_64BITHASH | FMODE_NONOTIFY; + + return &info->oti_file; +} + +static inline struct file *osd_quasi_file(const struct lu_env *env, + struct inode *inode) +{ + struct osd_thread_info *info = osd_oti_get(env); + + info->oti_obj_dentry.d_inode = inode; + info->oti_obj_dentry.d_sb = inode->i_sb; + + return osd_quasi_file_init(env, &info->oti_obj_dentry, inode); +} + +static inline struct file *osd_quasi_file_by_dentry(const struct lu_env *env, + struct dentry *dentry) +{ + return osd_quasi_file_init(env, dentry, dentry->d_inode); +} + extern int osd_trans_declare_op2rb[]; extern int ldiskfs_track_declares_assert; void osd_trans_dump_creds(const struct lu_env *env, struct thandle *th); @@ -1149,6 +1269,11 @@ static inline void osd_trans_declare_op(const struct lu_env *env, oh->ot_credits += credits; } +/* linux: v5.4-rc3-21-g933f1c1e0b75 renamed h_buffer_credits */ +#ifdef HAVE_JOURNAL_TOTAL_CREDITS +#define h_buffer_credits h_total_credits +#endif + static inline void osd_trans_exec_op(const struct lu_env *env, struct thandle *th, enum osd_op_type op) @@ -1371,10 +1496,13 @@ bool bio_integrity_enabled(struct bio *bio); #endif #ifdef HAVE_BI_BDEV -# define bio_set_dev(bio, bdev) ((bio)->bi_bdev = bdev) -# define bio_get_queue(bio) bdev_get_queue((bio)->bi_bdev) +# define bio_get_dev(bio) ((bio)->bi_bdev) +# define bio_get_disk(bio) (bio_get_dev(bio)->bd_disk) +# define bio_get_queue(bio) bdev_get_queue(bio_get_dev(bio)) +# define bio_set_dev(bio, bdev) (bio_get_dev(bio) = (bdev)) #else -# define bio_get_queue(bio) ((bio)->bi_disk->queue) +# define bio_get_disk(bio) ((bio)->bi_disk) +# define bio_get_queue(bio) (bio_get_disk(bio)->queue) #endif void ldiskfs_inc_count(handle_t *handle, struct inode *inode); @@ -1423,6 +1551,12 @@ osd_index_backup(const struct lu_env *env, struct osd_device *osd, bool backup) # define ldiskfs_has_feature_dirdata(sb) \ LDISKFS_HAS_INCOMPAT_FEATURE(sb, LDISKFS_FEATURE_INCOMPAT_DIRDATA) # endif +# ifdef LDISKFS_FEATURE_INCOMPAT_LARGEDIR +# define ldiskfs_has_feature_largedir(sb) \ + LDISKFS_HAS_INCOMPAT_FEATURE(sb, LDISKFS_FEATURE_INCOMPAT_LARGEDIR) +# define ldiskfs_set_feature_largedir(sb) \ + LDISKFS_SET_INCOMPAT_FEATURE(sb, LDISKFS_FEATURE_INCOMPAT_LARGEDIR) +# endif # ifdef LDISKFS_FEATURE_COMPAT_HAS_JOURNAL # define ldiskfs_has_feature_journal(sb) \ LDISKFS_HAS_COMPAT_FEATURE(sb, LDISKFS_FEATURE_COMPAT_HAS_JOURNAL) @@ -1440,10 +1574,33 @@ osd_index_backup(const struct lu_env *env, struct osd_device *osd, bool backup) int osd_trunc_lock(struct osd_object *obj, struct osd_thandle *oh, bool shared); -void osd_trunc_unlock_all(struct list_head *list); -void osd_process_truncates(struct list_head *list); +void osd_trunc_unlock_all(const struct lu_env *env, struct list_head *list); +void osd_process_truncates(const struct lu_env *env, struct list_head *list); void osd_execute_truncate(struct osd_object *obj); +#ifdef HAVE_BIO_ENDIO_USES_ONE_ARG +#define osd_dio_complete_routine(bio, error) dio_complete_routine(bio) +#else +#define osd_dio_complete_routine(bio, error) dio_complete_routine(bio, error) +#endif + +#ifndef HAVE___BI_CNT +#define __bi_cnt bi_cnt +#endif + +#ifndef HAVE_BI_OPF +#define bi_opf bi_rw +#endif + +#ifndef HAVE_CLEAN_BDEV_ALIASES +#define clean_bdev_aliases(bdev, block, len) \ + unmap_underlying_metadata((bdev), (block)) +#endif + +#ifndef HAVE_BI_STATUS +#define bi_status bi_error +#endif + /* * Maximum size of xattr attributes for FEATURE_INCOMPAT_EA_INODE 1Mb * This limit is arbitrary, but is reasonable for the xattr API. @@ -1460,6 +1617,36 @@ struct osd_bio_private { int osd_get_integrity_profile(struct osd_device *osd, integrity_gen_fn **generate_fn, integrity_vrfy_fn **verify_fn); +#else +#define integrity_gen_fn void +#define integrity_vrfy_fn int +static inline int osd_get_integrity_profile(struct osd_device *osd, + integrity_gen_fn **generate_fn, + integrity_vrfy_fn **verify_fn) +{ + return 0; +} + +static inline bool bio_integrity_prep_fn(struct bio *bio, + integrity_gen_fn *generate_fn, + integrity_vrfy_fn *verify_fn) +{ + return bio_integrity_prep(bio); +} +#endif + +#ifdef HAVE_BIO_BI_PHYS_SEGMENTS +#define osd_bio_nr_segs(bio) ((bio)->bi_phys_segments) +#else +#define osd_bio_nr_segs(bio) bio_segments((bio)) +#endif /* HAVE_BIO_BI_PHYS_SEGMENTS */ + +#ifdef HAVE_GET_INODE_USAGE +#define lock_dquot_transfer(inode) down_read(&LDISKFS_I(inode)->xattr_sem) +#define unlock_dquot_transfer(inode) up_read(&LDISKFS_I(inode)->xattr_sem) +#else +#define lock_dquot_transfer(inode) do {} while (0) +#define unlock_dquot_transfer(inode) do {} while (0) #endif #endif /* _OSD_INTERNAL_H */