quota: Convert quota statistics to generic percpu_counter
[pandora-kernel.git] / include / linux / quota.h
index a6861f1..94c1f03 100644 (file)
@@ -174,6 +174,7 @@ enum {
 #include <linux/rwsem.h>
 #include <linux/spinlock.h>
 #include <linux/wait.h>
+#include <linux/percpu_counter.h>
 
 #include <linux/dqblk_xfs.h>
 #include <linux/dqblk_v1.h>
@@ -238,19 +239,36 @@ static inline int info_dirty(struct mem_dqinfo *info)
        return test_bit(DQF_INFO_DIRTY_B, &info->dqi_flags);
 }
 
+enum {
+       DQST_LOOKUPS,
+       DQST_DROPS,
+       DQST_READS,
+       DQST_WRITES,
+       DQST_CACHE_HITS,
+       DQST_ALLOC_DQUOTS,
+       DQST_FREE_DQUOTS,
+       DQST_SYNCS,
+       _DQST_DQSTAT_LAST
+};
+
 struct dqstats {
-       int lookups;
-       int drops;
-       int reads;
-       int writes;
-       int cache_hits;
-       int allocated_dquots;
-       int free_dquots;
-       int syncs;
+       int stat[_DQST_DQSTAT_LAST];
+       struct percpu_counter counter[_DQST_DQSTAT_LAST];
 };
 
+extern struct dqstats *dqstats_pcpu;
 extern struct dqstats dqstats;
 
+static inline void dqstats_inc(unsigned int type)
+{
+       percpu_counter_inc(&dqstats.counter[type]);
+}
+
+static inline void dqstats_dec(unsigned int type)
+{
+       percpu_counter_dec(&dqstats.counter[type]);
+}
+
 #define DQ_MOD_B       0       /* dquot modified since read */
 #define DQ_BLKS_B      1       /* uid/gid has been warned about blk limit */
 #define DQ_INODES_B    2       /* uid/gid has been warned about inode limit */
@@ -279,9 +297,6 @@ struct dquot {
        struct mem_dqblk dq_dqb;        /* Diskquota usage */
 };
 
-#define QUOTA_OK          0
-#define NO_QUOTA          1
-
 /* Operations which must be implemented by each quota format */
 struct quota_format_ops {
        int (*check_quota_file)(struct super_block *sb, int type);      /* Detect whether file is in our format */
@@ -295,13 +310,6 @@ struct quota_format_ops {
 
 /* Operations working with dquots */
 struct dquot_operations {
-       int (*initialize) (struct inode *, int);
-       int (*drop) (struct inode *);
-       int (*alloc_space) (struct inode *, qsize_t, int);
-       int (*alloc_inode) (const struct inode *, qsize_t);
-       int (*free_space) (struct inode *, qsize_t);
-       int (*free_inode) (const struct inode *, qsize_t);
-       int (*transfer) (struct inode *, struct iattr *);
        int (*write_dquot) (struct dquot *);            /* Ordinary dquot write */
        struct dquot *(*alloc_dquot)(struct super_block *, int);        /* Allocate memory for new dquot */
        void (*destroy_dquot)(struct dquot *);          /* Free memory for dquot */
@@ -309,12 +317,6 @@ struct dquot_operations {
        int (*release_dquot) (struct dquot *);          /* Quota is going to be deleted from disk */
        int (*mark_dirty) (struct dquot *);             /* Dquot is marked dirty */
        int (*write_info) (struct super_block *, int);  /* Write of quota "superblock" */
-       /* reserve quota for delayed block allocation */
-       int (*reserve_space) (struct inode *, qsize_t, int);
-       /* claim reserved quota for delayed alloc */
-       int (*claim_space) (struct inode *, qsize_t);
-       /* release rsved quota for delayed alloc */
-       void (*release_rsv) (struct inode *, qsize_t);
        /* get reserved quota for delayed alloc, value returned is managed by
         * quota code only */
        qsize_t *(*get_reserved_space) (struct inode *);
@@ -322,17 +324,15 @@ struct dquot_operations {
 
 /* Operations handling requests from userspace */
 struct quotactl_ops {
-       int (*quota_on)(struct super_block *, int, int, char *, int);
-       int (*quota_off)(struct super_block *, int, int);
-       int (*quota_sync)(struct super_block *, int);
+       int (*quota_on)(struct super_block *, int, int, char *);
+       int (*quota_off)(struct super_block *, int);
+       int (*quota_sync)(struct super_block *, int, int);
        int (*get_info)(struct super_block *, int, struct if_dqinfo *);
        int (*set_info)(struct super_block *, int, struct if_dqinfo *);
-       int (*get_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *);
-       int (*set_dqblk)(struct super_block *, int, qid_t, struct if_dqblk *);
+       int (*get_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *);
+       int (*set_dqblk)(struct super_block *, int, qid_t, struct fs_disk_quota *);
        int (*get_xstate)(struct super_block *, struct fs_quota_stat *);
        int (*set_xstate)(struct super_block *, unsigned int, int);
-       int (*get_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *);
-       int (*set_xquota)(struct super_block *, int, qid_t, struct fs_disk_quota *);
 };
 
 struct quota_format_type {
@@ -357,26 +357,25 @@ enum {
 #define DQUOT_STATE_FLAGS      (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \
                                 DQUOT_SUSPENDED)
 /* Other quota flags */
-#define DQUOT_QUOTA_SYS_FILE   (1 << 6)        /* Quota file is a special
+#define DQUOT_STATE_LAST       (_DQUOT_STATE_FLAGS * MAXQUOTAS)
+#define DQUOT_QUOTA_SYS_FILE   (1 << DQUOT_STATE_LAST)
+                                               /* Quota file is a special
                                                 * system file and user cannot
                                                 * touch it. Filesystem is
                                                 * responsible for setting
                                                 * S_NOQUOTA, S_NOATIME flags
                                                 */
-#define DQUOT_NEGATIVE_USAGE   (1 << 7)        /* Allow negative quota usage */
+#define DQUOT_NEGATIVE_USAGE   (1 << (DQUOT_STATE_LAST + 1))
+                                              /* Allow negative quota usage */
 
 static inline unsigned int dquot_state_flag(unsigned int flags, int type)
 {
-       if (type == USRQUOTA)
-               return flags;
-       return flags << _DQUOT_STATE_FLAGS;
+       return flags << _DQUOT_STATE_FLAGS * type;
 }
 
 static inline unsigned int dquot_generic_flag(unsigned int flags, int type)
 {
-       if (type == USRQUOTA)
-               return flags;
-       return flags >> _DQUOT_STATE_FLAGS;
+       return (flags >> _DQUOT_STATE_FLAGS * type) & DQUOT_STATE_FLAGS;
 }
 
 #ifdef CONFIG_QUOTA_NETLINK_INTERFACE