Report physical block size for file-backed LUNs, using vattr.va_blocksize.

MFC after:	1 week
This commit is contained in:
Alexander Motin 2014-10-13 11:00:58 +00:00
parent 6ad1954bcb
commit 20a28d6cee
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=273029

View File

@ -1542,6 +1542,7 @@ ctl_be_block_open_file(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
struct ctl_be_block_filedata *file_data;
struct ctl_lun_create_params *params;
struct vattr vattr;
off_t pss;
int error;
error = 0;
@ -1590,21 +1591,21 @@ ctl_be_block_open_file(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
be_lun->flags |= CTL_BE_BLOCK_LUN_MULTI_THREAD;
/*
* XXX KDM vattr.va_blocksize may be larger than 512 bytes here.
* With ZFS, it is 131072 bytes. Block sizes that large don't work
* with disklabel and UFS on FreeBSD at least. Large block sizes
* may not work with other OSes as well. So just export a sector
* size of 512 bytes, which should work with any OS or
* application. Since our backing is a file, any block size will
* work fine for the backing store.
* For files we can use any logical block size. Prefer 512 bytes
* for compatibility reasons. If file's vattr.va_blocksize
* (preferred I/O block size) is bigger and multiple to chosen
* logical block size -- report it as physical block size.
*/
#if 0
be_lun->blocksize= vattr.va_blocksize;
#endif
if (params->blocksize_bytes != 0)
be_lun->blocksize = params->blocksize_bytes;
else
be_lun->blocksize = 512;
pss = vattr.va_blocksize / be_lun->blocksize;
if ((pss > 0) && (pss * be_lun->blocksize == vattr.va_blocksize) &&
((pss & (pss - 1)) == 0)) {
be_lun->pblockexp = fls(pss) - 1;
be_lun->pblockoff = 0;
}
/*
* Sanity check. The media size has to be at least one