X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_quota.h;h=c1941d767aa3e1d2ffa6d14e57ca3c8a2ce205cd;hb=926a2b92a401190e7aa49ed17311fbcde929a6ee;hp=a271ebfe7a1d06d70f291db2a99caa0baa942a28;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_quota.h b/lustre/include/lustre_quota.h index a271ebf..c1941d7 100644 --- a/lustre/include/lustre_quota.h +++ b/lustre/include/lustre_quota.h @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -37,6 +37,11 @@ #ifndef _LUSTRE_QUOTA_H #define _LUSTRE_QUOTA_H +/** \defgroup quota quota + * + * @{ + */ + #if defined(__linux__) #include #elif defined(__APPLE__) @@ -157,10 +162,6 @@ struct lustre_quota_info { lustre_quota_version_t qi_version; }; -#define DQ_STATUS_AVAIL 0x0 /* Available dquot */ -#define DQ_STATUS_SET 0x01 /* Sombody is setting dquot */ -#define DQ_STATUS_RECOVERY 0x02 /* dquot is in recovery */ - struct lustre_mem_dqblk { __u64 dqb_bhardlimit; /**< absolute limit on disk blks alloc */ __u64 dqb_bsoftlimit; /**< preferred limit on disk blks */ @@ -178,7 +179,7 @@ struct lustre_dquot { /** Protect the data in lustre_dquot */ cfs_semaphore_t dq_sem; /** Use count */ - int dq_refcnt; + cfs_atomic_t dq_refcnt; /** Pointer of quota info it belongs to */ struct lustre_quota_info *dq_info; /** Offset of dquot on disk */ @@ -187,8 +188,6 @@ struct lustre_dquot { unsigned int dq_id; /** Type fo quota (USRQUOTA, GRPQUOUTA) */ int dq_type; - /** See DQ_STATUS_ */ - unsigned short dq_status; /** See DQ_ in quota.h */ unsigned long dq_flags; /** Diskquota usage */ @@ -227,17 +226,6 @@ int lustre_quota_convert(struct lustre_quota_info *lqi, int type); typedef int (*dqacq_handler_t) (struct obd_device * obd, struct qunit_data * qd, int opc); -/* -#ifdef HAVE_VFS_DQ_OFF -#define LL_DQUOT_OFF(sb, remount) vfs_dq_off(sb, remount) -#else -#define LL_DQUOT_OFF(sb, remount) DQUOT_OFF(sb) -#endif -*/ - -#define LL_DQUOT_OFF(sb) DQUOT_OFF(sb) - - /* user quota is turned on on filter */ #define LQC_USRQUOTA_FLAG (1 << 0) /* group quota is turned on on filter */ @@ -264,16 +252,12 @@ struct lustre_quota_ctxt { * 0:Off, 1:On */ lqc_valid:1, /** this qctxt is valid or not */ - lqc_setup:1, /** + lqc_setup:1; /** * tell whether of not quota_type has * been processed, so that the master * knows when it can start processing * incoming acq/rel quota requests */ - lqc_immutable:1; /** - * cannot be turned on/off on-fly; - * temporary used by SOM. - */ /** }@ */ /** * original unit size of file quota and @@ -380,13 +364,20 @@ struct lustre_qunit_size { struct lustre_quota_ctxt *lqs_ctxt; /** quota ctxt */ }; -#define LQS_IS_GRP(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_GRP) -#define LQS_IS_ADJBLK(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_ADJBLK) -#define LQS_IS_ADJINO(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_ADJINO) +#define LQS_IS_GRP(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_GRP) +#define LQS_IS_ADJBLK(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_ADJBLK) +#define LQS_IS_ADJINO(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_ADJINO) +#define LQS_IS_RECOVERY(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_RECOVERY) +#define LQS_IS_SETQUOTA(lqs) ((lqs)->lqs_flags & LQUOTA_FLAGS_SETQUOTA) + +#define LQS_SET_GRP(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_GRP) +#define LQS_SET_ADJBLK(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_ADJBLK) +#define LQS_SET_ADJINO(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_ADJINO) +#define LQS_SET_RECOVERY(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_RECOVERY) +#define LQS_SET_SETQUOTA(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_SETQUOTA) -#define LQS_SET_GRP(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_GRP) -#define LQS_SET_ADJBLK(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_ADJBLK) -#define LQS_SET_ADJINO(lqs) ((lqs)->lqs_flags |= LQUOTA_FLAGS_ADJINO) +#define LQS_CLEAR_RECOVERY(lqs) ((lqs)->lqs_flags &= ~LQUOTA_FLAGS_RECOVERY) +#define LQS_CLEAR_SETQUOTA(lqs) ((lqs)->lqs_flags &= ~LQUOTA_FLAGS_SETQUOTA) /* In the hash for lustre_qunit_size, the key is decided by * grp_or_usr and uid/gid, in here, I combine these two values, @@ -395,39 +386,25 @@ struct lustre_qunit_size { #define LQS_KEY_ID(key) (key & 0xffffffff) #define LQS_KEY_GRP(key) (key >> 32) -static inline void __lqs_getref(struct lustre_qunit_size *lqs) +static inline void lqs_getref(struct lustre_qunit_size *lqs) { int count = cfs_atomic_inc_return(&lqs->lqs_refcount); - if (count == 2) /* quota_create_lqs */ - cfs_atomic_inc(&lqs->lqs_ctxt->lqc_lqs); CDEBUG(D_INFO, "lqs=%p refcount %d\n", lqs, count); } -static inline void lqs_getref(struct lustre_qunit_size *lqs) +static inline void lqs_putref(struct lustre_qunit_size *lqs) { - __lqs_getref(lqs); -} + int count = cfs_atomic_read(&lqs->lqs_refcount); -static inline void __lqs_putref(struct lustre_qunit_size *lqs) -{ - LASSERT(cfs_atomic_read(&lqs->lqs_refcount) > 0); + LASSERT(count > 0); + CDEBUG(D_INFO, "lqs=%p refcount %d\n", lqs, count - 1); - if (cfs_atomic_dec_return(&lqs->lqs_refcount) == 1) + if (cfs_atomic_dec_and_test(&lqs->lqs_refcount)) { if (cfs_atomic_dec_and_test(&lqs->lqs_ctxt->lqc_lqs)) cfs_waitq_signal(&lqs->lqs_ctxt->lqc_lqs_waitq); - CDEBUG(D_INFO, "lqs=%p refcount %d\n", - lqs, cfs_atomic_read(&lqs->lqs_refcount)); -} - -static inline void lqs_putref(struct lustre_qunit_size *lqs) -{ - __lqs_putref(lqs); -} - -static inline void lqs_initref(struct lustre_qunit_size *lqs) -{ - cfs_atomic_set(&lqs->lqs_refcount, 0); + OBD_FREE_PTR(lqs); + } } #else @@ -445,7 +422,7 @@ struct lustre_quota_ctxt { #else -#define LL_DQUOT_OFF(sb, remount) do {} while(0) +#define LL_DQUOT_OFF(sb) do {} while(0) struct lustre_quota_info { }; @@ -558,7 +535,8 @@ typedef struct { */ int (*quota_adjust_qunit) (struct obd_export *exp, struct quota_adjust_qunit *oqaq, - struct lustre_quota_ctxt *qctxt); + struct lustre_quota_ctxt *qctxt, + struct ptlrpc_request_set *rqset); } quota_interface_t; @@ -819,4 +797,48 @@ extern quota_interface_t lmv_quota_interface; "admin_quotafile_v2.grp" /** group admin quotafile */\ } +/* + * Definitions of structures for vfsv0 quota format + * Source linux/fs/quota/quotaio_v2.h + * + * The following definitions are normally found in private kernel headers. + * However, some sites build Lustre against kernel development headers rather + * than than full kernel source, so we provide them here for compatibility. + */ +#ifdef __KERNEL__ +# if !defined(HAVE_QUOTAIO_H) && !defined(HAVE_FS_QUOTA_QUOTAIO_H) && \ + !defined(HAVE_FS_QUOTAIO_H) + +#include +#include + +#define V2_INITQMAGICS {\ + 0xd9c01f11, /* USRQUOTA */\ + 0xd9c01927 /* GRPQUOTA */\ +} + +/* Header with type and version specific information */ +struct v2_disk_dqinfo { + __le32 dqi_bgrace; /* Time before block soft limit becomes hard limit */ + __le32 dqi_igrace; /* Time before inode soft limit becomes hard limit */ + __le32 dqi_flags; /* Flags for quotafile (DQF_*) */ + __le32 dqi_blocks; /* Number of blocks in file */ + __le32 dqi_free_blk; /* Number of first free block in the list */ + __le32 dqi_free_entry; /* Number of block with at least one free entry */ +}; + +/* First generic header */ +struct v2_disk_dqheader { + __le32 dqh_magic; /* Magic number identifying file */ + __le32 dqh_version; /* File version */ +}; +#define V2_DQINFOOFF sizeof(struct v2_disk_dqheader) /* Offset of info header in file */ +#define QT_TREEOFF 1 /* Offset of tree in file in blocks */ +#define V2_DQTREEOFF QT_TREEOFF + +# endif /* !defined(HAVE_QUOTAIO_V1_H) ... */ +#endif /* __KERNEL__ */ + +/** @} quota */ + #endif /* _LUSTRE_QUOTA_H */