Author: mav
Date: Mon Oct 13 11:00:58 2014
New Revision: 273029
URL: https://svnweb.freebsd.org/changeset/base/273029

Log:
  Report physical block size for file-backed LUNs, using vattr.va_blocksize.
  
  MFC after:    1 week

Modified:
  head/sys/cam/ctl/ctl_backend_block.c

Modified: head/sys/cam/ctl/ctl_backend_block.c
==============================================================================
--- head/sys/cam/ctl/ctl_backend_block.c        Mon Oct 13 06:51:40 2014        
(r273028)
+++ head/sys/cam/ctl/ctl_backend_block.c        Mon Oct 13 11:00:58 2014        
(r273029)
@@ -1542,6 +1542,7 @@ ctl_be_block_open_file(struct ctl_be_blo
        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_blo
        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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to