|
@@ -2434,13 +2434,22 @@ xfs_alloc_vextent_worker(
|
|
|
current_restore_flags_nested(&pflags, PF_FSTRANS);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-int /* error */
|
|
|
+/*
|
|
|
+ * Data allocation requests often come in with little stack to work on. Push
|
|
|
+ * them off to a worker thread so there is lots of stack to use. Metadata
|
|
|
+ * requests, OTOH, are generally from low stack usage paths, so avoid the
|
|
|
+ * context switch overhead here.
|
|
|
+ */
|
|
|
+int
|
|
|
xfs_alloc_vextent(
|
|
|
- xfs_alloc_arg_t *args) /* allocation argument structure */
|
|
|
+ struct xfs_alloc_arg *args)
|
|
|
{
|
|
|
DECLARE_COMPLETION_ONSTACK(done);
|
|
|
|
|
|
+ if (!args->userdata)
|
|
|
+ return __xfs_alloc_vextent(args);
|
|
|
+
|
|
|
+
|
|
|
args->done = &done;
|
|
|
INIT_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker);
|
|
|
queue_work(xfs_alloc_wq, &args->work);
|