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