All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ryan Ding <ryan.ding@oracle.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] ocfs2: do not change i_size in write_end for direct io
Date: Wed, 23 Sep 2015 10:14:11 +0800	[thread overview]
Message-ID: <56020AF3.5060602@oracle.com> (raw)
In-Reply-To: <20150921162343.GC5648@mwanda>

HiDan,

On 09/22/2015 12:24 AM, Dan Carpenter wrote:
> 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.
Previous check (wc->w_type != OCFS2_WRITE_DIRECT) will make sure 
'handle' is not NULL. Since only direct io may have a NULL handle.

Regards,
Ryan
>
>    2064		}
>    2065		if (handle)
>
> regards,
> dan carpenter

      reply	other threads:[~2015-09-23  2:14 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-21 16:24 [Ocfs2-devel] ocfs2: do not change i_size in write_end for direct io Dan Carpenter
2015-09-23  2:14 ` Ryan Ding [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56020AF3.5060602@oracle.com \
    --to=ryan.ding@oracle.com \
    --cc=ocfs2-devel@oss.oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.