diff --git a/gvfs-bnc368628-fuse-robustness.patch b/gvfs-bnc368628-fuse-robustness.patch new file mode 100644 index 0000000..0288152 --- /dev/null +++ b/gvfs-bnc368628-fuse-robustness.patch @@ -0,0 +1,95 @@ +diff -upr gvfs-0.2.3-pre/client/gvfsfusedaemon.c gvfs-0.2.3-post/client/gvfsfusedaemon.c +--- gvfs-0.2.3-pre/client/gvfsfusedaemon.c 2008-04-07 20:27:44.000000000 -0500 ++++ gvfs-0.2.3-post/client/gvfsfusedaemon.c 2008-05-08 00:12:40.000000000 -0500 +@@ -71,6 +71,8 @@ typedef enum { + } FileOp; + + typedef struct { ++ gint refcount; ++ + GMutex *mutex; + FileOp op; + gpointer stream; +@@ -188,12 +190,26 @@ file_handle_new (void) + FileHandle *file_handle; + + file_handle = g_new0 (FileHandle, 1); ++ file_handle->refcount = 1; + file_handle->mutex = g_mutex_new (); + file_handle->op = FILE_OP_NONE; + + return file_handle; + } + ++static FileHandle * ++file_handle_ref (FileHandle *file_handle) ++{ ++ g_atomic_int_inc (&file_handle->refcount); ++ return file_handle; ++} ++ ++static gboolean ++file_handle_unref (FileHandle *file_handle) ++{ ++ return g_atomic_int_dec_and_test (&file_handle->refcount); ++} ++ + static void + file_handle_close_stream (FileHandle *file_handle) + { +@@ -278,21 +294,19 @@ reindex_file_handle_for_path (const gcha + g_static_mutex_unlock (&global_mutex); + } + +-static gboolean ++static void + free_file_handle_for_path (const gchar *path) + { + FileHandle *fh; + +- fh = get_file_handle_for_path (path); ++ g_static_mutex_lock (&global_mutex); ++ fh = g_hash_table_lookup (global_fh_table, path); + if (fh) + { +- g_static_mutex_lock (&global_mutex); +- g_hash_table_remove (global_fh_table, path); +- g_static_mutex_unlock (&global_mutex); +- return TRUE; ++ if (file_handle_unref (fh)) ++ g_hash_table_remove (global_fh_table, path); + } +- +- return FALSE; ++ g_static_mutex_unlock (&global_mutex); + } + + static MountRecord * +@@ -923,6 +937,7 @@ vfs_open (const gchar *path, struct fuse + + /* File exists */ + ++ file_handle_ref (fh); + SET_FILE_HANDLE (fi, fh); + + debug_print ("vfs_open: flags=%o\n", fi->flags); +@@ -1013,6 +1028,7 @@ vfs_create (const gchar *path, mode_t mo + + /* Success */ + ++ file_handle_ref (fh); + SET_FILE_HANDLE (fi, fh); + + g_assert (fh->stream == NULL); +@@ -1047,7 +1063,10 @@ vfs_release (const gchar *path, struct f + debug_print ("vfs_release: %s\n", path); + + if (fh) +- free_file_handle_for_path (path); ++ { ++ if (!file_handle_unref (fh)) ++ free_file_handle_for_path (path); ++ } + + return 0; + } diff --git a/gvfs.changes b/gvfs.changes index 329d907..7273383 100644 --- a/gvfs.changes +++ b/gvfs.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu May 8 08:10:49 CEST 2008 - hpj@suse.de + +- Add gvfs-bnc368628-fuse-robustness.patch, which probably fixes + BNC #368628. + ------------------------------------------------------------------- Wed Apr 9 23:32:06 CEST 2008 - maw@suse.de diff --git a/gvfs.spec b/gvfs.spec index 2992d96..9987138 100644 --- a/gvfs.spec +++ b/gvfs.spec @@ -25,12 +25,14 @@ BuildRequires: extra-rpm-macros %endif Summary: VFS functionality for GLib Version: 0.2.3 -Release: 1 +Release: 13 License: LGPL v2.0 or later Group: Development/Libraries/C and C++ Source0: %{name}-%{version}.tar.bz2 # PATCH-FIX-UPSTREAM gvfs-no-shebang.patch bgo523420 maw@suse.de -- Is this even worth upstreaming? Patch0: gvfs-no-shebang.patch +# PATCH-FIX-UPSTREAM gvfs-bnc368628-fuse-robustness.patch bnc368628 hpj@novell.com +Patch1: gvfs-bnc368628-fuse-robustness.patch Url: http://www.gnome.org BuildRoot: %{_tmppath}/%{name}-%{version}-build AutoReqProv: on @@ -117,6 +119,7 @@ Authors: %prep %setup -n %{name}-%{version} %patch0 -p1 +%patch1 -p1 %build export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" @@ -171,6 +174,9 @@ chmod -x $RPM_BUILD_ROOT/%{_sysconfdir}/profile.d/* %files lang -f %{name}.lang %changelog +* Thu May 08 2008 hpj@suse.de +- Add gvfs-bnc368628-fuse-robustness.patch, which probably fixes + BNC #368628. * Thu Apr 10 2008 maw@suse.de - Update to version 0.2.3: + WebDAV: implement set_display_name