X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fllite_internal.h;h=c55a63ae4cc15d8457da30592d26ab65491c2fa7;hb=92a189ca69c59312c802cb9aed0f0386735d9617;hp=6d4161415c2b0451a98de29fa4e90e57fdb08ba4;hpb=59c3911deb8357c4b6aad68d1b1fc81a8ad61b3f;p=fs%2Flustre-release.git diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 6d41614..c55a63a 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -27,7 +27,7 @@ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012, Intel Corporation. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -36,9 +36,6 @@ #ifndef LLITE_INTERNAL_H #define LLITE_INTERNAL_H - -#include - #include #include #include /* for s2sbi */ @@ -49,6 +46,7 @@ #include #include #include +#include #ifndef FMODE_EXEC #define FMODE_EXEC 0 @@ -126,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 { @@ -278,8 +280,27 @@ 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); + +int ll_xattr_cache_update(struct inode *inode, + const char *name, + const char *newval, + size_t size, + __u64 valid, + int flags); + /* * Locking to guarantee consistency of non-atomic updates to long long i_size, * consistency between file size and KMS. @@ -299,10 +320,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, @@ -401,6 +422,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", \ @@ -408,6 +430,7 @@ enum stats_track_type { "flock", \ "xattr", \ "acl", \ + "???", \ "rmt_client", \ "mds_capa", \ "oss_capa", \ @@ -420,7 +443,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 @@ -468,6 +493,8 @@ struct ll_sb_info { struct lu_fid ll_root_fid; /* root object fid */ int ll_flags; + 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; @@ -514,6 +541,7 @@ struct ll_sb_info { * clustred nfs */ struct rmtacl_ctl_table ll_rct; struct eacl_table ll_et; + __kernel_fsid_t ll_fsid; }; #define LL_DEFAULT_MAX_RW_CHUNK (32 * 1024 * 1024) @@ -611,15 +639,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. */ @@ -651,13 +683,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); @@ -733,7 +770,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 @@ -783,8 +821,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); @@ -806,10 +844,16 @@ 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_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 *); @@ -837,7 +881,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, @@ -848,18 +892,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); @@ -878,6 +918,7 @@ char *ll_get_fsname(struct super_block *sb, char *buf, int buflen); /* llite/llite_nfs.c */ extern struct export_operations lustre_export_operations; __u32 get_uuid2int(const char *name, int len); +void get_uuid2fsid(const char *name, int len, __kernel_fsid_t *fsid); struct inode *search_inode_for_lustre(struct super_block *sb, const struct lu_fid *fid); @@ -942,20 +983,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 @@ -966,7 +994,6 @@ struct vvp_io { */ unsigned int ft_flags; } fault; -#endif } fault; } u; /** @@ -993,9 +1020,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; @@ -1101,7 +1126,7 @@ static inline void ll_invalidate_page(struct page *vmpage) if (mapping == NULL) return; - ll_teardown_mmaps(mapping, offset, offset + CFS_PAGE_SIZE); + ll_teardown_mmaps(mapping, offset, offset + PAGE_CACHE_SIZE); truncate_complete_page(mapping, vmpage); } @@ -1172,8 +1197,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); @@ -1280,7 +1305,7 @@ struct ll_statahead_info { 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 */ - cfs_list_t sai_entries_sent; /* entries sent out */ + cfs_list_t sai_entries; /* entry list */ cfs_list_t sai_entries_received; /* entries returned */ cfs_list_t sai_entries_stated; /* entries stated */ cfs_list_t sai_entries_agl; /* AGL entries to be sent */ @@ -1316,8 +1341,9 @@ ll_statahead_mark(struct inode *dir, struct dentry *dentry) if (lli->lli_opendir_pid != cfs_curproc_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 @@ -1445,8 +1471,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) @@ -1470,7 +1496,7 @@ static inline int cl_merge_lvb(const struct lu_env *env, struct inode *inode) struct obd_capa *cl_capa_lookup(struct inode *inode, enum cl_req_type crt); int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end, - enum cl_fsync_mode mode); + enum cl_fsync_mode mode, int ignore_layout); /** direct write pages */ struct ll_dio_pages { @@ -1587,13 +1613,14 @@ static inline void __d_lustre_invalidate(struct dentry *dentry) * ll_md_blocking_ast), unhash this dentry, and let dcache to reclaim it later; * else dput() of the last refcount will unhash this dentry and kill it. */ -static inline void d_lustre_invalidate(struct dentry *dentry) +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)); - spin_lock(&dentry->d_lock); + spin_lock_nested(&dentry->d_lock, + nested ? DENTRY_D_LOCK_NESTED : DENTRY_D_LOCK_NORMAL); __d_lustre_invalidate(dentry); if (d_refcount(dentry) == 0) __d_drop(dentry); @@ -1633,5 +1660,9 @@ 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); + +int ll_xattr_init(void); +void ll_xattr_fini(void); #endif /* LLITE_INTERNAL_H */