X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fllite_internal.h;h=deee1ef2575d78bb257ee6e952ea364cb6d7a49a;hp=daaa3718bd35db03cda740c6b3a08100b2971f0d;hb=3019471086f008f45b045db424f5351fc271a1be;hpb=ea766bd959cc2347b223d597b3f8a31e010bed72;ds=sidebyside diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index daaa371..deee1ef 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -46,6 +46,7 @@ #include #include #include +#include #ifndef FMODE_EXEC #define FMODE_EXEC 0 @@ -123,6 +124,10 @@ enum lli_flags { LLIF_SRVLOCK = (1 << 5), /* File data is modified. */ LLIF_DATA_MODIFIED = (1 << 6), + /* File is being restored */ + LLIF_FILE_RESTORING = (1 << 7), + /* Xattr cache is attached to the file */ + LLIF_XATTR_CACHE = (1 << 8), }; struct ll_inode_info { @@ -193,6 +198,8 @@ struct ll_inode_info { /* "opendir_pid" is the token when lookup/revalid * -- I am the owner of dir statahead. */ pid_t d_opendir_pid; + /* directory stripe information */ + struct lmv_stripe_md *d_lmv_md; } d; #define lli_readdir_mutex u.d.d_readdir_mutex @@ -201,6 +208,7 @@ struct ll_inode_info { #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 +#define lli_lmv_md u.d.d_lmv_md /* for non-directory */ struct { @@ -275,8 +283,20 @@ struct ll_inode_info { struct mutex lli_layout_mutex; /* valid only inside LAYOUT ibits lock, protected by lli_layout_mutex */ __u32 lli_layout_gen; + + struct rw_semaphore lli_xattrs_list_rwsem; + struct mutex lli_xattrs_enq_lock; + struct list_head lli_xattrs; /* ll_xattr_entry->xe_list */ }; +int ll_xattr_cache_destroy(struct inode *inode); + +int ll_xattr_cache_get(struct inode *inode, + const char *name, + char *buffer, + size_t size, + __u64 valid); + /* * Locking to guarantee consistency of non-atomic updates to long long i_size, * consistency between file size and KMS. @@ -296,10 +316,10 @@ static inline struct ll_inode_info *ll_i2info(struct inode *inode) /* default to about 40meg of readahead on a given system. That much tied * up in 512k readahead requests serviced at 40ms each is about 1GB/s. */ -#define SBI_DEFAULT_READAHEAD_MAX (40UL << (20 - CFS_PAGE_SHIFT)) +#define SBI_DEFAULT_READAHEAD_MAX (40UL << (20 - PAGE_CACHE_SHIFT)) /* default to read-ahead full files smaller than 2MB on the second read */ -#define SBI_DEFAULT_READAHEAD_WHOLE_MAX (2UL << (20 - CFS_PAGE_SHIFT)) +#define SBI_DEFAULT_READAHEAD_WHOLE_MAX (2UL << (20 - PAGE_CACHE_SHIFT)) enum ra_stat { RA_STAT_HIT = 0, @@ -398,6 +418,7 @@ enum stats_track_type { #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 */ +#define LL_SBI_XATTR_CACHE 0x80000 /* support for xattr cache */ #define LL_SBI_FLAGS { \ "nolck", \ @@ -405,6 +426,7 @@ enum stats_track_type { "flock", \ "xattr", \ "acl", \ + "???", \ "rmt_client", \ "mds_capa", \ "oss_capa", \ @@ -417,7 +439,9 @@ enum stats_track_type { "agl", \ "verbose", \ "layout", \ - "user_fid2path" } + "user_fid2path",\ + "xattr", \ +} /* default value for ll_sb_info->contention_time */ #define SBI_DEFAULT_CONTENTION_SECONDS 60 @@ -465,7 +489,8 @@ struct ll_sb_info { struct lu_fid ll_root_fid; /* root object fid */ int ll_flags; - int ll_umounting:1; + unsigned int ll_umounting:1, + ll_xattr_cache_enabled:1; cfs_list_t ll_conn_chain; /* per-conn chain of SBs */ struct lustre_client_ocd ll_lco; @@ -474,6 +499,10 @@ struct ll_sb_info { struct lprocfs_stats *ll_stats; /* lprocfs stats counter */ + /* Used to track "unstable" pages on a client, and maintain a + * LRU list of clean pages. An "unstable" page is defined as + * any page which is sent to a server as part of a bulk request, + * but is uncommitted to stable storage. */ struct cl_client_cache ll_cache; struct lprocfs_stats *ll_ra_stats; @@ -609,15 +638,19 @@ struct ll_readahead_state { unsigned long ras_consecutive_stride_requests; }; -extern cfs_mem_cache_t *ll_file_data_slab; +extern struct kmem_cache *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_readahead_state fd_ras; + struct ccc_grouplock fd_grouplock; __u64 lfd_pos; - __u32 fd_flags; - struct file *fd_file; + __u32 fd_flags; + fmode_t fd_omode; + /* openhandle if lease exists for this file. + * Borrow lli->lli_och_mutex to protect assignment */ + struct obd_client_handle *fd_lease_och; + struct obd_client_handle *fd_och; + struct file *fd_file; /* Indicate whether need to report failure when close. * true: failure is known, not report again. * false: unknown failure, should report. */ @@ -649,13 +682,18 @@ static inline int ll_need_32bit_api(struct ll_sb_info *sbi) #if BITS_PER_LONG == 32 return 1; #else - return unlikely(cfs_curproc_is_32bit() || (sbi->ll_flags & LL_SBI_32BIT_API)); + return unlikely( +#ifdef CONFIG_COMPAT + is_compat_task() || +#endif + (sbi->ll_flags & LL_SBI_32BIT_API) + ); #endif } #define LLAP_MAGIC 98764321 -extern cfs_mem_cache_t *ll_async_page_slab; +extern struct kmem_cache *ll_async_page_slab; extern size_t ll_async_page_slab_size; void ll_ra_read_in(struct file *f, struct ll_ra_read *rar); @@ -668,29 +706,30 @@ int lprocfs_register_mountpoint(struct proc_dir_entry *parent, struct super_block *sb, char *osc, char *mdc); void lprocfs_unregister_mountpoint(struct ll_sb_info *sbi); void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, int count); -void lprocfs_llite_init_vars(struct lprocfs_static_vars *lvars); +extern struct lprocfs_seq_vars lprocfs_llite_obd_vars[]; #else static inline int lprocfs_register_mountpoint(struct proc_dir_entry *parent, struct super_block *sb, char *osc, char *mdc){return 0;} static inline void lprocfs_unregister_mountpoint(struct ll_sb_info *sbi) {} static void ll_stats_ops_tally(struct ll_sb_info *sbi, int op, int count) {} -static void lprocfs_llite_init_vars(struct lprocfs_static_vars *lvars) -{ - memset(lvars, 0, sizeof(*lvars)); -} #endif /* llite/dir.c */ -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 inode *dir, __u64 hash, - struct ll_dir_chain *chain); -int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, - filldir_t filldir); - +int ll_dir_read(struct inode *inode, struct md_op_data *op_data, + void *cookie, filldir_t filldir); int ll_get_mdt_idx(struct inode *inode); + +struct lu_dirent *ll_dir_entry_start(struct inode *dir, + struct md_op_data *op_data); + +struct lu_dirent *ll_dir_entry_next(struct inode *dir, + struct md_op_data *op_data, + struct lu_dirent *ent); +void ll_dir_entry_end(struct inode *dir, struct md_op_data *op_data, + struct lu_dirent *ent); /* llite/namei.c */ int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir); @@ -706,8 +745,6 @@ struct dentry *ll_splice_alias(struct inode *inode, struct dentry *de); int ll_rmdir_entry(struct inode *dir, char *name, int namelen); /* llite/rw.c */ -int ll_prepare_write(struct file *, struct page *, unsigned from, unsigned to); -int ll_commit_write(struct file *, struct page *, unsigned from, unsigned to); int ll_writepage(struct page *page, struct writeback_control *wbc); int ll_writepages(struct address_space *, struct writeback_control *wbc); void ll_removepage(struct page *page); @@ -720,6 +757,9 @@ int ll_sync_page_range(struct inode *, struct address_space *, loff_t, size_t); int ll_readahead(const struct lu_env *env, struct cl_io *io, struct ll_readahead_state *ras, struct address_space *mapping, struct cl_page_list *queue, int flags); +int vvp_io_write_commit(const struct lu_env *env, struct cl_io *io); +struct ll_cl_context *ll_cl_init(struct file *file, struct page *vmpage); +void ll_cl_fini(struct ll_cl_context *lcc); /* llite/file.c */ extern struct file_operations ll_file_operations; @@ -731,7 +771,8 @@ extern int ll_inode_revalidate_it(struct dentry *, struct lookup_intent *, extern int ll_have_md_lock(struct inode *inode, __u64 *bits, ldlm_mode_t l_req_mode); extern ldlm_mode_t ll_take_md_lock(struct inode *inode, __u64 bits, - struct lustre_handle *lockh, __u64 flags); + struct lustre_handle *lockh, __u64 flags, + ldlm_mode_t mode); int __ll_inode_revalidate_it(struct dentry *, struct lookup_intent *, __u64 bits); #ifdef HAVE_IOP_ATOMIC_OPEN @@ -750,7 +791,7 @@ int ll_local_open(struct file *file, int ll_release_openhandle(struct dentry *, struct lookup_intent *); int ll_md_close(struct obd_export *md_exp, struct inode *inode, struct file *file); -int ll_md_real_close(struct inode *inode, int flags); +int ll_md_real_close(struct inode *inode, fmode_t fmode); void ll_ioepoch_close(struct inode *inode, struct md_op_data *op_data, struct obd_client_handle **och, unsigned long flags); void ll_done_writing_attr(struct inode *inode, struct md_op_data *op_data); @@ -781,8 +822,8 @@ int ll_inode_permission(struct inode *inode, int mask); #endif int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file, - int flags, struct lov_user_md *lum, - int lum_size); + __u64 flags, struct lov_user_md *lum, + int lum_size); int ll_lov_getstripe_ea_info(struct inode *inode, const char *filename, struct lov_mds_md **lmm, int *lmm_size, struct ptlrpc_request **request); @@ -803,24 +844,23 @@ int ll_merge_lvb(const struct lu_env *env, 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 inode *inode, void *arg); -int ll_data_version(struct inode *inode, __u64 *data_version, int extent_lock); +int ll_data_version(struct inode *inode, __u64 *data_version, int flags); +int ll_hsm_release(struct inode *inode); + +struct obd_client_handle *ll_lease_open(struct inode *inode, struct file *file, + fmode_t mode, __u64 flags); +int ll_lease_close(struct obd_client_handle *och, struct inode *inode, + bool *lease_broken); /* llite/dcache.c */ -int ll_dops_init(struct dentry *de, int block, int init_sa); +int ll_d_init(struct dentry *de); extern struct dentry_operations ll_d_ops; void ll_intent_drop_lock(struct lookup_intent *); void ll_intent_release(struct lookup_intent *); void ll_invalidate_aliases(struct inode *); void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft); void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry); -#ifdef HAVE_D_COMPARE_7ARGS -int ll_dcompare(const struct dentry *parent, const struct inode *pinode, - const struct dentry *dentry, const struct inode *inode, - unsigned int len, const char *str, const struct qstr *d_name); -#else -int ll_dcompare(struct dentry *parent, struct qstr *d_name, struct qstr *name); -#endif int ll_revalidate_it_finish(struct ptlrpc_request *request, struct lookup_intent *it, struct dentry *de); @@ -835,7 +875,7 @@ void ll_kill_super(struct super_block *sb); struct inode *ll_inode_from_resource_lock(struct ldlm_lock *lock); 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_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import); int ll_setattr(struct dentry *de, struct iattr *attr); int ll_statfs(struct dentry *de, struct kstatfs *sfs); int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs, @@ -846,18 +886,14 @@ void ll_delete_inode(struct inode *inode); int ll_iocontrol(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); int ll_flush_ctx(struct inode *inode); -#ifdef HAVE_UMOUNTBEGIN_VFSMOUNT -void ll_umount_begin(struct vfsmount *vfsmnt, int flags); -#else void ll_umount_begin(struct super_block *sb); -#endif int ll_remount_fs(struct super_block *sb, int *flags, char *data); #ifdef HAVE_SUPEROPS_USE_DENTRY int ll_show_options(struct seq_file *seq, struct dentry *dentry); #else int ll_show_options(struct seq_file *seq, struct vfsmount *vfs); #endif -void ll_dirty_page_discard_warn(cfs_page_t *page, int ioret); +void ll_dirty_page_discard_warn(struct page *page, int ioret); int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req, struct super_block *, struct lookup_intent *); void lustre_dump_dentry(struct dentry *, int recur); @@ -895,7 +931,7 @@ extern struct inode_operations ll_fast_symlink_inode_operations; struct ll_close_queue { spinlock_t lcq_lock; cfs_list_t lcq_head; - cfs_waitq_t lcq_waitq; + wait_queue_head_t lcq_waitq; struct completion lcq_comp; cfs_atomic_t lcq_stop; }; @@ -940,20 +976,7 @@ struct vvp_io { /** * locked page returned from vvp_io */ - cfs_page_t *ft_vmpage; -#ifndef HAVE_VM_OP_FAULT - struct vm_nopage_api { - /** - * Virtual address at which fault occurred. - */ - unsigned long ft_address; - /** - * Fault type, as to be supplied to - * filemap_nopage(). - */ - int *ft_type; - } nopage; -#else + struct page *ft_vmpage; struct vm_fault_api { /** * kernel fault info @@ -964,7 +987,6 @@ struct vvp_io { */ unsigned int ft_flags; } fault; -#endif } fault; } u; /** @@ -991,9 +1013,7 @@ struct vvp_io_args { union { struct { -#ifndef HAVE_FILE_WRITEV struct kiocb *via_iocb; -#endif struct iovec *via_iov; unsigned long via_nrsegs; } normal; @@ -1092,15 +1112,19 @@ struct vm_area_struct *our_vma(struct mm_struct *mm, unsigned long addr, static inline void ll_invalidate_page(struct page *vmpage) { - struct address_space *mapping = vmpage->mapping; - loff_t offset = vmpage->index << PAGE_CACHE_SHIFT; + struct address_space *mapping = vmpage->mapping; + loff_t offset = vmpage->index << PAGE_CACHE_SHIFT; - LASSERT(PageLocked(vmpage)); - if (mapping == NULL) - return; + LASSERT(PageLocked(vmpage)); + if (mapping == NULL) + return; - ll_teardown_mmaps(mapping, offset, offset + CFS_PAGE_SIZE); - truncate_complete_page(mapping, vmpage); + /* + * truncate_complete_page() calls + * a_ops->invalidatepage()->cl_page_delete()->vvp_page_delete(). + */ + ll_teardown_mmaps(mapping, offset, offset + PAGE_CACHE_SIZE); + truncate_complete_page(mapping, vmpage); } #define ll_s2sbi(sb) (s2lsi(sb)->lsi_llsbi) @@ -1170,8 +1194,8 @@ ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size); int ll_removexattr(struct dentry *dentry, const char *name); /* llite/remote_perm.c */ -extern cfs_mem_cache_t *ll_remote_perm_cachep; -extern cfs_mem_cache_t *ll_rmtperm_hash_cachep; +extern struct kmem_cache *ll_remote_perm_cachep; +extern struct kmem_cache *ll_rmtperm_hash_cachep; cfs_hlist_head_t *alloc_rmtperm_hash(void); void free_rmtperm_hash(cfs_hlist_head_t *hash); @@ -1179,7 +1203,7 @@ int ll_update_remote_perm(struct inode *inode, struct mdt_remote_perm *perm); int lustre_check_remote_perm(struct inode *inode, int mask); /* llite/llite_capa.c */ -extern cfs_timer_t ll_capa_timer; +extern struct timer_list ll_capa_timer; int ll_capa_thread_start(void); void ll_capa_thread_stop(void); @@ -1271,13 +1295,13 @@ struct ll_statahead_info { unsigned int sai_miss_hidden;/* "ls -al", but first dentry * is not a hidden one */ unsigned int sai_skip_hidden;/* skipped hidden dentry count */ - unsigned int sai_ls_all:1, /* "ls -al", do stat-ahead for - * hidden entries */ - sai_in_readpage:1,/* statahead is in readdir()*/ - sai_agl_valid:1;/* AGL is valid for the dir */ - cfs_waitq_t sai_waitq; /* stat-ahead wait queue */ - struct ptlrpc_thread sai_thread; /* stat-ahead thread */ - struct ptlrpc_thread sai_agl_thread; /* AGL thread */ + unsigned int sai_ls_all:1, /* "ls -al", do stat-ahead for + * hidden entries */ + sai_in_readpage:1,/* statahead is in readdir()*/ + sai_agl_valid:1;/* AGL is valid for the dir */ + wait_queue_head_t sai_waitq; /* stat-ahead wait queue */ + struct ptlrpc_thread sai_thread; /* stat-ahead thread */ + struct ptlrpc_thread sai_agl_thread; /* AGL thread */ cfs_list_t sai_entries; /* entry list */ cfs_list_t sai_entries_received; /* entries returned */ cfs_list_t sai_entries_stated; /* entries stated */ @@ -1306,20 +1330,21 @@ static inline int ll_glimpse_size(struct inode *inode) static inline void ll_statahead_mark(struct inode *dir, struct dentry *dentry) { - struct ll_inode_info *lli = ll_i2info(dir); - struct ll_statahead_info *sai = lli->lli_sai; - struct ll_dentry_data *ldd = ll_d2d(dentry); + struct ll_inode_info *lli = ll_i2info(dir); + struct ll_statahead_info *sai = lli->lli_sai; + struct ll_dentry_data *ldd = ll_d2d(dentry); - /* not the same process, don't mark */ - if (lli->lli_opendir_pid != cfs_curproc_pid()) - return; + /* not the same process, don't mark */ + if (lli->lli_opendir_pid != current_pid()) + return; - if (sai != NULL && ldd != NULL) - ldd->lld_sa_generation = sai->sai_generation; + LASSERT(ldd != NULL); + if (sai != NULL) + ldd->lld_sa_generation = sai->sai_generation; } static inline int -ll_need_statahead(struct inode *dir, struct dentry *dentryp) +d_need_statahead(struct inode *dir, struct dentry *dentryp) { struct ll_inode_info *lli; struct ll_dentry_data *ldd; @@ -1329,7 +1354,7 @@ ll_need_statahead(struct inode *dir, struct dentry *dentryp) lli = ll_i2info(dir); /* not the same process, don't statahead */ - if (lli->lli_opendir_pid != cfs_curproc_pid()) + if (lli->lli_opendir_pid != current_pid()) return -EAGAIN; /* statahead has been stopped */ @@ -1364,7 +1389,7 @@ ll_statahead_enter(struct inode *dir, struct dentry **dentryp, int only_unplug) { int ret; - ret = ll_need_statahead(dir, *dentryp); + ret = d_need_statahead(dir, *dentryp); if (ret <= 0) return ret; @@ -1443,8 +1468,8 @@ static inline void cl_isize_unlock(struct inode *inode) static inline void cl_isize_write_nolock(struct inode *inode, loff_t kms) { - LASSERT_SEM_LOCKED(&ll_i2info(inode)->lli_size_sem); - i_size_write(inode, kms); + LASSERT(down_trylock(&ll_i2info(inode)->lli_size_sem) != 0); + i_size_write(inode, kms); } static inline void cl_isize_write(struct inode *inode, loff_t kms) @@ -1525,18 +1550,18 @@ static inline void ll_set_lock_data(struct obd_export *exp, struct inode *inode, * case the dcache being cleared */ if (it->d.lustre.it_remote_lock_mode) { handle.cookie = it->d.lustre.it_remote_lock_handle; - CDEBUG(D_DLMTRACE, "setting l_data to inode %p" - "(%lu/%u) for remote lock "LPX64"\n", inode, - inode->i_ino, inode->i_generation, + CDEBUG(D_DLMTRACE, "setting l_data to inode "DFID + "(%p) for remote lock "LPX64"\n", + PFID(ll_inode2fid(inode)), inode, handle.cookie); md_set_lock_data(exp, &handle.cookie, inode, NULL); } - + handle.cookie = it->d.lustre.it_lock_handle; - CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)" - " for lock "LPX64"\n", inode, inode->i_ino, - inode->i_generation, handle.cookie); + CDEBUG(D_DLMTRACE, "setting l_data to inode "DFID"(%p)" + " for lock "LPX64"\n", + PFID(ll_inode2fid(inode)), inode, handle.cookie); md_set_lock_data(exp, &handle.cookie, inode, &it->d.lustre.it_lock_bits); @@ -1589,12 +1614,12 @@ static inline void d_lustre_invalidate(struct dentry *dentry, int nested) { CDEBUG(D_DENTRY, "invalidate dentry %.*s (%p) parent %p inode %p " "refc %d\n", dentry->d_name.len, dentry->d_name.name, dentry, - dentry->d_parent, dentry->d_inode, d_refcount(dentry)); + dentry->d_parent, dentry->d_inode, d_count(dentry)); spin_lock_nested(&dentry->d_lock, nested ? DENTRY_D_LOCK_NESTED : DENTRY_D_LOCK_NORMAL); __d_lustre_invalidate(dentry); - if (d_refcount(dentry) == 0) + if (d_count(dentry) == 0) __d_drop(dentry); spin_unlock(&dentry->d_lock); } @@ -1632,5 +1657,12 @@ enum { int ll_layout_conf(struct inode *inode, const struct cl_object_conf *conf); int ll_layout_refresh(struct inode *inode, __u32 *gen); +int ll_layout_restore(struct inode *inode, loff_t start, __u64 length); + +int ll_xattr_init(void); +void ll_xattr_fini(void); + +int ll_page_sync_io(const struct lu_env *env, struct cl_io *io, + struct cl_page *page, enum cl_req_type crt); #endif /* LLITE_INTERNAL_H */