X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fllite_internal.h;h=e5732deccc0fb56c1ca25677bf294f387ae24836;hp=cdf30ed9f2a4b8d7341941952c3f157a9af26552;hb=8f34119e3dc448f75605bf4968ef5540789426ec;hpb=9fe4b52ad2ffadf125d9b5c78bb2ff9a01725707 diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index cdf30ed..e5732de 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -58,6 +58,12 @@ #define VM_FAULT_RETRY 0 #endif +/* Kernel 3.1 kills LOOKUP_CONTINUE, LOOKUP_PARENT is equivalent to it. + * seem kernel commit 49084c3bb2055c401f3493c13edae14d49128ca0 */ +#ifndef LOOKUP_CONTINUE +#define LOOKUP_CONTINUE LOOKUP_PARENT +#endif + /** Only used on client-side for indicating the tail of dir hash/offset. */ #define LL_DIR_END_OFF 0x7fffffffffffffffULL #define LL_DIR_END_OFF_32BIT 0x7fffffffUL @@ -162,7 +168,7 @@ struct ll_inode_info { __u64 lli_open_fd_write_count; __u64 lli_open_fd_exec_count; /* Protects access to och pointers and their usage counters, also - * atomicity of check-update of lli_smd */ + * atomicity of check-update of lli_has_smd */ cfs_mutex_t lli_och_mutex; struct inode lli_vfs_inode; @@ -186,7 +192,6 @@ struct ll_inode_info { * cleanup the dir readahead. */ void *d_opendir_key; struct ll_statahead_info *d_sai; - __u64 d_sa_pos; struct posix_acl *d_def_acl; /* protect statahead stuff. */ cfs_spinlock_t d_sa_lock; @@ -198,7 +203,6 @@ struct ll_inode_info { #define lli_readdir_mutex u.d.d_readdir_mutex #define lli_opendir_key u.d.d_opendir_key #define lli_sai u.d.d_sai -#define lli_sa_pos u.d.d_sa_pos #define lli_def_acl u.d.d_def_acl #define lli_sa_lock u.d.d_sa_lock #define lli_opendir_pid u.d.d_opendir_pid @@ -219,14 +223,14 @@ struct ll_inode_info { cfs_rw_semaphore_t f_trunc_sem; cfs_mutex_t f_write_mutex; + cfs_rw_semaphore_t f_glimpse_sem; + cfs_time_t f_glimpse_time; + cfs_list_t f_agl_list; + __u64 f_agl_index; + /* for writepage() only to communicate to fsync */ - int f_async_rc; - int f_write_rc; + int f_async_rc; - cfs_rw_semaphore_t f_glimpse_sem; - cfs_time_t f_glimpse_time; - cfs_list_t f_agl_list; - __u64 f_agl_index; /* * whenever a process try to read/write the file, the * jobid of the process will be saved here, and it'll @@ -244,15 +248,14 @@ struct ll_inode_info { #define lli_maxbytes u.f.f_maxbytes #define lli_trunc_sem u.f.f_trunc_sem #define lli_write_mutex u.f.f_write_mutex -#define lli_async_rc u.f.f_async_rc -#define lli_write_rc u.f.f_write_rc -#define lli_glimpse_sem u.f.f_glimpse_sem -#define lli_glimpse_time u.f.f_glimpse_time -#define lli_agl_list u.f.f_agl_list -#define lli_agl_index u.f.f_agl_index -#define lli_jobid u.f.f_jobid +#define lli_glimpse_sem u.f.f_glimpse_sem +#define lli_glimpse_time u.f.f_glimpse_time +#define lli_agl_list u.f.f_agl_list +#define lli_agl_index u.f.f_agl_index +#define lli_async_rc u.f.f_async_rc +#define lli_jobid u.f.f_jobid - } u; + } u; /* XXX: For following frequent used members, although they maybe special * used for non-directory object, it is some time-wasting to check @@ -264,20 +267,22 @@ struct ll_inode_info { * In the future, if more members are added only for directory, * some of the following members can be moved into u.f. */ - struct lov_stripe_md *lli_smd; - struct cl_object *lli_clob; + bool lli_has_smd; + struct cl_object *lli_clob; + + /* mutex to request for layout lock exclusively. */ + cfs_mutex_t lli_layout_mutex; }; /* * Locking to guarantee consistency of non-atomic updates to long long i_size, - * consistency between file size and KMS, and consistency within - * ->lli_smd->lsm_oinfo[]'s. + * consistency between file size and KMS. * - * Implemented by ->lli_size_sem and ->lsm_sem, nested in that order. + * Implemented by ->lli_size_sem and ->lsm_lock, nested in that order. */ -void ll_inode_size_lock(struct inode *inode, int lock_lsm); -void ll_inode_size_unlock(struct inode *inode, int unlock_lsm); +void ll_inode_size_lock(struct inode *inode); +void ll_inode_size_unlock(struct inode *inode); // FIXME: replace the name of this with LL_I to conform to kernel stuff // static inline struct ll_inode_info *LL_I(struct inode *inode) @@ -388,6 +393,8 @@ enum stats_track_type { #define LL_SBI_64BIT_HASH 0x4000 /* support 64-bits dir hash/offset */ #define LL_SBI_AGL_ENABLED 0x8000 /* enable agl */ #define LL_SBI_VERBOSE 0x10000 /* verbose mount/umount */ +#define LL_SBI_LAYOUT_LOCK 0x20000 /* layout lock support */ +#define LL_SBI_USER_FID2PATH 0x40000 /* allow fid2path by unprivileged users */ /* default value for ll_sb_info->contention_time */ #define SBI_DEFAULT_CONTENTION_SECONDS 60 @@ -482,7 +489,6 @@ struct ll_sb_info { * clustred nfs */ struct rmtacl_ctl_table ll_rct; struct eacl_table ll_et; - struct vfsmount *ll_mnt; }; #define LL_DEFAULT_MAX_RW_CHUNK (32 * 1024 * 1024) @@ -580,20 +586,19 @@ struct ll_readahead_state { unsigned long ras_consecutive_stride_requests; }; -struct ll_file_dir { - __u64 lfd_pos; - __u64 lfd_next; -}; - extern cfs_mem_cache_t *ll_file_data_slab; struct lustre_handle; struct ll_file_data { struct ll_readahead_state fd_ras; int fd_omode; struct ccc_grouplock fd_grouplock; - struct ll_file_dir fd_dir; + __u64 lfd_pos; __u32 fd_flags; struct file *fd_file; + /* Indicate whether need to report failure when close. + * true: failure is known, not report again. + * false: unknown failure, should report. */ + bool fd_write_failed; }; struct lov_stripe_md; @@ -657,9 +662,10 @@ static void lprocfs_llite_init_vars(struct lprocfs_static_vars *lvars) void ll_release_page(struct page *page, int remove); extern struct file_operations ll_dir_operations; extern struct inode_operations ll_dir_inode_operations; -struct page *ll_get_dir_page(struct file *filp, struct inode *dir, __u64 hash, +struct page *ll_get_dir_page(struct inode *dir, __u64 hash, struct ll_dir_chain *chain); -int ll_readdir(struct file *filp, void *cookie, filldir_t filldir); +int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, + filldir_t filldir); int ll_get_mdt_idx(struct inode *inode); /* llite/namei.c */ @@ -766,7 +772,7 @@ int ll_do_fiemap(struct inode *inode, struct ll_user_fiemap *fiemap, int ll_merge_lvb(struct inode *inode); int ll_get_grouplock(struct inode *inode, struct file *file, unsigned long arg); int ll_put_grouplock(struct inode *inode, struct file *file, unsigned long arg); -int ll_fid2path(struct obd_export *exp, void *arg); +int ll_fid2path(struct inode *inode, void *arg); /* llite/dcache.c */ @@ -799,11 +805,7 @@ struct inode *ll_inode_from_lock(struct ldlm_lock *lock); void ll_clear_inode(struct inode *inode); int ll_setattr_raw(struct dentry *dentry, struct iattr *attr); int ll_setattr(struct dentry *de, struct iattr *attr); -#ifndef HAVE_STATFS_DENTRY_PARAM -int ll_statfs(struct super_block *sb, struct kstatfs *sfs); -#else int ll_statfs(struct dentry *de, struct kstatfs *sfs); -#endif int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs, __u64 max_age, __u32 flags); void ll_update_inode(struct inode *inode, struct lustre_md *md); @@ -832,6 +834,7 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data, int mode, __u32 opc, void *data); void ll_finish_md_op_data(struct md_op_data *op_data); int ll_get_obd_name(struct inode *inode, unsigned int cmd, unsigned long arg); +char *ll_get_fsname(struct super_block *sb, char *buf, int buflen); /* llite/llite_nfs.c */ extern struct export_operations lustre_export_operations; @@ -1372,14 +1375,14 @@ static inline struct ll_file_data *cl_iattr2fd(struct inode *inode, return LUSTRE_FPRIVATE(attr->ia_file); } -static inline void cl_isize_lock(struct inode *inode, int lsmlock) +static inline void cl_isize_lock(struct inode *inode) { - ll_inode_size_lock(inode, lsmlock); + ll_inode_size_lock(inode); } -static inline void cl_isize_unlock(struct inode *inode, int lsmlock) +static inline void cl_isize_unlock(struct inode *inode) { - ll_inode_size_unlock(inode, lsmlock); + ll_inode_size_unlock(inode); } static inline void cl_isize_write_nolock(struct inode *inode, loff_t kms) @@ -1390,9 +1393,9 @@ static inline void cl_isize_write_nolock(struct inode *inode, loff_t kms) static inline void cl_isize_write(struct inode *inode, loff_t kms) { - ll_inode_size_lock(inode, 0); - i_size_write(inode, kms); - ll_inode_size_unlock(inode, 0); + ll_inode_size_lock(inode); + i_size_write(inode, kms); + ll_inode_size_unlock(inode); } #define cl_isize_read(inode) i_size_read(inode) @@ -1519,7 +1522,7 @@ static inline void d_lustre_revalidate(struct dentry *dentry) spin_unlock(&dentry->d_lock); } -#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2,7,50,0) +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) /* Compatibility for old (1.8) compiled userspace quota code */ struct if_quotactl_18 { __u32 qc_cmd; @@ -1535,6 +1538,9 @@ struct if_quotactl_18 { /* End compatibility for old (1.8) compiled userspace quota code */ #else #warning "remove old LL_IOC_QUOTACTL_18 compatibility code" -#endif /* LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2,7,50,0) */ +#endif /* LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) */ + +int ll_layout_conf(struct inode *inode, const struct cl_object_conf *conf); +int ll_layout_refresh(struct inode *inode, __u32 *gen); #endif /* LLITE_INTERNAL_H */