Message ID | 1452128897-5433-9-git-send-email-quwenruo@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Wang, [auto build test WARNING on tip/perf/core] [also build test WARNING on v4.4-rc8] [cannot apply to btrfs/next next-20160106] [if your patch is applied to the wrong git tree, please drop us a note to help improving the system] url: https://github.com/0day-ci/linux/commits/Qu-Wenruo/btrfs-dedup-Introduce-dedup-framework-and-its-header/20160107-091211 config: s390-allmodconfig (attached as .config) reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=s390 All warnings (new ones prefixed by >>): fs/btrfs/dedup.c: In function 'btrfs_dedup_calc_hash': >> fs/btrfs/dedup.c:558:1: warning: 'btrfs_dedup_calc_hash' uses dynamic stack allocation } ^ vim +/btrfs_dedup_calc_hash +558 fs/btrfs/dedup.c 542 return -ENOMEM; 543 for (i = 0; sectorsize * i < dedup_bs; i++) { 544 char *d; 545 546 /* TODO: Add support for subpage size case */ 547 p = find_get_page(inode->i_mapping, 548 (start >> PAGE_CACHE_SHIFT) + i); 549 WARN_ON(!p); 550 d = kmap_atomic(p); 551 memcpy((data + sectorsize * i), d, sectorsize); 552 kunmap_atomic(d); 553 page_cache_release(p); 554 } 555 ret = hash_data(dedup_info, data, dedup_bs, hash); 556 kfree(data); 557 return ret; > 558 } --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/fs/btrfs/dedup.c b/fs/btrfs/dedup.c index 4863cf2..4f24a2c 100644 --- a/fs/btrfs/dedup.c +++ b/fs/btrfs/dedup.c @@ -499,3 +499,60 @@ int btrfs_dedup_search(struct inode *inode, u64 file_pos, } return ret; } + +static int hash_data(struct btrfs_dedup_info *dedup_info, const char *data, + u64 length, struct btrfs_dedup_hash *hash) +{ + struct crypto_shash *tfm = dedup_info->dedup_driver; + struct { + struct shash_desc desc; + char ctx[crypto_shash_descsize(tfm)]; + } sdesc; + int ret; + + sdesc.desc.tfm = tfm; + sdesc.desc.flags = 0; + + ret = crypto_shash_digest(&sdesc.desc, data, length, + (char *)(hash->hash)); + return ret; +} + +int btrfs_dedup_calc_hash(struct btrfs_root *root, struct inode *inode, + u64 start, struct btrfs_dedup_hash *hash) +{ + struct page *p; + struct btrfs_dedup_info *dedup_info = root->fs_info->dedup_info; + char *data; + int i; + int ret; + u64 dedup_bs; + u64 sectorsize = root->sectorsize; + + if (!dedup_info || !hash) + return 0; + + WARN_ON(!IS_ALIGNED(start, sectorsize)); + + dedup_bs = dedup_info->blocksize; + sectorsize = root->sectorsize; + + data = kmalloc(dedup_bs, GFP_NOFS); + if (!data) + return -ENOMEM; + for (i = 0; sectorsize * i < dedup_bs; i++) { + char *d; + + /* TODO: Add support for subpage size case */ + p = find_get_page(inode->i_mapping, + (start >> PAGE_CACHE_SHIFT) + i); + WARN_ON(!p); + d = kmap_atomic(p); + memcpy((data + sectorsize * i), d, sectorsize); + kunmap_atomic(d); + page_cache_release(p); + } + ret = hash_data(dedup_info, data, dedup_bs, hash); + kfree(data); + return ret; +}