From: Josef Bacik <jbacik@redhat.com> Date: Tue, 10 Feb 2009 13:49:18 -0500 Subject: [mm] clean up buffered write code Message-id: 1234291777-15344-6-git-send-email-jbacik@redhat.com O-Subject: [PATCH 05/24] [RHEL 5.4] mm: clean up buffered write code Bugzilla: 445433 RH-Acked-by: Steven Whitehouse <swhiteho@redhat.com> RH-Acked-by: Jeff Layton <jlayton@redhat.com> This is a backport of upstream commit ae37461c70bc8c8416cad1bab13a9898ed030aa1 and is in reference to bz 445433. It just renames some variable names and fixes some types, just makes it easier to read and such. Signed-off-by: Josef Bacik <jbacik@redhat.com> diff --git a/mm/filemap.c b/mm/filemap.c index 3eabe37..52bdb97 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2131,16 +2131,15 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, size_t count, ssize_t written) { struct file *file = iocb->ki_filp; - struct address_space * mapping = file->f_mapping; + struct address_space *mapping = file->f_mapping; const struct address_space_operations *a_ops = mapping->a_ops; struct inode *inode = mapping->host; long status = 0; struct page *page; struct page *cached_page = NULL; - size_t bytes; struct pagevec lru_pvec; const struct iovec *cur_iov = iov; /* current iovec */ - size_t iov_base = 0; /* offset in the current iovec */ + size_t iov_offset = 0; /* offset in the current iovec */ char __user *buf; pagevec_init(&lru_pvec, 0); @@ -2151,31 +2150,33 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, if (likely(nr_segs == 1)) buf = iov->iov_base + written; else { - filemap_set_next_iovec(&cur_iov, &iov_base, written); - buf = cur_iov->iov_base + iov_base; + filemap_set_next_iovec(&cur_iov, &iov_offset, written); + buf = cur_iov->iov_base + iov_offset; } do { - unsigned long index; - unsigned long offset; - unsigned long maxlen; - size_t copied; + pgoff_t index; /* Pagecache index for current page */ + unsigned long offset; /* Offset into pagecache page */ + unsigned long maxlen; /* Bytes remaining in current iovec */ + size_t bytes; /* Bytes to write to page */ + size_t copied; /* Bytes copied from user */ - offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */ + offset = (pos & (PAGE_CACHE_SIZE - 1)); index = pos >> PAGE_CACHE_SHIFT; bytes = PAGE_CACHE_SIZE - offset; if (bytes > count) bytes = count; + maxlen = cur_iov->iov_len - iov_offset; + if (maxlen > bytes) + maxlen = bytes; + /* * Bring in the user page that we will copy from _first_. * Otherwise there's a nasty deadlock on copying from the * same page as we're writing to, without it being marked * up-to-date. */ - maxlen = cur_iov->iov_len - iov_base; - if (maxlen > bytes) - maxlen = bytes; fault_in_pages_readable(buf, maxlen); page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec); @@ -2206,7 +2207,7 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, buf, bytes); else copied = filemap_copy_from_user_iovec(page, offset, - cur_iov, iov_base, bytes); + cur_iov, iov_offset, bytes); flush_dcache_page(page); status = a_ops->commit_write(file, page, offset, offset+bytes); if (status == AOP_TRUNCATED_PAGE) { @@ -2224,12 +2225,12 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, buf += status; if (unlikely(nr_segs > 1)) { filemap_set_next_iovec(&cur_iov, - &iov_base, status); + &iov_offset, status); if (count) buf = cur_iov->iov_base + - iov_base; + iov_offset; } else { - iov_base += status; + iov_offset += status; } } }