X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_internal.h;h=3f685a7c95d6e6d811efb358e441c4d57e1991a8;hp=a3442363384d4ab0aebcd7069cf266391507947f;hb=a259082d66ba482aa4044abd1b41ac4219585473;hpb=0887b89c0c4e2b7c5a7ba3365e758a7d94c667fa diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index a344236..3f685a7 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2014, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -79,6 +79,7 @@ extern struct kmem_cache *dynlock_cachep; /* OI scrub should skip this inode. */ #define LDISKFS_STATE_LUSTRE_NOSCRUB 31 +#define LDISKFS_STATE_LUSTRE_DESTROY 30 /** Enable thandle usage statistics */ #define OSD_THANDLE_STATS (0) @@ -89,6 +90,10 @@ extern struct kmem_cache *dynlock_cachep; #define ADMIN_USR "admin_quotafile_v2.usr" #define ADMIN_GRP "admin_quotafile_v2.grp" +/* Statfs space reservation for fragmentation and local objects */ +#define OSD_STATFS_RESERVED (1ULL << 23) /* 8MB */ +#define OSD_STATFS_RESERVED_SHIFT (7) /* reserve 0.78% of all space */ + struct osd_directory { struct iam_container od_container; struct iam_descr od_descr; @@ -128,6 +133,9 @@ struct osd_object { spinlock_t oo_guard; __u32 oo_destroyed:1; + + /* the i_flags in LMA */ + __u32 oo_lma_flags; /** * Following two members are used to indicate the presence of dot and * dotdot in the given directory. This is required for interop mode @@ -140,6 +148,8 @@ struct osd_object { #ifdef CONFIG_LOCKDEP struct lockdep_map oo_dep_map; #endif + + struct list_head oo_xattr_list; }; struct osd_obj_seq { @@ -168,9 +178,9 @@ struct osd_mdobj { struct osd_mdobj_map { struct dentry *omm_remote_parent; }; - -#define osd_ldiskfs_add_entry(handle, child, cinode, hlock) \ - __ldiskfs_add_entry(handle, child, cinode, hlock) +int osd_ldiskfs_add_entry(struct osd_thread_info *info, + handle_t *handle, struct dentry *child, + struct inode *inode, struct htree_lock *hlock); #define OSD_OTABLE_IT_CACHE_SIZE 64 #define OSD_OTABLE_IT_CACHE_MASK (~(OSD_OTABLE_IT_CACHE_SIZE - 1)) @@ -349,7 +359,7 @@ struct osd_thandle { unsigned short ot_credits; unsigned short ot_id_cnt; unsigned short ot_id_type; - int ot_remove_agents:1; + 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 @@ -428,7 +438,7 @@ struct osd_it_ea_dirent { * there would be one ext3 readdir for every mdd readdir page. */ -#define OSD_IT_EA_BUFSIZE (PAGE_CACHE_SIZE + PAGE_CACHE_SIZE/4) +#define OSD_IT_EA_BUFSIZE (PAGE_SIZE + PAGE_SIZE/4) /** * This is iterator's in-memory data structure in interoperability @@ -480,7 +490,7 @@ struct osd_it_quota { struct list_head oiq_list; }; -#define MAX_BLOCKS_PER_PAGE (PAGE_CACHE_SIZE / 512) +#define MAX_BLOCKS_PER_PAGE (PAGE_SIZE / 512) struct osd_iobuf { wait_queue_head_t dr_wait; @@ -502,6 +512,8 @@ struct osd_iobuf { unsigned int dr_init_at; /* the line iobuf was initialized */ }; +#define OSD_INS_CACHE_SIZE 8 + struct osd_thread_info { const struct lu_env *oti_env; /** @@ -566,6 +578,11 @@ 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; + int oti_r_locks; int oti_w_locks; int oti_txns; @@ -590,7 +607,9 @@ struct osd_thread_info { /* used by quota code */ union { -#ifdef HAVE_DQUOT_FS_DISK_QUOTA +#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; @@ -764,10 +783,11 @@ static inline void i_gid_write(struct inode *inode, gid_t gid) #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, err) \ +# define osd_ldiskfs_append(handle, inode, nblock) \ ldiskfs_append(handle, inode, nblock) # define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ - __ldiskfs_find_entry(dir, name, de, inlined, lock) + (__ldiskfs_find_entry(dir, name, de, inlined, lock) ?: \ + ERR_PTR(-ENOENT)) # define osd_journal_start(inode, type, nblocks) \ ldiskfs_journal_start(inode, type, nblocks) # define osd_transaction_size(dev) \ @@ -776,10 +796,24 @@ static inline void i_gid_write(struct inode *inode, gid_t gid) # define LDISKFS_HT_MISC 0 # define osd_journal_start_sb(sb, type, nblock) \ ldiskfs_journal_start_sb(sb, nblock) -# define osd_ldiskfs_append(handle, inode, nblock, err) \ - ldiskfs_append(handle, inode, nblock, err) + +static inline struct buffer_head *osd_ldiskfs_append(handle_t *handle, + struct inode *inode, + ldiskfs_lblk_t *nblock) +{ + struct buffer_head *bh; + int err = 0; + + bh = ldiskfs_append(handle, inode, nblock, &err); + if (bh == NULL) + bh = ERR_PTR(err); + + return bh; +} + # define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \ - __ldiskfs_find_entry(dir, name, de, lock) + (__ldiskfs_find_entry(dir, name, de, lock) ?: \ + ERR_PTR(-ENOENT)) # define osd_journal_start(inode, type, nblocks) \ ldiskfs_journal_start(inode, nblocks) # define osd_transaction_size(dev) \ @@ -899,6 +933,11 @@ static inline char *osd_name(struct osd_device *osd) return osd->od_dt_dev.dd_lu_dev.ld_obd->obd_name; } +static inline bool osd_is_ea_inode(struct inode *inode) +{ + return !!(LDISKFS_I(inode)->i_flags & LDISKFS_EA_INODE_FL); +} + extern const struct dt_body_operations osd_body_ops; extern struct lu_context_key osd_key; @@ -935,6 +974,10 @@ static inline void osd_ipd_put(const struct lu_env *env, bag->ic_descr->id_ops->id_ipd_free(ipd); } +int osd_calc_bkmap_credits(struct super_block *sb, struct inode *inode, + const loff_t size, const loff_t pos, + 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); @@ -1142,7 +1185,7 @@ int osd_acct_obj_lookup(struct osd_thread_info *info, struct osd_device *osd, static inline int is_32bit_api(void) { #ifdef CONFIG_COMPAT - return is_compat_task(); + return in_compat_syscall(); #else return (BITS_PER_LONG == 32); #endif @@ -1167,6 +1210,30 @@ static inline unsigned long osd_remote_parent_ino(struct osd_device *dev) return dev->od_mdt_map->omm_remote_parent->d_inode->i_ino; } +/** + * ext4_bread/ldiskfs_bread has either 5 or 4 parameters. The error + * return code has been removed and integrated into the pointer in the + * kernel 3.18. + */ +static inline struct buffer_head *__ldiskfs_bread(handle_t *handle, + struct inode *inode, + ldiskfs_lblk_t block, + int create) +{ +#ifdef HAVE_EXT4_BREAD_4ARGS + return ldiskfs_bread(handle, inode, block, create); +#else + struct buffer_head *bh; + int error = 0; + + bh = ldiskfs_bread(handle, inode, block, create, &error); + if (bh == NULL && error != 0) + bh = ERR_PTR(error); + + return bh; +#endif +} + void ldiskfs_inc_count(handle_t *handle, struct inode *inode); void ldiskfs_dec_count(handle_t *handle, struct inode *inode);