spin_unlock_irqrestore(&cnt->lock, flags);
 }
 
+static inline void res_counter_reset_failcnt(struct res_counter *cnt)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&cnt->lock, flags);
+       cnt->failcnt = 0;
+       spin_unlock_irqrestore(&cnt->lock, flags);
+}
 #endif
 
                                mem_cgroup_write_strategy);
 }
 
-static int mem_cgroup_max_reset(struct cgroup *cont, unsigned int event)
+static int mem_cgroup_reset(struct cgroup *cont, unsigned int event)
 {
        struct mem_cgroup *mem;
 
        mem = mem_cgroup_from_cont(cont);
-       res_counter_reset_max(&mem->res);
+       switch (event) {
+       case RES_MAX_USAGE:
+               res_counter_reset_max(&mem->res);
+               break;
+       case RES_FAILCNT:
+               res_counter_reset_failcnt(&mem->res);
+               break;
+       }
        return 0;
 }
 
        {
                .name = "max_usage_in_bytes",
                .private = RES_MAX_USAGE,
-               .trigger = mem_cgroup_max_reset,
+               .trigger = mem_cgroup_reset,
                .read_u64 = mem_cgroup_read,
        },
        {
        {
                .name = "failcnt",
                .private = RES_FAILCNT,
+               .trigger = mem_cgroup_reset,
                .read_u64 = mem_cgroup_read,
        },
        {