--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-sqlite-nfs.patch Fri Oct 26 23:25:51 2012 +0200
@@ -0,0 +1,79 @@
+# HG changeset patch
+# Parent 7854b317f3c3258c89887b3fbd5f88509445c8e5
+# User Martin Stransky <stransky@redhat.com>
+Bug 433129 - nfs hosted profiles/browsers result in broken search and history, r=asuth
+
+diff --git a/storage/src/TelemetryVFS.cpp b/storage/src/TelemetryVFS.cpp
+--- a/storage/src/TelemetryVFS.cpp
++++ b/storage/src/TelemetryVFS.cpp
+@@ -34,20 +34,31 @@
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+ #include <string.h>
+ #include "mozilla/Telemetry.h"
++#include "mozilla/Preferences.h"
+ #include "sqlite3.h"
+ #include "nsThreadUtils.h"
+ #include "mozilla/Util.h"
+
++/**
++ * This preference is a workaround to allow users/sysadmins to identify
++ * that the profile exists on an NFS share whose implementation
++ * is incompatible with SQLite's default locking implementation.
++ * Bug 433129 attempted to automatically identify such file-systems,
++ * but a reliable way was not found and it was determined that the fallback
++ * locking is slower than POSIX locking, so we do not want to do it by default.
++*/
++#define PREF_NFS_FILESYSTEM "storage.nfs_filesystem"
++
+ namespace {
+
+ using namespace mozilla;
+
+ struct Histograms {
+ const char *name;
+ const Telemetry::ID readB;
+ const Telemetry::ID writeB;
+@@ -463,23 +474,33 @@ xNextSystemCall(sqlite3_vfs *vfs, const
+ }
+
+ namespace mozilla {
+ namespace storage {
+
+ sqlite3_vfs* ConstructTelemetryVFS()
+ {
+ #if defined(XP_WIN)
+-#define EXPECTED_VFS "win32"
++#define EXPECTED_VFS "win32"
++#define EXPECTED_VFS_NFS "win32"
+ #else
+-#define EXPECTED_VFS "unix"
++#define EXPECTED_VFS "unix"
++#define EXPECTED_VFS_NFS "unix-excl"
+ #endif
+-
+- sqlite3_vfs *vfs = sqlite3_vfs_find(NULL);
+- const bool expected_vfs = vfs->zName && !strcmp(vfs->zName, EXPECTED_VFS);
++
++ bool expected_vfs;
++ sqlite3_vfs *vfs;
++ if (Preferences::GetBool(PREF_NFS_FILESYSTEM)) {
++ vfs = sqlite3_vfs_find(EXPECTED_VFS_NFS);
++ expected_vfs = (vfs != nsnull);
++ }
++ else {
++ vfs = sqlite3_vfs_find(NULL);
++ expected_vfs = vfs->zName && !strcmp(vfs->zName, EXPECTED_VFS);
++ }
+ if (!expected_vfs) {
+ return NULL;
+ }
+
+ sqlite3_vfs *tvfs = new ::sqlite3_vfs;
+ memset(tvfs, 0, sizeof(::sqlite3_vfs));
+ tvfs->iVersion = 3;
+ // If the SQLite VFS version is updated, this shim must be updated as well.