coda: convert from atomic_t to refcount_t on coda_vm_ops->refcnt
authorXiyu Yang <xiyuyang19@fudan.edu.cn>
Tue, 9 Nov 2021 02:34:48 +0000 (18:34 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Nov 2021 18:02:51 +0000 (10:02 -0800)
refcount_t type and corresponding API can protect refcounters from
accidental underflow and overflow and further use-after-free situations.

Link: https://lkml.kernel.org/r/20210908140308.18491-8-jaharkes@cs.cmu.edu
Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
Signed-off-by: Jan Harkes <jaharkes@cs.cmu.edu>
Cc: Alex Shi <alex.shi@linux.alibaba.com>
Cc: Jing Yangyang <jing.yangyang@zte.com.cn>
Cc: Zeal Robot <zealci@zte.com.cn>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/coda/file.c

index 52deab7..29dd87b 100644 (file)
@@ -8,6 +8,7 @@
  * to the Coda project. Contact Peter Braam <coda@cs.cmu.edu>.
  */
 
+#include <linux/refcount.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/time.h>
@@ -28,7 +29,7 @@
 #include "coda_int.h"
 
 struct coda_vm_ops {
-       atomic_t refcnt;
+       refcount_t refcnt;
        struct file *coda_file;
        const struct vm_operations_struct *host_vm_ops;
        struct vm_operations_struct vm_ops;
@@ -98,7 +99,7 @@ coda_vm_open(struct vm_area_struct *vma)
        struct coda_vm_ops *cvm_ops =
                container_of(vma->vm_ops, struct coda_vm_ops, vm_ops);
 
-       atomic_inc(&cvm_ops->refcnt);
+       refcount_inc(&cvm_ops->refcnt);
 
        if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->open)
                cvm_ops->host_vm_ops->open(vma);
@@ -113,7 +114,7 @@ coda_vm_close(struct vm_area_struct *vma)
        if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->close)
                cvm_ops->host_vm_ops->close(vma);
 
-       if (atomic_dec_and_test(&cvm_ops->refcnt)) {
+       if (refcount_dec_and_test(&cvm_ops->refcnt)) {
                vma->vm_ops = cvm_ops->host_vm_ops;
                fput(cvm_ops->coda_file);
                kfree(cvm_ops);
@@ -189,7 +190,7 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)
                cvm_ops->vm_ops.open = coda_vm_open;
                cvm_ops->vm_ops.close = coda_vm_close;
                cvm_ops->coda_file = coda_file;
-               atomic_set(&cvm_ops->refcnt, 1);
+               refcount_set(&cvm_ops->refcnt, 1);
 
                vma->vm_ops = &cvm_ops->vm_ops;
        }