diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /fs/f2fs/inline.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'fs/f2fs/inline.c')
| -rw-r--r-- | fs/f2fs/inline.c | 25 | 
1 files changed, 21 insertions, 4 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 38e75fb1e488..3d143be42895 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -141,6 +141,8 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)  	kunmap_atomic(dst_addr);  	SetPageUptodate(page);  no_update: +	set_page_dirty(page); +  	/* clear dirty state */  	dirty = clear_page_dirty_for_io(page); @@ -358,6 +360,10 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,  	return 0;  } +/* + * NOTE: ipage is grabbed by caller, but if any error occurs, we should + * release ipage in this function. + */  static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,  				struct f2fs_inline_dentry *inline_dentry)  { @@ -367,8 +373,10 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,  	int err;  	page = grab_cache_page(dir->i_mapping, 0); -	if (!page) +	if (!page) { +		f2fs_put_page(ipage, 1);  		return -ENOMEM; +	}  	set_new_dnode(&dn, dir, ipage, NULL, 0);  	err = f2fs_reserve_block(&dn, 0); @@ -376,13 +384,21 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,  		goto out;  	f2fs_wait_on_page_writeback(page, DATA); -	zero_user_segment(page, 0, PAGE_CACHE_SIZE); +	zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE);  	dentry_blk = kmap_atomic(page);  	/* copy data from inline dentry block to new dentry block */  	memcpy(dentry_blk->dentry_bitmap, inline_dentry->dentry_bitmap,  					INLINE_DENTRY_BITMAP_SIZE); +	memset(dentry_blk->dentry_bitmap + INLINE_DENTRY_BITMAP_SIZE, 0, +			SIZE_OF_DENTRY_BITMAP - INLINE_DENTRY_BITMAP_SIZE); +	/* +	 * we do not need to zero out remainder part of dentry and filename +	 * field, since we have used bitmap for marking the usage status of +	 * them, besides, we can also ignore copying/zeroing reserved space +	 * of dentry block, because them haven't been used so far. +	 */  	memcpy(dentry_blk->dentry, inline_dentry->dentry,  			sizeof(struct f2fs_dir_entry) * NR_INLINE_DENTRY);  	memcpy(dentry_blk->filename, inline_dentry->filename, @@ -432,8 +448,9 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,  						slots, NR_INLINE_DENTRY);  	if (bit_pos >= NR_INLINE_DENTRY) {  		err = f2fs_convert_inline_dir(dir, ipage, dentry_blk); -		if (!err) -			err = -EAGAIN; +		if (err) +			return err; +		err = -EAGAIN;  		goto out;  	}  |