* 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.
*/
/*
#ifndef _LUSTRE_QUOTA_H
#define _LUSTRE_QUOTA_H
+/** \defgroup quota quota
+ *
+ * @{
+ */
+
#if defined(__linux__)
#include <linux/lustre_quota.h>
#elif defined(__APPLE__)
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 */
struct lustre_dquot {
/** Hash list in memory, protect by dquot_hash_lock */
- struct list_head dq_hash;
+ cfs_list_t dq_hash;
/** Protect the data in lustre_dquot */
- struct semaphore dq_sem;
+ 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 */
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 */
};
struct dquot_id {
- struct list_head di_link;
+ cfs_list_t di_link;
__u32 di_id;
__u32 di_flag;
};
int lustre_commit_dquot(struct lustre_dquot *dquot);
int lustre_init_quota_info(struct lustre_quota_info *lqi, int type);
int lustre_get_qids(struct file *file, struct inode *inode, int type,
- struct list_head *list);
+ cfs_list_t *list);
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 */
* 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
*/
int lqc_sync_blk;
/** guard lqc_imp_valid now */
- spinlock_t lqc_lock;
+ cfs_spinlock_t lqc_lock;
/**
* when mds isn't connected, threads
* on osts who send the quota reqs
/** lquota statistics */
struct lprocfs_stats *lqc_stats;
/** the number of used hashed lqs */
- atomic_t lqc_lqs;
+ cfs_atomic_t lqc_lqs;
/** no lqs are in use */
cfs_waitq_t lqc_lqs_waitq;
};
#define QUOTA_MASTER_UNREADY(qctxt) (qctxt)->lqc_setup = 0
struct lustre_qunit_size {
- struct hlist_node lqs_hash; /** the hash entry */
+ cfs_hlist_node_t lqs_hash; /** the hash entry */
unsigned int lqs_id; /** id of user/group */
unsigned long lqs_flags; /** 31st bit is QB_SET, 30th bit is QI_SET
* other bits are same as LQUOTA_FLAGS_*
long long lqs_ino_rec;
/** when blocks are allocated/released, this value will record it */
long long lqs_blk_rec;
- atomic_t lqs_refcount;
+ cfs_atomic_t lqs_refcount;
cfs_time_t lqs_last_bshrink; /** time of last block shrink */
cfs_time_t lqs_last_ishrink; /** time of last inode shrink */
- spinlock_t lqs_lock;
+ cfs_spinlock_t lqs_lock;
unsigned long long lqs_key; /** hash key */
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,
#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 = atomic_inc_return(&lqs->lqs_refcount);
+ int count = cfs_atomic_inc_return(&lqs->lqs_refcount);
- if (count == 2) /* quota_create_lqs */
- 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(atomic_read(&lqs->lqs_refcount) > 0);
+ LASSERT(count > 0);
+ CDEBUG(D_INFO, "lqs=%p refcount %d\n", lqs, count - 1);
- if (atomic_dec_return(&lqs->lqs_refcount) == 1)
- if (atomic_dec_and_test(&lqs->lqs_ctxt->lqc_lqs))
+ 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, 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)
-{
- atomic_set(&lqs->lqs_refcount, 0);
+ OBD_FREE_PTR(lqs);
+ }
}
#else
#else
-#define LL_DQUOT_OFF(sb, remount) do {} while(0)
+#define LL_DQUOT_OFF(sb) do {} while(0)
struct lustre_quota_info {
};
struct obd_device *qta_obd; /** obd device */
struct obd_quotactl qta_oqctl; /** obd_quotactl args */
struct super_block *qta_sb; /** obd super block */
- struct semaphore *qta_sem; /** obt_quotachecking */
+ cfs_semaphore_t *qta_sem; /** obt_quotachecking */
};
struct obd_trans_info;
*/
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;
"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 <linux/types.h>
+#include <linux/quota.h>
+
+#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 */