tree:   https://github.com/martinbrandenburg/linux pagecache-revert
head:   b92a2f97a9eb0f1f3998178afaac58b5277533ec
commit: f1d070e01461ea58999b8ac93156b0d1bf5d69a9 [17/18] orangefs: write range 
tracking

New smatch warnings:
fs/orangefs/inode.c:148 orangefs_write_begin() warn: possible memory leak of 
'wr'

Old smatch warnings:
fs/orangefs/inode.c:161 orangefs_write_begin() warn: possible memory leak of 
'wr'
fs/orangefs/inode.c:179 orangefs_write_begin() warn: possible memory leak of 
'wr'

# 
https://github.com/martinbrandenburg/linux/commit/f1d070e01461ea58999b8ac93156b0d1bf5d69a9
git remote add martinbrandenburg https://github.com/martinbrandenburg/linux
git remote update martinbrandenburg
git checkout f1d070e01461ea58999b8ac93156b0d1bf5d69a9
vim +/wr +148 fs/orangefs/inode.c

f1d070e0 Martin Brandenburg 2018-12-14  116  
f1d070e0 Martin Brandenburg 2018-12-14  117  int orangefs_write_begin(struct 
file *file, struct address_space *mapping,
f1d070e0 Martin Brandenburg 2018-12-14  118      loff_t pos, unsigned len, 
unsigned flags, struct page **pagep,
f1d070e0 Martin Brandenburg 2018-12-14  119      void **fsdata)
f1d070e0 Martin Brandenburg 2018-12-14  120  {
f1d070e0 Martin Brandenburg 2018-12-14  121     struct orangefs_write_range *wr;
f1d070e0 Martin Brandenburg 2018-12-14  122     struct page *page;
f1d070e0 Martin Brandenburg 2018-12-14  123     pgoff_t index;
f1d070e0 Martin Brandenburg 2018-12-14  124     int ret;
f1d070e0 Martin Brandenburg 2018-12-14  125  
f1d070e0 Martin Brandenburg 2018-12-14  126     wr = kmalloc(sizeof *wr, 
GFP_KERNEL);
f1d070e0 Martin Brandenburg 2018-12-14  127     if (!wr)
f1d070e0 Martin Brandenburg 2018-12-14  128             return -ENOMEM;
f1d070e0 Martin Brandenburg 2018-12-14  129  
f1d070e0 Martin Brandenburg 2018-12-14  130     index = pos >> PAGE_SHIFT;
f1d070e0 Martin Brandenburg 2018-12-14  131  
f1d070e0 Martin Brandenburg 2018-12-14  132     page = 
grab_cache_page_write_begin(mapping, index, flags);
f1d070e0 Martin Brandenburg 2018-12-14  133     if (!page) {
f1d070e0 Martin Brandenburg 2018-12-14  134             kfree(wr);
f1d070e0 Martin Brandenburg 2018-12-14  135             return -ENOMEM;
f1d070e0 Martin Brandenburg 2018-12-14  136     }
f1d070e0 Martin Brandenburg 2018-12-14  137  
f1d070e0 Martin Brandenburg 2018-12-14  138     *pagep = page;
f1d070e0 Martin Brandenburg 2018-12-14  139  
f1d070e0 Martin Brandenburg 2018-12-14  140     if (PageDirty(page) && 
!PagePrivate(page)) {
f1d070e0 Martin Brandenburg 2018-12-14  141             /*
f1d070e0 Martin Brandenburg 2018-12-14  142              * Should be 
impossible.  If it happens, launder the page
f1d070e0 Martin Brandenburg 2018-12-14  143              * since we don't know 
what's dirty.  This will WARN in
f1d070e0 Martin Brandenburg 2018-12-14  144              * 
orangefs_writepage_locked.
f1d070e0 Martin Brandenburg 2018-12-14  145              */
f1d070e0 Martin Brandenburg 2018-12-14  146             ret = 
orangefs_launder_page(page);
f1d070e0 Martin Brandenburg 2018-12-14  147             if (ret)
f1d070e0 Martin Brandenburg 2018-12-14 @148                     return ret;
f1d070e0 Martin Brandenburg 2018-12-14  149     }
f1d070e0 Martin Brandenburg 2018-12-14  150     if (PagePrivate(page)) {
f1d070e0 Martin Brandenburg 2018-12-14  151             struct 
orangefs_write_range *wr;
f1d070e0 Martin Brandenburg 2018-12-14  152             wr = (struct 
orangefs_write_range *)page_private(page);
f1d070e0 Martin Brandenburg 2018-12-14  153             if (wr->pos + wr->len 
== pos &&
f1d070e0 Martin Brandenburg 2018-12-14  154                 uid_eq(wr->uid, 
current_fsuid()) &&
f1d070e0 Martin Brandenburg 2018-12-14  155                 gid_eq(wr->gid, 
current_fsgid())) {
f1d070e0 Martin Brandenburg 2018-12-14  156                     wr->len += len;
f1d070e0 Martin Brandenburg 2018-12-14  157                     goto okay;
f1d070e0 Martin Brandenburg 2018-12-14  158             } else {
f1d070e0 Martin Brandenburg 2018-12-14  159                     ret = 
orangefs_launder_page(page);
f1d070e0 Martin Brandenburg 2018-12-14  160                     if (ret)
f1d070e0 Martin Brandenburg 2018-12-14  161                             return 
ret;
f1d070e0 Martin Brandenburg 2018-12-14  162             }
f1d070e0 Martin Brandenburg 2018-12-14  163             
f1d070e0 Martin Brandenburg 2018-12-14  164     }
f1d070e0 Martin Brandenburg 2018-12-14  165     wr->pos = pos;
f1d070e0 Martin Brandenburg 2018-12-14  166     wr->len = len;
f1d070e0 Martin Brandenburg 2018-12-14  167     wr->uid = current_fsuid();
f1d070e0 Martin Brandenburg 2018-12-14  168     wr->gid = current_fsgid();
f1d070e0 Martin Brandenburg 2018-12-14  169     SetPagePrivate(page);
f1d070e0 Martin Brandenburg 2018-12-14  170     set_page_private(page, 
(unsigned long)wr);
f1d070e0 Martin Brandenburg 2018-12-14  171     get_page(page);
f1d070e0 Martin Brandenburg 2018-12-14  172  okay:
f1d070e0 Martin Brandenburg 2018-12-14  173  
f1d070e0 Martin Brandenburg 2018-12-14  174     if (!PageUptodate(page) && (len 
!= PAGE_SIZE)) {
f1d070e0 Martin Brandenburg 2018-12-14  175             unsigned from = pos & 
(PAGE_SIZE - 1);
f1d070e0 Martin Brandenburg 2018-12-14  176  
f1d070e0 Martin Brandenburg 2018-12-14  177             
zero_user_segments(page, 0, from, from + len, PAGE_SIZE);
f1d070e0 Martin Brandenburg 2018-12-14  178     }
f1d070e0 Martin Brandenburg 2018-12-14  179     return 0;
f1d070e0 Martin Brandenburg 2018-12-14  180  }
f1d070e0 Martin Brandenburg 2018-12-14  181  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
_______________________________________________
kbuild mailing list
kbuild@lists.01.org
https://lists.01.org/mailman/listinfo/kbuild

Reply via email to