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 */
#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
"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 */