diff options
| author | Dmitry Torokhov <[email protected]> | 2017-09-04 09:22:54 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2017-09-04 09:22:54 -0700 | 
| commit | a6cbfa1e6d38c4b3ab0ce7e3aea4bb4e744f24b8 (patch) | |
| tree | 8960e571a398b5d32e72bdb9c89ce965daa870ab /fs/ext4/file.c | |
| parent | f5308d1b83eba20e69df5e0926ba7257c8dd9074 (diff) | |
| parent | 08d6ac9ee5fedd82040bc878705981b67a116a3f (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 4.14 merge window.
Diffstat (limited to 'fs/ext4/file.c')
| -rw-r--r-- | fs/ext4/file.c | 54 | 
1 files changed, 16 insertions, 38 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 831fd6beebf0..02ce7e7bbdf5 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -474,57 +474,37 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,  	endoff = (loff_t)end_blk << blkbits;  	index = startoff >> PAGE_SHIFT; -	end = endoff >> PAGE_SHIFT; +	end = (endoff - 1) >> PAGE_SHIFT;  	pagevec_init(&pvec, 0);  	do {  		int i, num;  		unsigned long nr_pages; -		num = min_t(pgoff_t, end - index, PAGEVEC_SIZE); +		num = min_t(pgoff_t, end - index, PAGEVEC_SIZE - 1) + 1;  		nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index,  					  (pgoff_t)num); -		if (nr_pages == 0) { -			if (whence == SEEK_DATA) -				break; - -			BUG_ON(whence != SEEK_HOLE); -			/* -			 * If this is the first time to go into the loop and -			 * offset is not beyond the end offset, it will be a -			 * hole at this offset -			 */ -			if (lastoff == startoff || lastoff < endoff) -				found = 1; -			break; -		} - -		/* -		 * If this is the first time to go into the loop and -		 * offset is smaller than the first page offset, it will be a -		 * hole at this offset. -		 */ -		if (lastoff == startoff && whence == SEEK_HOLE && -		    lastoff < page_offset(pvec.pages[0])) { -			found = 1; +		if (nr_pages == 0)  			break; -		}  		for (i = 0; i < nr_pages; i++) {  			struct page *page = pvec.pages[i];  			struct buffer_head *bh, *head;  			/* -			 * If the current offset is not beyond the end of given -			 * range, it will be a hole. +			 * If current offset is smaller than the page offset, +			 * there is a hole at this offset.  			 */ -			if (lastoff < endoff && whence == SEEK_HOLE && -			    page->index > end) { +			if (whence == SEEK_HOLE && lastoff < endoff && +			    lastoff < page_offset(pvec.pages[i])) {  				found = 1;  				*offset = lastoff;  				goto out;  			} +			if (page->index > end) +				goto out; +  			lock_page(page);  			if (unlikely(page->mapping != inode->i_mapping)) { @@ -564,20 +544,18 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,  			unlock_page(page);  		} -		/* -		 * The no. of pages is less than our desired, that would be a -		 * hole in there. -		 */ -		if (nr_pages < num && whence == SEEK_HOLE) { -			found = 1; -			*offset = lastoff; +		/* The no. of pages is less than our desired, we are done. */ +		if (nr_pages < num)  			break; -		}  		index = pvec.pages[i - 1]->index + 1;  		pagevec_release(&pvec);  	} while (index <= end); +	if (whence == SEEK_HOLE && lastoff < endoff) { +		found = 1; +		*offset = lastoff; +	}  out:  	pagevec_release(&pvec);  	return found;  |