diff options
Diffstat (limited to 'drivers/staging/lustre/lustre/include')
25 files changed, 172 insertions, 127 deletions
diff --git a/drivers/staging/lustre/lustre/include/cl_object.h b/drivers/staging/lustre/lustre/include/cl_object.h index 4d692dcd96cf..c809239c0866 100644 --- a/drivers/staging/lustre/lustre/include/cl_object.h +++ b/drivers/staging/lustre/lustre/include/cl_object.h @@ -1314,7 +1314,7 @@ static inline int __page_in_use(const struct cl_page *page, int refc) * calls. To achieve this, every layer can implement ->clo_fits_into() method, * that is called by lock matching code (cl_lock_lookup()), and that can be * used to selectively disable matching of certain locks for certain IOs. For - * exmaple, lov layer implements lov_lock_fits_into() that allow multi-stripe + * example, lov layer implements lov_lock_fits_into() that allow multi-stripe * locks to be matched only for truncates and O_APPEND writes. * * Interaction with DLM @@ -2385,14 +2385,18 @@ struct cl_io { * Check if layout changed after the IO finishes. Mainly for HSM * requirement. If IO occurs to openning files, it doesn't need to * verify layout because HSM won't release openning files. - * Right now, only two opertaions need to verify layout: glimpse + * Right now, only two operations need to verify layout: glimpse * and setattr. */ ci_verify_layout:1, /** * file is released, restore has to to be triggered by vvp layer */ - ci_restore_needed:1; + ci_restore_needed:1, + /** + * O_NOATIME + */ + ci_noatime:1; /** * Number of pages owned by this IO. For invariant checking. */ @@ -2552,7 +2556,7 @@ struct cl_req_obj { */ struct cl_req { enum cl_req_type crq_type; - /** A list of pages being transfered */ + /** A list of pages being transferred */ struct list_head crq_pages; /** Number of pages in cl_req::crq_pages */ unsigned crq_nrpages; @@ -3224,7 +3228,7 @@ void cl_sync_io_note(struct cl_sync_io *anchor, int ioret); * * - call chains have no non-lustre portions inserted between lustre code. * - * On a client both these assumtpion fails, because every user thread can + * On a client both these assumption fails, because every user thread can * potentially execute lustre code as part of a system call, and lustre calls * into VFS or MM that call back into lustre. * diff --git a/drivers/staging/lustre/lustre/include/ioctl.h b/drivers/staging/lustre/lustre/include/ioctl.h index 227c261b2ae9..b986920926bd 100644 --- a/drivers/staging/lustre/lustre/include/ioctl.h +++ b/drivers/staging/lustre/lustre/include/ioctl.h @@ -38,7 +38,7 @@ * and on newer kernels this header is shared as _ASM_GENERIC_IOCTL_H. * * We can avoid any problems with the kernel header being included again by - * defining _ASM_I386_IOCTL_H here so that a later occurence of <asm/ioctl.h> + * defining _ASM_I386_IOCTL_H here so that a later occurrence of <asm/ioctl.h> * does not include the kernel's ioctl.h after this one. b=14746 */ #define _ASM_I386_IOCTL_H #define _ASM_GENERIC_IOCTL_H diff --git a/drivers/staging/lustre/lustre/include/lclient.h b/drivers/staging/lustre/lustre/include/lclient.h index 27316f7b7a70..827209ea6bd0 100644 --- a/drivers/staging/lustre/lustre/include/lclient.h +++ b/drivers/staging/lustre/lustre/include/lclient.h @@ -118,8 +118,8 @@ struct ccc_io { }; /** - * True, if \a io is a normal io, False for other (sendfile, splice*). - * must be impementated in arch specific code. + * True, if \a io is a normal io, False for splice_{read,write}. + * must be implemented in arch specific code. */ int cl_is_normalio(const struct lu_env *env, const struct cl_io *io); diff --git a/drivers/staging/lustre/lustre/include/linux/lustre_acl.h b/drivers/staging/lustre/lustre/include/linux/lustre_acl.h index 778b123ce31e..a91c5497d22c 100644 --- a/drivers/staging/lustre/lustre/include/linux/lustre_acl.h +++ b/drivers/staging/lustre/lustre/include/linux/lustre_acl.h @@ -44,7 +44,7 @@ #define _LUSTRE_LINUX_ACL_H #ifndef _LUSTRE_ACL_H -#error Shoud not include direectly. use #include <lustre_acl.h> instead +#error Should not include directly. use #include <lustre_acl.h> instead #endif #include <linux/fs.h> diff --git a/drivers/staging/lustre/lustre/include/linux/lustre_compat25.h b/drivers/staging/lustre/lustre/include/linux/lustre_compat25.h index eefdb8d061b1..81cc7a0134bb 100644 --- a/drivers/staging/lustre/lustre/include/linux/lustre_compat25.h +++ b/drivers/staging/lustre/lustre/include/linux/lustre_compat25.h @@ -105,8 +105,8 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, #define ll_vfs_unlink(inode,entry,mnt) vfs_unlink(inode,entry) #define ll_vfs_mknod(dir,entry,mnt,mode,dev) vfs_mknod(dir,entry,mode,dev) #define ll_security_inode_unlink(dir,entry,mnt) security_inode_unlink(dir,entry) -#define ll_vfs_rename(old,old_dir,mnt,new,new_dir,mnt1,delegated_inode) \ - vfs_rename(old,old_dir,new,new_dir,delegated_inode) +#define ll_vfs_rename(old, old_dir, mnt, new, new_dir, mnt1) \ + vfs_rename(old, old_dir, new, new_dir, NULL, 0) #define cfs_bio_io_error(a,b) bio_io_error((a)) #define cfs_bio_endio(a,b,c) bio_endio((a),(c)) diff --git a/drivers/staging/lustre/lustre/include/linux/obd.h b/drivers/staging/lustre/lustre/include/linux/obd.h index 01a50265239d..dc36f75eb635 100644 --- a/drivers/staging/lustre/lustre/include/linux/obd.h +++ b/drivers/staging/lustre/lustre/include/linux/obd.h @@ -96,7 +96,8 @@ static inline void __client_obd_list_lock(client_obd_lock_t *lock, LCONSOLE_WARN("====== for current process =====\n"); dump_stack(); LCONSOLE_WARN("====== end =======\n"); - cfs_pause(1000 * HZ); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(1000 * HZ); } cpu_relax(); } diff --git a/drivers/staging/lustre/lustre/include/lustre/lustre_idl.h b/drivers/staging/lustre/lustre/include/lustre/lustre_idl.h index 5da31c54924a..87905bbc68e1 100644 --- a/drivers/staging/lustre/lustre/include/lustre/lustre_idl.h +++ b/drivers/staging/lustre/lustre/include/lustre/lustre_idl.h @@ -91,8 +91,8 @@ #ifndef _LUSTRE_IDL_H_ #define _LUSTRE_IDL_H_ -#if !defined(LASSERT) && !defined(LPU64) -#include <linux/libcfs/libcfs.h> /* for LASSERT, LPUX64, etc */ +#if !defined(LPU64) +#include <linux/libcfs/libcfs.h> /* for LPUX64, etc */ #endif /* Defn's shared with user-space. */ @@ -232,7 +232,6 @@ static inline unsigned fld_range_is_any(const struct lu_seq_range *range) static inline void fld_range_set_type(struct lu_seq_range *range, unsigned flags) { - LASSERT(!(flags & ~LU_SEQ_RANGE_MASK)); range->lsr_flags |= flags; } @@ -351,7 +350,7 @@ struct som_attrs { /** Bitfield for supported data in this structure. For future use. */ __u32 som_compat; - /** Incompat feature list. The supported feature mask is availabe in + /** Incompat feature list. The supported feature mask is available in * SOM_INCOMPAT_SUPP */ __u32 som_incompat; @@ -615,7 +614,6 @@ static inline obd_id fid_idif_id(obd_seq seq, __u32 oid, __u32 ver) /* extract ost index from IDIF FID */ static inline __u32 fid_idif_ost_idx(const struct lu_fid *fid) { - LASSERT(fid_is_idif(fid)); return (fid_seq(fid) >> 16) & 0xffff; } @@ -833,11 +831,6 @@ static inline void lu_igif_build(struct lu_fid *fid, __u32 ino, __u32 gen) */ static inline void fid_cpu_to_le(struct lu_fid *dst, const struct lu_fid *src) { - /* check that all fields are converted */ - CLASSERT(sizeof(*src) == - sizeof(fid_seq(src)) + - sizeof(fid_oid(src)) + - sizeof(fid_ver(src))); dst->f_seq = cpu_to_le64(fid_seq(src)); dst->f_oid = cpu_to_le32(fid_oid(src)); dst->f_ver = cpu_to_le32(fid_ver(src)); @@ -845,11 +838,6 @@ static inline void fid_cpu_to_le(struct lu_fid *dst, const struct lu_fid *src) static inline void fid_le_to_cpu(struct lu_fid *dst, const struct lu_fid *src) { - /* check that all fields are converted */ - CLASSERT(sizeof(*src) == - sizeof(fid_seq(src)) + - sizeof(fid_oid(src)) + - sizeof(fid_ver(src))); dst->f_seq = le64_to_cpu(fid_seq(src)); dst->f_oid = le32_to_cpu(fid_oid(src)); dst->f_ver = le32_to_cpu(fid_ver(src)); @@ -857,11 +845,6 @@ static inline void fid_le_to_cpu(struct lu_fid *dst, const struct lu_fid *src) static inline void fid_cpu_to_be(struct lu_fid *dst, const struct lu_fid *src) { - /* check that all fields are converted */ - CLASSERT(sizeof(*src) == - sizeof(fid_seq(src)) + - sizeof(fid_oid(src)) + - sizeof(fid_ver(src))); dst->f_seq = cpu_to_be64(fid_seq(src)); dst->f_oid = cpu_to_be32(fid_oid(src)); dst->f_ver = cpu_to_be32(fid_ver(src)); @@ -869,11 +852,6 @@ static inline void fid_cpu_to_be(struct lu_fid *dst, const struct lu_fid *src) static inline void fid_be_to_cpu(struct lu_fid *dst, const struct lu_fid *src) { - /* check that all fields are converted */ - CLASSERT(sizeof(*src) == - sizeof(fid_seq(src)) + - sizeof(fid_oid(src)) + - sizeof(fid_ver(src))); dst->f_seq = be64_to_cpu(fid_seq(src)); dst->f_oid = be32_to_cpu(fid_oid(src)); dst->f_ver = be32_to_cpu(fid_ver(src)); @@ -897,11 +875,6 @@ extern void lustre_swab_lu_seq_range(struct lu_seq_range *range); static inline int lu_fid_eq(const struct lu_fid *f0, const struct lu_fid *f1) { - /* Check that there is no alignment padding. */ - CLASSERT(sizeof(*f0) == - sizeof(f0->f_seq) + - sizeof(f0->f_oid) + - sizeof(f0->f_ver)); return memcmp(f0, f1, sizeof(*f0)) == 0; } @@ -960,7 +933,7 @@ enum lu_dirent_attrs { LUDA_TYPE = 0x0002, LUDA_64BITHASH = 0x0004, - /* The following attrs are used for MDT interanl only, + /* The following attrs are used for MDT internal only, * not visible to client */ /* Verify the dirent consistency */ @@ -1331,6 +1304,9 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); #define OBD_CONNECT_LIGHTWEIGHT 0x1000000000000ULL/* lightweight connection */ #define OBD_CONNECT_SHORTIO 0x2000000000000ULL/* short io */ #define OBD_CONNECT_PINGLESS 0x4000000000000ULL/* pings not required */ +#define OBD_CONNECT_FLOCK_DEAD 0x8000000000000ULL/* flock deadlock detection */ +#define OBD_CONNECT_DISP_STRIPE 0x10000000000000ULL/*create stripe disposition*/ + /* XXX README XXX: * Please DO NOT add flag values here before first ensuring that this same * flag value is not in use on some other branch. Please clear any such @@ -1368,7 +1344,10 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); OBD_CONNECT_EINPROGRESS | \ OBD_CONNECT_LIGHTWEIGHT | OBD_CONNECT_UMASK | \ OBD_CONNECT_LVB_TYPE | OBD_CONNECT_LAYOUTLOCK |\ - OBD_CONNECT_PINGLESS | OBD_CONNECT_MAX_EASIZE) + OBD_CONNECT_PINGLESS | OBD_CONNECT_MAX_EASIZE |\ + OBD_CONNECT_FLOCK_DEAD | \ + OBD_CONNECT_DISP_STRIPE) + #define OST_CONNECT_SUPPORTED (OBD_CONNECT_SRVLOCK | OBD_CONNECT_GRANT | \ OBD_CONNECT_REQPORTAL | OBD_CONNECT_VERSION | \ OBD_CONNECT_TRUNCLOCK | OBD_CONNECT_INDEX | \ @@ -1771,7 +1750,6 @@ static inline __u32 lov_mds_md_size(__u16 stripes, __u32 lmm_magic) OBD_MD_FLGID | OBD_MD_FLFLAGS | OBD_MD_FLNLINK | \ OBD_MD_FLGENER | OBD_MD_FLRDEV | OBD_MD_FLGROUP) -#define OBD_MD_FLXATTRLOCKED OBD_MD_FLGETATTRLOCK #define OBD_MD_FLXATTRALL (OBD_MD_FLXATTR | OBD_MD_FLXATTRLS) /* don't forget obdo_fid which is way down at the bottom so it can @@ -2134,19 +2112,32 @@ extern void lustre_swab_generic_32s (__u32 *val); #define DISP_LOOKUP_POS 0x00000008 #define DISP_OPEN_CREATE 0x00000010 #define DISP_OPEN_OPEN 0x00000020 -#define DISP_ENQ_COMPLETE 0x00400000 +#define DISP_ENQ_COMPLETE 0x00400000 /* obsolete and unused */ #define DISP_ENQ_OPEN_REF 0x00800000 #define DISP_ENQ_CREATE_REF 0x01000000 #define DISP_OPEN_LOCK 0x02000000 #define DISP_OPEN_LEASE 0x04000000 +#define DISP_OPEN_STRIPE 0x08000000 /* INODE LOCK PARTS */ -#define MDS_INODELOCK_LOOKUP 0x000001 /* dentry, mode, owner, group */ -#define MDS_INODELOCK_UPDATE 0x000002 /* size, links, timestamps */ -#define MDS_INODELOCK_OPEN 0x000004 /* For opened files */ -#define MDS_INODELOCK_LAYOUT 0x000008 /* for layout */ -#define MDS_INODELOCK_PERM 0x000010 /* for permission */ -#define MDS_INODELOCK_XATTR 0x000020 /* extended attributes */ +#define MDS_INODELOCK_LOOKUP 0x000001 /* For namespace, dentry etc, and also + * was used to protect permission (mode, + * owner, group etc) before 2.4. */ +#define MDS_INODELOCK_UPDATE 0x000002 /* size, links, timestamps */ +#define MDS_INODELOCK_OPEN 0x000004 /* For opened files */ +#define MDS_INODELOCK_LAYOUT 0x000008 /* for layout */ + +/* The PERM bit is added int 2.4, and it is used to protect permission(mode, + * owner, group, acl etc), so to separate the permission from LOOKUP lock. + * Because for remote directories(in DNE), these locks will be granted by + * different MDTs(different ldlm namespace). + * + * For local directory, MDT will always grant UPDATE_LOCK|PERM_LOCK together. + * For Remote directory, the master MDT, where the remote directory is, will + * grant UPDATE_LOCK|PERM_LOCK, and the remote MDT, where the name entry is, + * will grant LOOKUP_LOCK. */ +#define MDS_INODELOCK_PERM 0x000010 +#define MDS_INODELOCK_XATTR 0x000020 /* extended attributes */ #define MDS_INODELOCK_MAXSHIFT 5 /* This FULL lock is useful to take on unlink sort of operations */ @@ -2595,7 +2586,7 @@ struct mdt_rec_setxattr { * Do NOT change the size of various members, otherwise the value * will be broken in lustre_swab_mdt_rec_reint(). * - * If you add new members in other mdt_reint_xxx structres and need to use the + * If you add new members in other mdt_reint_xxx structures and need to use the * rr_padding_x fields, then update lustre_swab_mdt_rec_reint() also. */ struct mdt_rec_reint { @@ -3328,9 +3319,10 @@ struct obdo { #define o_grant_used o_data_version static inline void lustre_set_wire_obdo(struct obd_connect_data *ocd, - struct obdo *wobdo, struct obdo *lobdo) + struct obdo *wobdo, + const struct obdo *lobdo) { - memcpy(wobdo, lobdo, sizeof(*lobdo)); + *wobdo = *lobdo; wobdo->o_flags &= ~OBD_FL_LOCAL_MASK; if (ocd == NULL) return; @@ -3345,16 +3337,15 @@ static inline void lustre_set_wire_obdo(struct obd_connect_data *ocd, } static inline void lustre_get_wire_obdo(struct obd_connect_data *ocd, - struct obdo *lobdo, struct obdo *wobdo) + struct obdo *lobdo, + const struct obdo *wobdo) { obd_flag local_flags = 0; if (lobdo->o_valid & OBD_MD_FLFLAGS) local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK; - LASSERT(!(wobdo->o_flags & OBD_FL_LOCAL_MASK)); - - memcpy(lobdo, wobdo, sizeof(*lobdo)); + *lobdo = *wobdo; if (local_flags != 0) { lobdo->o_valid |= OBD_MD_FLFLAGS; lobdo->o_flags &= ~OBD_FL_LOCAL_MASK; diff --git a/drivers/staging/lustre/lustre/include/lustre/lustre_user.h b/drivers/staging/lustre/lustre/include/lustre/lustre_user.h index 7893d83e131f..f5f369e603de 100644 --- a/drivers/staging/lustre/lustre/include/lustre/lustre_user.h +++ b/drivers/staging/lustre/lustre/include/lustre/lustre_user.h @@ -265,13 +265,11 @@ struct ost_id { #define MAX_OBD_NAME 128 /* If this changes, a NEW ioctl must be added */ -/* Hopefully O_LOV_DELAY_CREATE does not conflict with standard O_xxx flags. - * Previously it was defined as 0100000000 and conflicts with FMODE_NONOTIFY - * which was added since kernel 2.6.36, so we redefine it as 020000000. - * To be compatible with old version's statically linked binary, finally we - * define it as (020000000 | 0100000000). - * */ -#define O_LOV_DELAY_CREATE 0120000000 +/* Define O_LOV_DELAY_CREATE to be a mask that is not useful for regular + * files, but are unlikely to be used in practice and are not harmful if + * used incorrectly. O_NOCTTY and FASYNC are only meaningful for character + * devices and are safe for use on new files (See LU-812, LU-4209). */ +#define O_LOV_DELAY_CREATE (O_NOCTTY | FASYNC) #define LL_FILE_IGNORE_LOCK 0x00000001 #define LL_FILE_GROUP_LOCKED 0x00000002 @@ -300,7 +298,7 @@ struct ost_id { #define LOV_MAX_STRIPE_COUNT_OLD 160 /* This calculation is crafted so that input of 4096 will result in 160 * which in turn is equal to old maximal stripe count. - * XXX: In fact this is too simpified for now, what it also need is to get + * XXX: In fact this is too simplified for now, what it also need is to get * ea_type argument to clearly know how much space each stripe consumes. * * The limit of 12 pages is somewhat arbitrary, but is a reasonably large @@ -930,7 +928,7 @@ struct hsm_state_set_ioc { /* * This structure describes the current in-progress action for a file. - * it is retuned to user space and send over the wire + * it is returned to user space and send over the wire */ struct hsm_current_action { /** The current undergoing action, if there is one */ @@ -1159,12 +1157,6 @@ struct hsm_progress { __u32 padding; }; -/** - * Use by copytool during any hsm request they handled. - * This structure is initialized by llapi_hsm_copy_start() - * which is an helper over the ioctl() interface - * Store Lustre, internal use only, data. - */ struct hsm_copy { __u64 hc_data_version; __u16 hc_flags; diff --git a/drivers/staging/lustre/lustre/include/lustre_cfg.h b/drivers/staging/lustre/lustre/include/lustre_cfg.h index e14a5f674e85..3680668a8920 100644 --- a/drivers/staging/lustre/lustre/include/lustre_cfg.h +++ b/drivers/staging/lustre/lustre/include/lustre_cfg.h @@ -88,6 +88,8 @@ enum lcfg_command_type { LCFG_SET_LDLM_TIMEOUT = 0x00ce030, /**< set ldlm_timeout */ LCFG_PRE_CLEANUP = 0x00cf031, /**< call type-specific pre * cleanup cleanup */ + LCFG_SET_PARAM = 0x00ce032, /**< use set_param syntax to set + *a proc parameters */ }; struct lustre_cfg_bufs { diff --git a/drivers/staging/lustre/lustre/include/lustre_disk.h b/drivers/staging/lustre/lustre/include/lustre_disk.h index 1de9a8bed497..ac08164793cb 100644 --- a/drivers/staging/lustre/lustre/include/lustre_disk.h +++ b/drivers/staging/lustre/lustre/include/lustre_disk.h @@ -99,6 +99,8 @@ #define LDD_F_IR_CAPABLE 0x2000 /** the MGS refused to register the target. */ #define LDD_F_ERROR 0x4000 +/** process at lctl conf_param */ +#define LDD_F_PARAM2 0x8000 /* opc for target register */ #define LDD_F_OPC_REG 0x10000000 diff --git a/drivers/staging/lustre/lustre/include/lustre_dlm.h b/drivers/staging/lustre/lustre/include/lustre_dlm.h index ec4bb5e3c13e..3e25f001c07d 100644 --- a/drivers/staging/lustre/lustre/include/lustre_dlm.h +++ b/drivers/staging/lustre/lustre/include/lustre_dlm.h @@ -330,7 +330,7 @@ enum { }; typedef enum { - /** invalide type */ + /** invalid type */ LDLM_NS_TYPE_UNKNOWN = 0, /** mdc namespace */ LDLM_NS_TYPE_MDC, @@ -1185,7 +1185,7 @@ ldlm_handle2lock_long(const struct lustre_handle *h, __u64 flags) /** * Update Lock Value Block Operations (LVBO) on a resource taking into account - * data from reqest \a r + * data from request \a r */ static inline int ldlm_res_lvbo_update(struct ldlm_resource *res, struct ptlrpc_request *r, int increase) diff --git a/drivers/staging/lustre/lustre/include/lustre_dlm_flags.h b/drivers/staging/lustre/lustre/include/lustre_dlm_flags.h index 75716f17f64b..16dcdbfae689 100644 --- a/drivers/staging/lustre/lustre/include/lustre_dlm_flags.h +++ b/drivers/staging/lustre/lustre/include/lustre_dlm_flags.h @@ -35,10 +35,10 @@ #ifndef LDLM_ALL_FLAGS_MASK /** l_flags bits marked as "all_flags" bits */ -#define LDLM_FL_ALL_FLAGS_MASK 0x00FFFFFFC08F132FULL +#define LDLM_FL_ALL_FLAGS_MASK 0x00FFFFFFC08F932FULL /** l_flags bits marked as "ast" bits */ -#define LDLM_FL_AST_MASK 0x0000000080000000ULL +#define LDLM_FL_AST_MASK 0x0000000080008000ULL /** l_flags bits marked as "blocked" bits */ #define LDLM_FL_BLOCKED_MASK 0x000000000000000EULL @@ -56,7 +56,7 @@ #define LDLM_FL_LOCAL_ONLY_MASK 0x00FFFFFF00000000ULL /** l_flags bits marked as "on_wire" bits */ -#define LDLM_FL_ON_WIRE_MASK 0x00000000C08F132FULL +#define LDLM_FL_ON_WIRE_MASK 0x00000000C08F932FULL /** extent, mode, or resource changed */ #define LDLM_FL_LOCK_CHANGED 0x0000000000000001ULL // bit 0 @@ -114,6 +114,12 @@ #define ldlm_set_has_intent(_l) LDLM_SET_FLAG(( _l), 1ULL << 12) #define ldlm_clear_has_intent(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 12) +/** flock deadlock detected */ +#define LDLM_FL_FLOCK_DEADLOCK 0x0000000000008000ULL /* bit 15 */ +#define ldlm_is_flock_deadlock(_l) LDLM_TEST_FLAG((_l), 1ULL << 15) +#define ldlm_set_flock_deadlock(_l) LDLM_SET_FLAG((_l), 1ULL << 15) +#define ldlm_clear_flock_deadlock(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 15) + /** discard (no writeback) on cancel */ #define LDLM_FL_DISCARD_DATA 0x0000000000010000ULL // bit 16 #define ldlm_is_discard_data(_l) LDLM_TEST_FLAG(( _l), 1ULL << 16) @@ -141,7 +147,7 @@ #define ldlm_clear_test_lock(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 19) /** - * Immediatelly cancel such locks when they block some other locks. Send + * Immediately cancel such locks when they block some other locks. Send * cancel notification to original lock holder, but expect no reply. This * is for clients (like liblustre) that cannot be expected to reliably * response to blocking AST. */ @@ -242,7 +248,7 @@ /** * A lock contributes to the known minimum size (KMS) calculation until it - * has finished the part of its cancelation that performs write back on its + * has finished the part of its cancellation that performs write back on its * dirty pages. It can remain on the granted list during this whole time. * Threads racing to update the KMS after performing their writeback need * to know to exclude each other's locks from the calculation as they walk @@ -390,6 +396,7 @@ static int hf_lustre_ldlm_fl_ast_sent = -1; static int hf_lustre_ldlm_fl_replay = -1; static int hf_lustre_ldlm_fl_intent_only = -1; static int hf_lustre_ldlm_fl_has_intent = -1; +static int hf_lustre_ldlm_fl_flock_deadlock = -1; static int hf_lustre_ldlm_fl_discard_data = -1; static int hf_lustre_ldlm_fl_no_timeout = -1; static int hf_lustre_ldlm_fl_block_nowait = -1; @@ -431,6 +438,7 @@ const value_string lustre_ldlm_flags_vals[] = { {LDLM_FL_REPLAY, "LDLM_FL_REPLAY"}, {LDLM_FL_INTENT_ONLY, "LDLM_FL_INTENT_ONLY"}, {LDLM_FL_HAS_INTENT, "LDLM_FL_HAS_INTENT"}, + {LDLM_FL_FLOCK_DEADLOCK, "LDLM_FL_FLOCK_DEADLOCK"}, {LDLM_FL_DISCARD_DATA, "LDLM_FL_DISCARD_DATA"}, {LDLM_FL_NO_TIMEOUT, "LDLM_FL_NO_TIMEOUT"}, {LDLM_FL_BLOCK_NOWAIT, "LDLM_FL_BLOCK_NOWAIT"}, diff --git a/drivers/staging/lustre/lustre/include/lustre_export.h b/drivers/staging/lustre/lustre/include/lustre_export.h index 2feb38b51af2..103f7a8bd83f 100644 --- a/drivers/staging/lustre/lustre/include/lustre_export.h +++ b/drivers/staging/lustre/lustre/include/lustre_export.h @@ -192,9 +192,9 @@ struct obd_export { struct obd_import *exp_imp_reverse; struct nid_stat *exp_nid_stats; struct lprocfs_stats *exp_md_stats; - /** Active connetion */ + /** Active connection */ struct ptlrpc_connection *exp_connection; - /** Connection count value from last succesful reconnect rpc */ + /** Connection count value from last successful reconnect rpc */ __u32 exp_conn_cnt; /** Hash list of all ldlm locks granted on this export */ struct cfs_hash *exp_lock_hash; @@ -380,6 +380,23 @@ static inline bool imp_connect_lvb_type(struct obd_import *imp) return false; } +static inline __u64 exp_connect_ibits(struct obd_export *exp) +{ + struct obd_connect_data *ocd; + + ocd = &exp->exp_connect_data; + return ocd->ocd_ibits_known; +} + +static inline bool imp_connect_disp_stripe(struct obd_import *imp) +{ + struct obd_connect_data *ocd; + + LASSERT(imp != NULL); + ocd = &imp->imp_connect_data; + return ocd->ocd_connect_flags & OBD_CONNECT_DISP_STRIPE; +} + extern struct obd_export *class_conn2export(struct lustre_handle *conn); extern struct obd_device *class_conn2obd(struct lustre_handle *conn); diff --git a/drivers/staging/lustre/lustre/include/lustre_fid.h b/drivers/staging/lustre/lustre/include/lustre_fid.h index 84a897eed1df..5e7b3165a851 100644 --- a/drivers/staging/lustre/lustre/include/lustre_fid.h +++ b/drivers/staging/lustre/lustre/include/lustre_fid.h @@ -339,7 +339,7 @@ struct lu_client_seq { struct mutex lcs_mutex; /* - * Range of allowed for allocation sequeces. When using lu_client_seq on + * Range of allowed for allocation sequences. When using lu_client_seq on * clients, this contains meta-sequence range. And for servers this * contains super-sequence range. */ @@ -398,7 +398,7 @@ struct lu_server_seq { /* LUSTRE_SEQ_SERVER or LUSTRE_SEQ_CONTROLLER */ enum lu_mgr_type lss_type; - /* Client interafce to request controller */ + /* Client interface to request controller */ struct lu_client_seq *lss_cli; /* Mutex for protecting allocation */ @@ -568,14 +568,14 @@ fid_build_pdo_res_name(const struct lu_fid *fid, unsigned int hash, * finally, when we replace ost_id with FID in data stack. * * Currently, resid from the old client, whose res[0] = object_id, - * res[1] = object_seq, is just oposite with Metatdata + * res[1] = object_seq, is just opposite with Metatdata * resid, where, res[0] = fid->f_seq, res[1] = fid->f_oid. - * To unifiy the resid identification, we will reverse the data + * To unify the resid identification, we will reverse the data * resid to keep it same with Metadata resid, i.e. * * For resid from the old client, * res[0] = objid, res[1] = 0, still keep the original order, - * for compatiblity. + * for compatibility. * * For new resid * res will be built from normal FID directly, i.e. res[0] = f_seq, @@ -685,7 +685,7 @@ static inline __u32 fid_hash(const struct lu_fid *f, int bits) { /* all objects with same id and different versions will belong to same * collisions list. */ - return cfs_hash_long(fid_flatten(f), bits); + return hash_long(fid_flatten(f), bits); } /** diff --git a/drivers/staging/lustre/lustre/include/lustre_import.h b/drivers/staging/lustre/lustre/include/lustre_import.h index 67259eb43cde..01ed786b40b9 100644 --- a/drivers/staging/lustre/lustre/include/lustre_import.h +++ b/drivers/staging/lustre/lustre/include/lustre_import.h @@ -152,7 +152,7 @@ struct import_state_hist { }; /** - * Defintion of PortalRPC import structure. + * Definition of PortalRPC import structure. * Imports are representing client-side view to remote target. */ struct obd_import { @@ -180,6 +180,17 @@ struct obd_import { struct list_head imp_delayed_list; /** @} */ + /** + * List of requests that are retained for committed open replay. Once + * open is committed, open replay request will be moved from the + * imp_replay_list into the imp_committed_list. + * The imp_replay_cursor is for accelerating searching during replay. + * @{ + */ + struct list_head imp_committed_list; + struct list_head *imp_replay_cursor; + /** @} */ + /** obd device for this import */ struct obd_device *imp_obd; @@ -219,7 +230,7 @@ struct obd_import { * after a check to save on unnecessary replay list iterations */ int imp_last_generation_checked; - /** Last tranno we replayed */ + /** Last transno we replayed */ __u64 imp_last_replay_transno; /** Last transno committed on remote side */ __u64 imp_peer_committed_transno; @@ -237,7 +248,7 @@ struct obd_import { struct lustre_handle imp_remote_handle; /** When to perform next ping. time in jiffies. */ cfs_time_t imp_next_ping; - /** When we last succesfully connected. time in 64bit jiffies */ + /** When we last successfully connected. time in 64bit jiffies */ __u64 imp_last_success_conn; /** List of all possible connection for import. */ @@ -268,7 +279,7 @@ struct obd_import { imp_no_lock_replay:1, /* recovery by versions was failed */ imp_vbr_failed:1, - /* force an immidiate ping */ + /* force an immediate ping */ imp_force_verify:1, /* force a scheduled ping */ imp_force_next_verify:1, @@ -281,7 +292,7 @@ struct obd_import { /* need IR MNE swab */ imp_need_mne_swab:1, /* import must be reconnected instead of - * chouse new connection */ + * chose new connection */ imp_force_reconnect:1, /* import has tried to connect with server */ imp_connect_tried:1; diff --git a/drivers/staging/lustre/lustre/include/lustre_lib.h b/drivers/staging/lustre/lustre/include/lustre_lib.h index 609a090484a6..0368ca6ffcc1 100644 --- a/drivers/staging/lustre/lustre/include/lustre_lib.h +++ b/drivers/staging/lustre/lustre/include/lustre_lib.h @@ -536,7 +536,7 @@ do { \ if (condition) \ break; \ \ - init_waitqueue_entry_current(&__wait); \ + init_waitqueue_entry(&__wait, current); \ l_add_wait(&wq, &__wait); \ \ /* Block all signals (just the non-fatal ones if no timeout). */ \ @@ -558,15 +558,13 @@ do { \ break; \ \ if (__timeout == 0) { \ - waitq_wait(&__wait, __wstate); \ + schedule(); \ } else { \ cfs_duration_t interval = info->lwi_interval? \ min_t(cfs_duration_t, \ info->lwi_interval,__timeout):\ __timeout; \ - cfs_duration_t remaining = waitq_timedwait(&__wait,\ - __wstate, \ - interval); \ + cfs_duration_t remaining = schedule_timeout(interval);\ __timeout = cfs_time_sub(__timeout, \ cfs_time_sub(interval, remaining));\ if (__timeout == 0) { \ diff --git a/drivers/staging/lustre/lustre/include/lustre_linkea.h b/drivers/staging/lustre/lustre/include/lustre_linkea.h index 5790be913bf6..500ace30cfbf 100644 --- a/drivers/staging/lustre/lustre/include/lustre_linkea.h +++ b/drivers/staging/lustre/lustre/include/lustre_linkea.h @@ -33,7 +33,7 @@ struct linkea_data { */ struct lu_buf *ld_buf; /** - * The matched header, entry and its lenght in the EA + * The matched header, entry and its length in the EA */ struct link_ea_header *ld_leh; struct link_ea_entry *ld_lee; diff --git a/drivers/staging/lustre/lustre/include/lustre_mdc.h b/drivers/staging/lustre/lustre/include/lustre_mdc.h index c1e02702b931..468f36344a34 100644 --- a/drivers/staging/lustre/lustre/include/lustre_mdc.h +++ b/drivers/staging/lustre/lustre/include/lustre_mdc.h @@ -166,6 +166,17 @@ void it_clear_disposition(struct lookup_intent *it, int flag); void it_set_disposition(struct lookup_intent *it, int flag); int it_open_error(int phase, struct lookup_intent *it); +static inline bool cl_is_lov_delay_create(unsigned int flags) +{ + return (flags & O_LOV_DELAY_CREATE) == O_LOV_DELAY_CREATE; +} + +static inline void cl_lov_delay_create_clear(unsigned int *flags) +{ + if ((*flags & O_LOV_DELAY_CREATE) == O_LOV_DELAY_CREATE) + *flags &= ~O_LOV_DELAY_CREATE; +} + /** @} mdc */ #endif diff --git a/drivers/staging/lustre/lustre/include/lustre_net.h b/drivers/staging/lustre/lustre/include/lustre_net.h index d8d088035428..745adbb74cfc 100644 --- a/drivers/staging/lustre/lustre/include/lustre_net.h +++ b/drivers/staging/lustre/lustre/include/lustre_net.h @@ -445,7 +445,7 @@ struct ptlrpc_reply_state { lnet_handle_md_t rs_md_h; atomic_t rs_refcount; - /** Context for the sevice thread */ + /** Context for the service thread */ struct ptlrpc_svc_ctx *rs_svc_ctx; /** Reply buffer (actually sent to the client), encoded if needed */ struct lustre_msg *rs_repbuf; /* wrapper */ @@ -454,9 +454,9 @@ struct ptlrpc_reply_state { /** Size of the reply message */ int rs_repdata_len; /* wrapper msg length */ /** - * Actual reply message. Its content is encrupted (if needed) to + * Actual reply message. Its content is encrypted (if needed) to * produce reply buffer for actual sending. In simple case - * of no network encryption we jus set \a rs_repbuf to \a rs_msg + * of no network encryption we just set \a rs_repbuf to \a rs_msg */ struct lustre_msg *rs_msg; /* reply message */ @@ -497,7 +497,7 @@ struct ptlrpc_request_pool { spinlock_t prp_lock; /** list of ptlrpc_request structs */ struct list_head prp_req_list; - /** Maximum message size that would fit into a rquest from this pool */ + /** Maximum message size that would fit into a request from this pool */ int prp_rq_size; /** Function to allocate more requests for this pool */ void (*prp_populate)(struct ptlrpc_request_pool *, int); @@ -904,7 +904,7 @@ struct ptlrpc_nrs_pol_conf { */ struct module *nc_owner; /** - * Policy registration flags; a bitmast of \e nrs_policy_flags + * Policy registration flags; a bitmask of \e nrs_policy_flags */ unsigned nc_flags; }; @@ -1351,7 +1351,7 @@ struct nrs_orr_data { */ enum nrs_orr_supp od_supp; /** - * Round Robin quantum; the maxium number of RPCs that each request + * Round Robin quantum; the maximum number of RPCs that each request * batch for each object or OST can have in a scheduling round. */ __u16 od_quantum; @@ -1486,7 +1486,7 @@ struct ptlrpc_nrs_request { */ struct nrs_fifo_req fifo; /** - * CRR-N request defintion + * CRR-N request definition */ struct nrs_crrn_req crr; /** ORR and TRR share the same request definition */ @@ -1550,7 +1550,7 @@ struct ptlrpc_request { * requests in time */ struct list_head rq_timed_list; - /** server-side history, used for debuging purposes. */ + /** server-side history, used for debugging purposes. */ struct list_head rq_history_list; /** server-side per-export list */ struct list_head rq_exp_list; @@ -1611,7 +1611,7 @@ struct ptlrpc_request { enum rq_phase rq_phase; /* one of RQ_PHASE_* */ enum rq_phase rq_next_phase; /* one of RQ_PHASE_* to be used next */ atomic_t rq_refcount;/* client-side refcount for SENT race, - server-side refcounf for multiple replies */ + server-side refcount for multiple replies */ /** Portal to which this request would be sent */ short rq_request_portal; /* XXX FIXME bug 249 */ @@ -1637,7 +1637,7 @@ struct ptlrpc_request { /** xid */ __u64 rq_xid; /** - * List item to for replay list. Not yet commited requests get linked + * List item to for replay list. Not yet committed requests get linked * there. * Also see \a rq_replay comment above. */ @@ -1952,7 +1952,7 @@ void _debug_req(struct ptlrpc_request *req, __attribute__ ((format (printf, 3, 4))); /** - * Helper that decides if we need to print request accordig to current debug + * Helper that decides if we need to print request according to current debug * level settings */ #define debug_req(msgdata, mask, cdls, req, fmt, a...) \ @@ -1966,7 +1966,7 @@ do { \ } while(0) /** - * This is the debug print function you need to use to print request sturucture + * This is the debug print function you need to use to print request structure * content into lustre debug log. * for most callers (level is a constant) this is resolved at compile time */ #define DEBUG_REQ(level, req, fmt, args...) \ @@ -2621,6 +2621,8 @@ int ptlrpc_register_rqbd(struct ptlrpc_request_buffer_desc *rqbd); * request queues, request management, etc. * @{ */ +void ptlrpc_request_committed(struct ptlrpc_request *req, int force); + void ptlrpc_init_client(int req_portal, int rep_portal, char *name, struct ptlrpc_client *); void ptlrpc_cleanup_client(struct obd_import *imp); diff --git a/drivers/staging/lustre/lustre/include/lustre_quota.h b/drivers/staging/lustre/lustre/include/lustre_quota.h index 71b5d97e0343..07cb7c310bcc 100644 --- a/drivers/staging/lustre/lustre/include/lustre_quota.h +++ b/drivers/staging/lustre/lustre/include/lustre_quota.h @@ -140,7 +140,7 @@ struct qsd_instance; * (i.e. when ->ldo_recovery_complete is called). This is used * to notify the qsd layer that quota should now be enforced * again via the qsd_op_begin/end functions. The last step of the - * reintegration prodecure (namely usage reconciliation) will be + * reintegration procedure (namely usage reconciliation) will be * completed during start. * * - qsd_fini(): is used to release a qsd_instance structure allocated with diff --git a/drivers/staging/lustre/lustre/include/lustre_sec.h b/drivers/staging/lustre/lustre/include/lustre_sec.h index 885247d28b3a..bf3ee3915c28 100644 --- a/drivers/staging/lustre/lustre/include/lustre_sec.h +++ b/drivers/staging/lustre/lustre/include/lustre_sec.h @@ -572,7 +572,7 @@ struct ptlrpc_sec_cops { /** * Called then the reference of \a ctx dropped to 0. The policy module * is supposed to destroy this context or whatever else according to - * its cache maintainance mechamism. + * its cache maintenance mechanism. * * \param sync if zero, we shouldn't wait for the context being * destroyed completely. @@ -1002,7 +1002,7 @@ struct ptlrpc_sec *sptlrpc_sec_get(struct ptlrpc_sec *sec); void sptlrpc_sec_put(struct ptlrpc_sec *sec); /* - * internal apis which only used by policy impelentation + * internal apis which only used by policy implementation */ int sptlrpc_get_next_secid(void); void sptlrpc_sec_destroy(struct ptlrpc_sec *sec); diff --git a/drivers/staging/lustre/lustre/include/md_object.h b/drivers/staging/lustre/lustre/include/md_object.h index 7b45b47b48f9..ef46b2c461a6 100644 --- a/drivers/staging/lustre/lustre/include/md_object.h +++ b/drivers/staging/lustre/lustre/include/md_object.h @@ -35,7 +35,7 @@ * * lustre/include/md_object.h * - * Extention of lu_object.h for metadata objects + * Extension of lu_object.h for metadata objects */ #ifndef _LUSTRE_MD_OBJECT_H diff --git a/drivers/staging/lustre/lustre/include/obd.h b/drivers/staging/lustre/lustre/include/obd.h index c3470ce62cff..72cf3fe4b0c9 100644 --- a/drivers/staging/lustre/lustre/include/obd.h +++ b/drivers/staging/lustre/lustre/include/obd.h @@ -158,7 +158,7 @@ struct obd_info { /* statfs data specific for every OSC, if needed at all. */ struct obd_statfs *oi_osfs; /* An update callback which is called to update some data on upper - * level. E.g. it is used for update lsm->lsm_oinfo at every recieved + * level. E.g. it is used for update lsm->lsm_oinfo at every received * request in osc level for enqueue requests. It is also possible to * update some caller data from LOV layer if needed. */ obd_enqueue_update_f oi_cb_up; @@ -1042,8 +1042,8 @@ static inline int it_to_lock_mode(struct lookup_intent *it) } struct md_op_data { - struct lu_fid op_fid1; /* operation fid1 (usualy parent) */ - struct lu_fid op_fid2; /* operation fid2 (usualy child) */ + struct lu_fid op_fid1; /* operation fid1 (usually parent) */ + struct lu_fid op_fid2; /* operation fid2 (usually child) */ struct lu_fid op_fid3; /* 2 extra fids to find conflicting */ struct lu_fid op_fid4; /* to the operation locks. */ mdsno_t op_mds; /* what mds server open will go to */ @@ -1323,7 +1323,8 @@ struct md_open_data { struct obd_client_handle *mod_och; struct ptlrpc_request *mod_open_req; struct ptlrpc_request *mod_close_req; - atomic_t mod_refcount; + atomic_t mod_refcount; + bool mod_is_create; }; struct lookup_intent; @@ -1392,7 +1393,7 @@ struct md_ops { int (*m_set_open_replay_data)(struct obd_export *, struct obd_client_handle *, - struct ptlrpc_request *); + struct lookup_intent *); int (*m_clear_open_replay_data)(struct obd_export *, struct obd_client_handle *); int (*m_set_lock_data)(struct obd_export *, __u64 *, void *, __u64 *); diff --git a/drivers/staging/lustre/lustre/include/obd_class.h b/drivers/staging/lustre/lustre/include/obd_class.h index 983718fe1e55..9d1f266e55e4 100644 --- a/drivers/staging/lustre/lustre/include/obd_class.h +++ b/drivers/staging/lustre/lustre/include/obd_class.h @@ -175,9 +175,13 @@ enum { CONFIG_T_CONFIG = 0, CONFIG_T_SPTLRPC = 1, CONFIG_T_RECOVER = 2, - CONFIG_T_MAX = 3 + CONFIG_T_PARAMS = 3, + CONFIG_T_MAX = 4 }; +#define PARAMS_FILENAME "params" +#define LCTL_UPCALL "lctl" + /* list of active configuration logs */ struct config_llog_data { struct ldlm_res_id cld_resid; @@ -185,7 +189,8 @@ struct config_llog_data { struct list_head cld_list_chain; atomic_t cld_refcount; struct config_llog_data *cld_sptlrpc;/* depended sptlrpc log */ - struct config_llog_data *cld_recover; /* imperative recover log */ + struct config_llog_data *cld_params; /* common parameters log */ + struct config_llog_data *cld_recover;/* imperative recover log */ struct obd_export *cld_mgcexp; struct mutex cld_lock; int cld_type; @@ -1626,7 +1631,7 @@ static inline int obd_health_check(const struct lu_env *env, { /* returns: 0 on healthy * >0 on unhealthy + reason code/flag - * however the only suppored reason == 1 right now + * however the only supported reason == 1 right now * We'll need to define some better reasons * or flags in the future. * <0 on error @@ -1996,11 +2001,11 @@ static inline int md_getxattr(struct obd_export *exp, static inline int md_set_open_replay_data(struct obd_export *exp, struct obd_client_handle *och, - struct ptlrpc_request *open_req) + struct lookup_intent *it) { EXP_CHECK_MD_OP(exp, set_open_replay_data); EXP_MD_COUNTER_INCREMENT(exp, set_open_replay_data); - return MDP(exp->exp_obd, set_open_replay_data)(exp, och, open_req); + return MDP(exp->exp_obd, set_open_replay_data)(exp, och, it); } static inline int md_clear_open_replay_data(struct obd_export *exp, diff --git a/drivers/staging/lustre/lustre/include/obd_support.h b/drivers/staging/lustre/lustre/include/obd_support.h index 977bc231df9d..5ec336968fc8 100644 --- a/drivers/staging/lustre/lustre/include/obd_support.h +++ b/drivers/staging/lustre/lustre/include/obd_support.h @@ -681,7 +681,7 @@ do { \ * * Be very careful when changing this value, especially when decreasing it, * since vmalloc in Linux doesn't perform well on multi-cores system, calling - * vmalloc in critical path would hurt peformance badly. See LU-66. + * vmalloc in critical path would hurt performance badly. See LU-66. */ #define OBD_ALLOC_BIG (4 * PAGE_CACHE_SIZE) |