Commit Graph

4149 Commits

Author SHA1 Message Date
Brian Behlendorf 82d26b1027 Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-10 11:06:11 -07:00
Brian Behlendorf 8023513a30 Add zvol snapshot and clone tests
Add two additional basic sanity tests to confirm zvol snapshots
and clones work.  The snapshot test is basically the same as the
example provided in the wiki.  The clone test goes one step father
and clones the snapshot then modifies it to match the original
modified volume.  It them compares them to ensure everything was
modified as expected.

These are just meant to be sanity tests to catch obvious breakage
before tagging a release.  They are still not a substitute for a
full regression test suite.
2010-08-10 10:59:58 -07:00
Brian Behlendorf 13c5d88ac4 Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-09 16:51:23 -07:00
Brian Behlendorf dd11e3f7f0 Limit sysfs name to KOBJ_NAME_LEN
See commit dfc166d174 for details.
2010-08-09 16:45:38 -07:00
Brian Behlendorf dfc166d174 Limit sysfs name to KOBJ_NAME_LEN
It appears that in earlier kernels the maximum name length of a
kobject was KOBJ_NAME_LEN (20) bytes.  This was later extended to
dynamically allocate enough memory if it was over KOBJ_NAME_LEN,
and finally it was always made dynamic.  Unfortunately, util this
last step happened it doesn't look like it always safe to use
names larger than KOBJ_NAME_LEN.  For example, under the RHEL5
2.6.18 kernel if the kobject name length exceeds KOBJ_NAME_LEN
a NULL dereference is tripped.

To avoid this issue the build system has been update to check
to see if KOBJ_NAME_LEN is defined.  If it is we have to assume
the maximum kobject name length is only 20 bytes.  This 20 byte
name must minimally include the following components.

  <zpool>/<dataset>[@snapshot[partition]]
2010-08-09 16:44:41 -07:00
Brian Behlendorf d5168aa089 Insert small delay for udev
While the zfs utilities do block until the expected device appears
they can only do this for full devices, not partitions.  This means
that once as device appears it still may take a little bit of time
before the kernel rescans the partition table, updates sysfs, udev
is notified and the partition devices are created.  The test case
itself could block briefly waiting for the partition beause it knows
what to expect.  But for now the simpler thing to do is just delay.
2010-08-09 16:43:54 -07:00
Brian Behlendorf 6478a7f847 Remove /zvol/ path component from zconfig.sh
See previous commit for details.  But the gist is with the removal of
the zvol path component the regression tests must be updated to use
the correct path name.
2010-08-09 16:43:33 -07:00
Brian Behlendorf 5ce3b77ef8 Remove /zvol/ path component for zvol devices
As part of commit f162433deb the /zvol/
path component was added for zvol devices.  This ensured all zvol
devices would be created by udev in /dev/zvol/<pool>/<dataset>, as
opposed to the previous /dev/<pool>/<dataset> path.  Logically, it
was nice to organize them in a directory much like Solaris does.

However, while initial testing showed this to work fine with modern
kernels it does not appear to be supported under RHEL5.  The extra
path component triggers a NULL deref in create_dir().  Anyway, to
avoid having different zvol path names based on your kernel version
its more consistent simply to revert to the original naming convention.
If you really want the zvol component you can always add custom
udev rules to do exactly this.

We can revisiting this change again once we are willing to drop
support for RHEL5 and similar older distros.
2010-08-09 16:42:42 -07:00
Brian Behlendorf 7e693479b0 Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-06 10:52:58 -07:00
Brian Behlendorf 9e3e35dc3f Merge commit 'refs/top-bases/zfs-branch' into zfs-branch 2010-08-06 10:52:35 -07:00
Brian Behlendorf 8f8d2b66aa Merge branch 'fix-branch' into refs/top-bases/zfs-branch 2010-08-06 10:52:34 -07:00
Brian Behlendorf 86b29c0b9c Merge commit 'refs/top-bases/fix-branch' into fix-branch 2010-08-06 10:47:03 -07:00
Brian Behlendorf 2e982255da Merge branch 'fix-zfs_ioc_objset_stats' into refs/top-bases/fix-branch 2010-08-06 10:47:02 -07:00
Brian Behlendorf 46e9b0989d New TopGit dependency: fix-zfs_ioc_objset_stats 2010-08-06 10:46:58 -07:00
Brian Behlendorf 89f0abf9b5 Add missing zfs_ioc_objset_stats() error handling
Interestingly this looks like an upstream bug as well.  If for some
reason we are unable to get a zvols statistics, because perhaps the
zpool is hopelessly corrupt, we would trigger the VERIFY.  This
commit adds the proper error handling just to propagate the error
back to user space.  Now the user space tools still must handle this
properly but in the worst case the tool will crash or perhaps have
some missing output.  That's far far better than crashing the host.

Closes #45
2010-08-06 10:46:39 -07:00
Brian Behlendorf 1282a0335f Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-05 11:31:11 -07:00
Brian Behlendorf a6644f49a5 Add cleanup option -c to zconfig.sh
Several folks have now remarked that when the regression tests
fail they leave a mess behind.  This was done intentionally at
the time to facilitate debugging the wreckage.

However, this also means that you may need to do some manual
cleanup such as removing the loopback devices before re-running
the tests.  To simplify this proceedure I've added the '-c'
option to zconfig.sh which will attempt to cleanup the mess
from a previous test before starting.

This is somewhat dangerous because it must guess as to which
loopback devices you were using.  But this risk is fairly minimal
because devices which are currently still is use can not be
cleaned up.  And because only devices with 'zpool' in the name
are considered for removal.  That said if your running parallel
copies of say zconfig.sh this may cause you some trouble.
2010-08-05 11:24:04 -07:00
Brian Behlendorf 019953e0b7 Update zconfig to check partitions
Update the zconfig.sh test script to verify not only that volumes,
snapshots, and clones are created and removed properly.  But also
verify that the partition information for each of these types of
devices is properly enumerated by the kernel.

Tests 4 and 5 now also create two partitions on the original volume
and these partitions are expected to also exist on the snapshot and
the clone.  Correctness is verified after import/export, module
load/unload, dataset creation, and pool destruction.

Additionally, the code to create a partition table was refactored
in to a small helper function to simplify the test cases.  And
finally all of the function variables were flagged 'local' to ensure
their scope is limited.  This should have been done a while ago.
2010-08-05 11:22:33 -07:00
Brian Behlendorf f3aa3b93df Fix zvol partition creation during module load
Partitions for a zvol device were not appearing in /dev/zvol/<pool>/
at module load time for a couple of reasons.

1) The Linux block layer expects a block device to have a non-zero
   capacity during add_disk().  If the capacity is zero it does not
   attempt to open the device which means we never trigger a partition
   scan.  The device capacity was just being set during the first open.

2) Because we expect to be adding a block device to the zvol_state_list
   during zvol_create_minor() the zvol_state_lock() is held.  This
   can result in a deadlock in add_disk() when it attempts to open
   the block device via zvol_open() which also takes this same lock.
   To avoid this issue special handling has been added to zvol_open()
   and zvol_release() to allow the mutex owner to enter these functions
   without retaking the lock.

3) In __zvol_create_minor() the call to dmu_objset_disown() must occur
   before the call to add_disk().  As mentioned above add_disk() results
   in a call to zvol_open() which will attempt to call dmu_objset_own()
   again on the objset.  If the objset is already open it will fail
   resulting in a failed open.  This in turn means the kernel will be
   unable to read the partition information from the device.
2010-08-04 16:05:25 -07:00
Brian Behlendorf a54f5dddf1 Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-03 16:02:41 -07:00
Brian Behlendorf 63a645c3c8 Merge commit 'refs/top-bases/zfs-branch' into zfs-branch 2010-08-03 16:02:21 -07:00
Brian Behlendorf 1b9fd31ada Merge branch 'fix-branch' into refs/top-bases/zfs-branch 2010-08-03 16:02:20 -07:00
Brian Behlendorf 3eff30685e Set zv->zv_objset for zil_replay() case
For the case where we have a zil to replay we need to ensure that
zv->zv_objset contains the current objset.  Since the caller has
a hold on the object set it is safe to pass to zil_replay as part
of the zv.  Call path zvol_create_minor()->zil_replay()->
zil_parse()->zil_replay_log_record()->zvol_replay_write().
2010-08-03 15:57:05 -07:00
Brian Behlendorf 2cb5528450 Merge branch 'fix-bpobj_close' into refs/top-bases/fix-branch 2010-08-03 15:56:53 -07:00
Brian Behlendorf 670b33090f Merge commit 'refs/top-bases/fix-branch' into fix-branch 2010-08-03 15:56:53 -07:00
Brian Behlendorf 84eae057e7 New TopGit dependency: fix-bpobj_close 2010-08-03 15:56:49 -07:00
Brian Behlendorf 3253b39fa6 Set bpo->bpo_object = 0 on close to allow retry
During spa_load the spl->spa_deferred_bpobj maybe be opened and closed
multiple times.  It's critical that when the object is closed the
bpo->bpo_object is set to zero to indicate the object is closed.
If it's not during spl_load_retry the spl->spa_deferred_bpobj can
be closes twice resulting in a NULL deref.

This appears to have been fixed upstream the same way.
2010-08-03 15:56:29 -07:00
Brian Behlendorf 640888ec74 Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-02 15:29:46 -07:00
Brian Behlendorf 8481c9b7bb Merge commit 'refs/top-bases/zfs-branch' into zfs-branch 2010-08-02 15:29:28 -07:00
Brian Behlendorf 7e9bdac1a8 Merge branch 'fix-branch' into refs/top-bases/zfs-branch 2010-08-02 15:29:27 -07:00
Brian Behlendorf 8bf0a4e79c Merge branch 'fix-stack-inline' into refs/top-bases/fix-branch 2010-08-02 15:29:25 -07:00
Brian Behlendorf 78798f0ea5 Merge commit 'refs/top-bases/fix-branch' into fix-branch 2010-08-02 15:29:25 -07:00
Brian Behlendorf 45c00bf359 Fix spa_load_impl() prototype
Both the forward declaration of spa_load_impl() and the actual
function declaration must match.
2010-08-02 15:24:33 -07:00
Brian Behlendorf 52c23142d4 Revert "Inline zio_execute() to reduce stack use"
This reverts commit 411dd65af1.

gcc version 4.1.2 does not like having differing prototypes
for zio_execute, one version in the .c with inline and one
version in the .h without.  Thus I'm reverting this change
and we'll see how critical this particular stack reduction is.
2010-08-02 15:22:11 -07:00
Brian Behlendorf bd4701a061 Merge commit 'refs/top-bases/linux-kernel-disk' into linux-kernel-disk 2010-08-02 14:17:36 -07:00
Brian Behlendorf 1afa38755a Merge commit 'refs/top-bases/zfs-branch' into zfs-branch 2010-08-02 14:17:17 -07:00
Brian Behlendorf 3de149b962 Merge branch 'fix-branch' into refs/top-bases/zfs-branch 2010-08-02 14:17:16 -07:00
Brian Behlendorf 74fdd957d1 Merge commit 'refs/top-bases/fix-branch' into fix-branch 2010-08-02 14:12:56 -07:00
Brian Behlendorf 529d515858 Merge branch 'fix-stack-dbuf_hold_impl' into refs/top-bases/fix-branch 2010-08-02 14:12:55 -07:00
Brian Behlendorf f271befe26 New TopGit dependency: fix-stack-dbuf_hold_impl 2010-08-02 14:12:52 -07:00
Ned Bass 4d3fc57112 Reduce stack usage for recursive dbuf_hold_impl()
This commit preserves the recursive function dbuf_hold_impl() but moves
the local variables and function arguments to the heap to minimize
the stack frame size.  Enough space is initially allocated on the
stack for 20 levels of recursion.  This technique was based on commit
34229a2f2a which reduced stack usage of
traverse_visitbp().

dbuf_hold_impl() is mutually recursive with dbuf_findbp(),
but the latter function is also called from other functions.
Therefore dbuf_findbp() must contain logic to determine how to call
dbuf_hold_impl().  To this end, dbuf_hold_impl() now takes a
struct dbuf_hold_impl_data pointer as an argument.  If that argument
is NULL it calls dbuf_hold_impl() as before, otherwise it calls
__debuf_hold_impl() with a single dbuf_hold_impl_data pointer argument.
As the name implies, dbuf_hold_impl_data stores the arguments and local
variables for dbuf_hold_impl().

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
2010-08-02 14:12:31 -07:00
Brian Behlendorf c7786edbf0 Initial commit for fix-stack-dbuf_hold_impl topic branch 2010-08-02 14:10:28 -07:00
Brian Behlendorf db488a647c Merge commit 'refs/top-bases/fix-branch' into fix-branch 2010-08-02 14:09:40 -07:00
Brian Behlendorf 2a9adcbffb Merge branch 'fix-stack-dsl_scan_visitbp' into refs/top-bases/fix-branch 2010-08-02 14:09:39 -07:00
Brian Behlendorf 0c6f448b57 New TopGit dependency: fix-stack-dsl_scan_visitbp 2010-08-02 14:09:37 -07:00
Ned Bass 410d8c4e15 Reduce dsl_scan_visitbp stack usage by moving blkptr_t to heap
Github issue 22 reported a stack overrun when the zfs module was
loaded, possibly related to the presence of existing zpools created
under zfs-fuse.  The stack trace showed 9 levels of recursion between
dsl_scan_visitbp() and dsl_scan_recurse(). To reduce stack overhead in
that code path, this commit moves the 128 byte blkptr_t data strucutre
in dsl_scan_visitbp() to the heap.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
2010-08-02 14:09:15 -07:00
Brian Behlendorf 911d2e0df4 Initial commit for fix-stack-dsl_scan_visitbp topic branch 2010-08-02 14:08:36 -07:00
Brian Behlendorf 64df38a167 Merge commit 'refs/top-bases/fix-branch' into fix-branch 2010-08-02 14:06:33 -07:00
Brian Behlendorf 425b8742a5 Merge branch 'fix-stack-zio_done' into refs/top-bases/fix-branch 2010-08-02 14:06:32 -07:00
Brian Behlendorf da40cc1454 New TopGit dependency: fix-stack-zio_done 2010-08-02 14:06:29 -07:00