am 743a5ec9: vold: Perform fstrim work in a separate thread.
* commit '743a5ec96cd54bdc06234be15cdde65296357a6a':
vold: Perform fstrim work in a separate thread.
diff --git a/fstrim.c b/fstrim.c
index 156446a..1ffd312 100644
--- a/fstrim.c
+++ b/fstrim.c
@@ -23,10 +23,11 @@
#include <limits.h>
#include <linux/fs.h>
#include <fs_mgr.h>
+#include <pthread.h>
#define LOG_TAG "fstrim"
#include "cutils/log.h"
-int fstrim_filesystems(void)
+static void *do_fstrim_filesystems(void *ignored)
{
int i;
int fd;
@@ -81,6 +82,36 @@
}
SLOGI("Finished fstrim work.\n");
- return ret;
+ return (void *)ret;
}
+int fstrim_filesystems(void)
+{
+ pthread_t t;
+ int ret;
+
+ /* Depending on the emmc chip and size, this can take upwards
+ * of a few minutes. If done in the same thread as the caller
+ * of this function, that would block vold from accepting any
+ * commands until the trim is finished. So start another thread
+ * to do the work, and return immediately.
+ *
+ * This function should not be called more than once per day, but
+ * even if it is called a second time before the first one finishes,
+ * the kernel will "do the right thing" and split the work between
+ * the two ioctls invoked in separate threads.
+ */
+ ret = pthread_create(&t, NULL, do_fstrim_filesystems, NULL);
+ if (ret) {
+ SLOGE("Cannot create thread to do fstrim");
+ return ret;
+ }
+
+ ret = pthread_detach(t);
+ if (ret) {
+ SLOGE("Cannot detach thread doing fstrim");
+ return ret;
+ }
+
+ return 0;
+}