2009/3/11 Dina <dina.nimeh at sun.com>
> Juergen Keil wrote:
>> Hmm, but why does the following work using the lofi block device?
>> Seems to be another bug... ?I'd expect that this get s a EROFS error, too.
>>
>> # dd if=/dev/zero of=/dev/lofi/5 count=2
>> 2+0 records in
>> 2+0 records out
>
> I don't know if this is related to an existing bug:
> 6717722 lofi must not write to R/O file systems

I think that's different.

lofi_strategy_task does fail the writes on the block device with EROFS
errors, but the write is async, so the user program doesn't notice the
errors?

                /*
                 * Compressed files can only be read from and
                 * not written to
                 */
                if (!(bp->b_flags & B_READ)) {
                        bp->b_resid = bp->b_bcount;
                        error = EROFS;
                        goto done;
                }


The same problem exists with sd(7D) when trying to write to a
DVD-ROM media:

# dd if=/dev/zero of=/dev/rdsk/c0t1d0p0 count=64 bs=2k
write: I/O error
1+0 records in
1+0 records out
# dd if=/dev/zero of=/dev/dsk/c0t1d0p0 count=64 bs=2k
64+0 records in
64+0 records out


Using the ps/2 floppy driver and a read/only floppy media:
In this case the char and block device open() fails with EROFS.

# dd if=/dev/zero of=/dev/rdiskette count=64
dd: /dev/rdiskette: open: Read-only file system
# dd if=/dev/zero of=/dev/diskette count=64
dd: /dev/diskette: open: Read-only file system

I think lofi could do the same, and fail open for write
on a non master control device, when a compressed
file is mapped.


>>> It releases the memory at unmap time, is unmapping the file a guaranteed
>>> event at this point? ?If not, then does this lead to a stale segment in
>>> the cache?
>>
>> No, patching / changing the lofi_max_comp_cache variable doesn't
>> result in unmapping the file (that is calling lofi_free_handle(()).
>> You would have to use lofiadm -d and close all references to the
>> /dev/lofi/N file to get the cache memory released.
>>
>
> Did not mean that changing lofi_max_comp_cache unmaps the file, I know
> that. ?Rephrasing: ?"Lofi releases the memory at unmap time, ok, however
> what guarantees that an unmap happens between the time the caching is
> disabled and the time the caching is re-enabled?"

That would be a problem if it would be possible to map a new file for an active
lofi device, but that isn't possible.

# mount -F hsfs /files2/media/os200906.iso /mnt
    { change lofi_max_comp_cache from 1 => 0 here }
# lofiadm
Block Device             File                           Options
/dev/lofi/1              /files2/media/os200906.iso     -
# lofiadm -f -d /dev/lofi/1
# lofiadm -a /files2/media/os200811.iso /dev/lofi/1
lofiadm: could not map file /files2/media/os200811.iso to /dev/lofi/1:
File exists
    { assuming the above lofiadm -a would be possible (but it isn't);
      change lofi_max_comp_cache from 0 => 1 here }


lofi_map_file() checks that there is no existing state before reusing a
lofi device, lines 1798,1799:


  1787          if (pickminor) {
   ...
  1796          } else {
  1797                  newminor = klip->li_minor;
  1798                  if (ddi_get_soft_state(lofi_statep, newminor) != NULL) {
  1799                          error = EEXIST;
  1800                          goto out;
  1801                  }
  1802          }

The soft state is freed in lofi_free_handle() - at the same time
the cache with decompressed data is freed.

> It seems the answer is related to the compressed lofi being read-only.
> Inconsistency is not an issue, is that correct?
>
>>
>> Hmm, you could construct a case with attaching a compressed lofi file,
>> and write to the underlying vnode.
>>
>>>> Do we really need code to shrink the lofi decompress cache at runtime?
>>>
>>> I think I understand that 1 cached segment gives a nice boost. ?And that
>>> the improvement is probably not linear. At some point it doesn't matter
>>> if you have 5 or 10 for your max cache size, the incremental performance
>>> improvement may no longer be noticeable.
>>>
>>> That's why I asked what would happen if I set it 10240. ?Would it really
>>> grow to 10240, or would it cut me off somewhere and not grow anymore, to
>>> prevent running out of heap?
>>
>> It would grow to 10240 cached segments.
>
> Is there any value to put a hard limit on how big lofi_max_comp_cache
> can ever be?

Hmm, we currently have no upper limit for the
compression segment size, either.  The following
command could have bad effects on a system:

    mkfile -n 3G /var/tmp/foobar
    lofiadm -C 1g /var/tmp/foobar
    lofiadm -a /var/tmp/foobar /dev/lofi/99
    od -xc /dev/lofi/99

And with s/3G/4G/, the compressed lofi file after lofiadm -a is empty?
Another >= 4 giga byte bug?

> D.
>

Reply via email to