#include <lustre/lustre_idl.h>
#include <lvfs.h>
#include <obd_support.h>
-#include <class_hash.h>
struct obd_device;
struct client_obd;
#define NR_DQHASH 45
#endif
+#ifndef QUOTABLOCK_BITS
+#define QUOTABLOCK_BITS 10
+#endif
+
+#ifndef QUOTABLOCK_SIZE
+#define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
+#endif
+
+#ifndef toqb
+#define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS)
+#endif
+
#ifdef HAVE_QUOTA_SUPPORT
+#ifndef MAX_IQ_TIME
+#define MAX_IQ_TIME 604800 /* (7*24*60*60) 1 week */
+#endif
+
+#ifndef MAX_DQ_TIME
+#define MAX_DQ_TIME 604800 /* (7*24*60*60) 1 week */
+#endif
+
#ifdef __KERNEL__
#ifdef LPROCFS
struct list_head *list);
int lustre_quota_convert(struct lustre_quota_info *lqi, int type);
-#define LL_DQUOT_OFF(sb) DQUOT_OFF(sb)
-
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 */
/** See comment of lqc_itune_sz */
unsigned long lqc_btune_sz;
/** all lustre_qunit_size structures */
- struct lustre_hash *lqc_lqs_hash;
+ cfs_hash_t *lqc_lqs_hash;
/** @{ */
/**
if (count == 2) /* quota_create_lqs */
atomic_inc(&lqs->lqs_ctxt->lqc_lqs);
- CDEBUG(D_QUOTA, "lqs=%p refcount %d\n", lqs, count);
+ CDEBUG(D_INFO, "lqs=%p refcount %d\n", lqs, count);
}
static inline void lqs_getref(struct lustre_qunit_size *lqs)
__lqs_getref(lqs);
}
-static inline void __lqs_putref(struct lustre_qunit_size *lqs, int del)
+static inline void __lqs_putref(struct lustre_qunit_size *lqs)
{
- int count = atomic_read(&lqs->lqs_refcount);
-
- LASSERT(count > 0);
- if (count == 1) {
- CDEBUG(D_QUOTA, "lqs=%p refcount to be 0\n", lqs);
- if (del) {
- /* killing last ref, let's let hash table kill it */
- lustre_hash_del(lqs->lqs_ctxt->lqc_lqs_hash,
- &lqs->lqs_key, &lqs->lqs_hash);
- OBD_FREE_PTR(lqs);
- } else {
- atomic_dec(&lqs->lqs_refcount);
- }
- } else {
- count = atomic_dec_return(&lqs->lqs_refcount);
- if (count == 1)
- if (atomic_dec_and_test(&lqs->lqs_ctxt->lqc_lqs))
- cfs_waitq_signal(&lqs->lqs_ctxt->lqc_lqs_waitq);
- CDEBUG(D_QUOTA, "lqs=%p refcount %d\n", lqs, count);
- }
+ LASSERT(atomic_read(&lqs->lqs_refcount) > 0);
+
+ if (atomic_dec_return(&lqs->lqs_refcount) == 1)
+ if (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, 1);
+ __lqs_putref(lqs);
}
static inline void lqs_initref(struct lustre_qunit_size *lqs)
#else
-#define LL_DQUOT_OFF(sb) do {} while(0)
+#define LL_DQUOT_OFF(sb, remount) do {} while(0)
struct lustre_quota_info {
};
* can finish a block_write or inode_create rpc. It updates the pending
* record of block and inode, acquires quota if necessary
*/
- int (*quota_chkquota) (struct obd_device *, const unsigned int [],
- int [], int, quota_acquire,
- struct obd_trans_info *, int, struct inode *,
- int);
+ int (*quota_chkquota) (struct obd_device *, struct obd_export *,
+ const unsigned int [], int [],
+ int, quota_acquire, struct obd_trans_info *,
+ int, struct inode *, int);
/**
* For quota client, the actions after the pending write is committed
#ifdef __KERNEL__
static inline int lquota_chkquota(quota_interface_t *interface,
struct obd_device *obd,
+ struct obd_export *exp,
const unsigned int id[], int pending[],
int count, struct obd_trans_info *oti,
int isblk, void *data, int frags)
QUOTA_CHECK_OP(interface, chkquota);
QUOTA_CHECK_OP(interface, acquire);
- rc = QUOTA_OP(interface, chkquota)(obd, id, pending, count,
+ rc = QUOTA_OP(interface, chkquota)(obd, exp, id, pending, count,
QUOTA_OP(interface, acquire), oti,
isblk, (struct inode *)data, frags);
RETURN(rc);