[Ocfs2-devel] ocfs2: do not change i_size in write_end for direct io
Dan Carpenter
dan.carpenter at oracle.com
Mon Sep 21 09:24:30 PDT 2015
Hello Ryan Ding,
This is a semi-automatic email about new static checker warnings.
The patch 3d598f72dc44: "ocfs2: do not change i_size in write_end for
direct io" from Sep 17, 2015, leads to the following Smatch complaint:
fs/ocfs2/aops.c:2063 ocfs2_write_end_nolock()
error: we previously assumed 'handle' could be null (see line 1994)
fs/ocfs2/aops.c
1993
1994 if (handle) {
Patch adds check.
1995 ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode),
1996 wc->w_di_bh, OCFS2_JOURNAL_ACCESS_WRITE);
1997 if (ret) {
1998 copied = ret;
1999 mlog_errno(ret);
2000 goto out;
2001 }
2002 }
2003
2004 if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
2005 ocfs2_write_end_inline(inode, pos, len, &copied, di, wc);
2006 goto out_write_size;
2007 }
2008
2009 if (unlikely(copied < len) && wc->w_target_page) {
2010 if (!PageUptodate(wc->w_target_page))
2011 copied = 0;
2012
2013 ocfs2_zero_new_buffers(wc->w_target_page, start+copied,
2014 start+len);
2015 }
2016 if (wc->w_target_page)
2017 flush_dcache_page(wc->w_target_page);
2018
2019 for(i = 0; i < wc->w_num_pages; i++) {
2020 tmppage = wc->w_pages[i];
2021
2022 /* This is the direct io target page. */
2023 if (tmppage == NULL)
2024 continue;
2025
2026 if (tmppage == wc->w_target_page) {
2027 from = wc->w_target_from;
2028 to = wc->w_target_to;
2029
2030 BUG_ON(from > PAGE_CACHE_SIZE ||
2031 to > PAGE_CACHE_SIZE ||
2032 to < from);
2033 } else {
2034 /*
2035 * Pages adjacent to the target (if any) imply
2036 * a hole-filling write in which case we want
2037 * to flush their entire range.
2038 */
2039 from = 0;
2040 to = PAGE_CACHE_SIZE;
2041 }
2042
2043 if (page_has_buffers(tmppage)) {
2044 if (handle && ocfs2_should_order_data(inode))
2045 ocfs2_jbd2_file_inode(handle, inode);
2046 block_commit_write(tmppage, from, to);
2047 }
2048 }
2049
2050 out_write_size:
2051 /* Direct io do not update i_size here. */
2052 if (wc->w_type != OCFS2_WRITE_DIRECT) {
2053 pos += copied;
2054 if (pos > i_size_read(inode)) {
2055 i_size_write(inode, pos);
2056 mark_inode_dirty(inode);
2057 }
2058 inode->i_blocks = ocfs2_inode_sector_count(inode);
2059 di->i_size = cpu_to_le64((u64)i_size_read(inode));
2060 inode->i_mtime = inode->i_ctime = CURRENT_TIME;
2061 di->i_mtime = di->i_ctime = cpu_to_le64(inode->i_mtime.tv_sec);
2062 di->i_mtime_nsec = di->i_ctime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
2063 ocfs2_update_inode_fsync_trans(handle, inode, 1);
^^^^^^
Unchecked dereference inside function call.
2064 }
2065 if (handle)
regards,
dan carpenter
More information about the Ocfs2-devel
mailing list