summaryrefslogtreecommitdiff
path: root/sysutils/fusefs-sshfs/files/patch-sshfs.c
blob: 825af6035b3742101cd089faae4ff31e35b0f7ee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
--- sshfs.c.orig	Fri Aug 18 10:38:37 2006 +0000
+++ sshfs.c	Fri Sep 29 14:22:54 2006 +0000
@@ -147,6 +147,7 @@ struct sshfs_file {
     int is_seq;
     int connver;
     int modifver;
+    int refs;
 };
 
 struct sshfs {
@@ -1768,6 +1769,7 @@ static int sshfs_open_common(const char 
     pthread_cond_init(&sf->write_finished, NULL);
     /* Assume random read after open */
     sf->is_seq = 0;
+    sf->refs = 1;
     sf->next_pos = 0;
     sf->modifver= sshfs.modifver;
     sf->connver = sshfs.connver;
@@ -1851,6 +1853,19 @@ static int sshfs_fsync(const char *path,
     return sshfs_flush(path, fi);
 }
 
+static void sshfs_file_put(struct sshfs_file *sf)
+{
+    sf->refs--;
+    if (!sf->refs)
+        g_free(sf);
+}
+
+static struct sshfs_file *sshfs_file_get(struct sshfs_file *sf)
+{
+    sf->refs++;
+    return sf;
+}
+
 static int sshfs_release(const char *path, struct fuse_file_info *fi)
 {
     struct sshfs_file *sf = get_sshfs_file(fi);
@@ -1861,7 +1876,7 @@ static int sshfs_release(const char *pat
     }
     buf_free(handle);
     chunk_put_locked(sf->readahead);
-    g_free(sf);
+    sshfs_file_put(sf);
     return 0;
 }
 
@@ -2084,6 +2099,7 @@ static void sshfs_write_end(struct reque
     }
     list_del(&req->list);
     pthread_cond_broadcast(&sf->write_finished);
+    sshfs_file_put(sf);
 }
 
 static int sshfs_write(const char *path, const char *wbuf, size_t size,
@@ -2110,7 +2126,7 @@ static int sshfs_write(const char *path,
     iov[1].iov_len = size;
     if (!sshfs.sync_write && !sf->write_error)
         err = sftp_request_send(SSH_FXP_WRITE, iov, 2, sshfs_write_begin,
-                                 sshfs_write_end, 0, sf, NULL);
+                                 sshfs_write_end, 0, sshfs_file_get(sf), NULL);
     else
         err = sftp_request_iov(SSH_FXP_WRITE, iov, 2, SSH_FXP_STATUS, NULL);
     buf_free(&buf);