annotate src/lib/nfs-workarounds.c @ 6813:575235932194 HEAD

nfs_safe_link(): Support linking files without original link count=1. Use it when copying maildir files, but only if mail_nfs_storage=yes.
author Timo Sirainen <tss@iki.fi>
date Fri, 16 Nov 2007 03:50:15 +0200
parents 9bc620b934f4
children 8573124a89b3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
1 /* Copyright (c) 2006-2007 Dovecot authors, see the included COPYING file */
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
2
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
3 /*
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
4 These tests were done with various Linux 2.6 kernels, FreeBSD 6.2 and
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
5 Solaris 8 and 10.
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
6
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
7 Attribute cache is usually flushed with chown()ing or fchown()ing the file.
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
8 The safest way would be to use uid=-1 gid=-1, but this doesn't work with
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
9 Linux (it does with FreeBSD 6.2 and Solaris). So we'll first get the
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
10 file's owner and use it. As long as we're not root the file's owner can't
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
11 change accidentally. If would be possible to also use chmod()/fchmod(), but
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
12 that's riskier since it could actually cause an unwanted change.
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
13
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
14 Write cache can be flushed with fdatasync(). It's all we need, but other
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
15 tested alternatives are: fcntl locking (Linux 2.6, Solaris),
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
16 fchown() (Solaris) and dup()+close() (Linux 2.6, Solaris).
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
17
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
18 Read cache flushing is more problematic. There's no universal way to do it.
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
19 The working methods are:
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
20
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
21 Linux 2.6: fcntl(), O_DIRECT
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
22 Solaris: fchown(), fcntl(), dup()+close()
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
23 FreeBSD 6.2: fchown()
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
24
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
25 fchown() can be easily used for Solaris and FreeBSD, but Linux requires
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
26 playing with locks. O_DIRECT requires CONFIG_NFS_DIRECTIO to be enabled, so
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
27 we can't always use it.
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
28 */
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 #include "lib.h"
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 #include "nfs-workarounds.h"
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 #include <fcntl.h>
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 #include <unistd.h>
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 #include <sys/stat.h>
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
37 #ifdef __linux__
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
38 # define READ_CACHE_FLUSH_FCNTL
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
39 #endif
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
40
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
41 static int
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
42 nfs_safe_do(const char *path, int (*callback)(const char *path, void *context),
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
43 void *context)
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 {
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 const char *dir = NULL;
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 struct stat st;
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 unsigned int i;
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
48 int ret;
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 t_push();
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 for (i = 1;; i++) {
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
52 ret = callback(path, context);
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
53 if (ret == 0 || errno != ESTALE || i == NFS_ESTALE_RETRY_COUNT)
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 break;
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 /* ESTALE: Some operating systems may fail with this if they
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 can't internally revalidating the NFS handle. It may also
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 happen if the parent directory has been deleted. If the
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 directory still exists, try reopening the file. */
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (dir == NULL) {
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 dir = strrchr(path, '/');
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 if (dir == NULL)
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 break;
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 dir = t_strdup_until(path, dir);
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
65 }
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
66 nfs_flush_attr_cache(dir, FALSE);
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 if (stat(dir, &st) < 0) {
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 /* maybe it's gone or something else bad happened to
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 it. in any case we can't open the file, so fail
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 with the original ESTALE error and let our caller
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 handle it. */
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 errno = ESTALE;
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 break;
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 /* directory still exists, try reopening */
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 t_pop();
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
79 return ret;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
80 }
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
81
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
82 struct nfs_safe_open_context {
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
83 int flags;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
84 int fd;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
85 };
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
86
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
87 static int nfs_safe_open_callback(const char *path, void *context)
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
88 {
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
89 struct nfs_safe_open_context *ctx = context;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
90
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
91 ctx->fd = open(path, ctx->flags);
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
92 return ctx->fd == -1 ? -1 : 0;
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 }
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
94
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
95 int nfs_safe_open(const char *path, int flags)
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
96 {
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
97 struct nfs_safe_open_context ctx;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
98
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
99 i_assert((flags & O_CREAT) == 0);
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
100
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
101 ctx.flags = flags;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
102 if (nfs_safe_do(path, nfs_safe_open_callback, &ctx) < 0)
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
103 return -1;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
104
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
105 return ctx.fd;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
106 }
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
107
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
108 static int nfs_safe_stat_callback(const char *path, void *context)
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
109 {
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
110 struct stat *buf = context;
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
111
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
112 return stat(path, buf);
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
113 }
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
114
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
115 int nfs_safe_stat(const char *path, struct stat *buf)
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
116 {
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
117 return nfs_safe_do(path, nfs_safe_stat_callback, buf);
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4071
diff changeset
118 }
5968
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
119
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
120 static int nfs_safe_lstat_callback(const char *path, void *context)
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
121 {
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
122 struct stat *buf = context;
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
123
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
124 return lstat(path, buf);
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
125 }
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
126
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
127 int nfs_safe_lstat(const char *path, struct stat *buf)
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
128 {
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
129 return nfs_safe_do(path, nfs_safe_lstat_callback, buf);
885ed4d5c51d Added nfs_safe_lstat()
Timo Sirainen <tss@iki.fi>
parents: 4225
diff changeset
130 }
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
131
6813
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
132 int nfs_safe_link(const char *oldpath, const char *newpath, bool links1)
6811
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
133 {
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
134 struct stat st;
6813
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
135 nlink_t orig_link_count = 1;
6811
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
136
6813
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
137 if (!links1) {
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
138 if (stat(oldpath, &st) < 0)
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
139 return -1;
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
140 orig_link_count = st.st_nlink;
6811
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
141 }
6813
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
142
6811
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
143 if (link(oldpath, newpath) == 0) {
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
144 #ifndef __FreeBSD__
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
145 return 0;
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
146 #endif
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
147 /* FreeBSD at least up to v6.2 converts EEXIST errors to
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
148 success. */
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
149 } else if (errno != EEXIST)
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
150 return -1;
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
151
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
152 /* We don't know if it succeeded or failed. stat() to make sure. */
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
153 if (stat(oldpath, &st) < 0)
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
154 return -1;
6813
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6811
diff changeset
155 if (st.st_nlink == orig_link_count) {
6811
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
156 errno = EEXIST;
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
157 return -1;
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
158 }
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
159 return 0;
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
160 }
9bc620b934f4 Added nfs_safe_link().
Timo Sirainen <tss@iki.fi>
parents: 6797
diff changeset
161
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
162 static bool nfs_flush_fchown_uid(const char *path, int fd)
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
163 {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
164 struct stat st;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
165
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
166 if (fstat(fd, &st) < 0) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
167 if (errno == ESTALE) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
168 /* ESTALE causes the OS to flush the attr cache */
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
169 return FALSE;
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
170 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
171 i_error("nfs_flush_fchown_uid: fstat(%s) failed: %m", path);
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
172 return TRUE;
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
173 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
174 if (fchown(fd, st.st_uid, (gid_t)-1) < 0) {
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
175 if (errno == ESTALE) {
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
176 return FALSE;
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
177 }
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
178 if (errno == EACCES || errno == EPERM) {
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
179 /* attr cache is flushed */
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
180 return TRUE;
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
181 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
182
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
183 i_error("nfs_flush_fchown_uid: fchown(%s) failed: %m", path);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
184 }
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
185 return TRUE;
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
186 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
187
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
188 static void nfs_flush_chown_uid(const char *path)
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
189 {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
190 struct stat st;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
191
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
192 if (stat(path, &st) < 0) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
193 if (errno == ESTALE) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
194 /* ESTALE causes the OS to flush the attr cache */
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
195 return;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
196 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
197 if (errno != ENOENT) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
198 i_error("nfs_flush_chown_uid: stat(%s) failed: %m",
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
199 path);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
200 return;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
201 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
202
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
203 /* flush a negative cache entry. use effective UID to chown.
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
204 it probably doesn't really matter what UID is used, because
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
205 as long as we're not root we don't have permission to really
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
206 change it anyway */
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
207 st.st_uid = geteuid();
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
208 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
209 if (chown(path, st.st_uid, (gid_t)-1) < 0) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
210 if (errno == ESTALE || errno == EACCES ||
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
211 errno == EPERM || errno == ENOENT) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
212 /* attr cache is flushed */
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
213 return;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
214 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
215 i_error("nfs_flush_chown_uid: chown(%s) failed: %m", path);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
216 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
217 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
218
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
219 #ifdef READ_CACHE_FLUSH_FCNTL
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
220 static void nfs_flush_fcntl(const char *path, int fd, int old_lock_type)
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
221 {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
222 struct flock fl;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
223 int ret;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
224
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
225 /* If the file was already locked, we'll just get the same lock
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
226 again. It should succeed just fine. If was was unlocked, we'll
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
227 have to get a lock and then unlock it. Linux 2.6 flushes read cache
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
228 only when read/write locking succeeded. */
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
229 fl.l_type = old_lock_type != F_UNLCK ? old_lock_type : F_RDLCK;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
230 fl.l_whence = SEEK_SET;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
231 fl.l_start = 0;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
232 fl.l_len = 0;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
233
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
234 alarm(60);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
235 ret = fcntl(fd, F_SETLKW, &fl);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
236 alarm(0);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
237
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
238 if (ret < 0) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
239 i_error("nfs_flush_fcntl: fcntl(%s, F_RDLCK) failed: %m", path);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
240 return;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
241 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
242
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
243 if (old_lock_type == F_UNLCK) {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
244 fl.l_type = F_UNLCK;
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
245 (void)fcntl(fd, F_SETLKW, &fl);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
246 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
247 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
248 #endif
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
249
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
250 void nfs_flush_attr_cache(const char *path, bool flush_dir)
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
251 {
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
252 const char *p;
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
253
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
254 if (flush_dir) {
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
255 p = strrchr(path, '/');
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
256 if (p == NULL)
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
257 nfs_flush_chown_uid(".");
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
258 else {
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
259 t_push();
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
260 nfs_flush_chown_uid(t_strdup_until(path, p));
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
261 t_pop();
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
262 }
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
263 }
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
264 nfs_flush_chown_uid(path);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
265 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
266
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
267 bool nfs_flush_attr_cache_fd(const char *path, int fd)
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
268 {
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
269 return nfs_flush_fchown_uid(path, fd);
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
270 }
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
271
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
272 void nfs_flush_read_cache(const char *path, int fd,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5970
diff changeset
273 int lock_type ATTR_UNUSED,
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5970
diff changeset
274 bool just_locked ATTR_UNUSED)
5970
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
275 {
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
276 #ifdef READ_CACHE_FLUSH_FCNTL
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
277 if (!just_locked)
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
278 nfs_flush_fcntl(path, fd, lock_type);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
279 #else
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
280 /* FreeBSD, Solaris */
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
281 nfs_flush_fchown_uid(path, fd);
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
282 #endif
a290b84d144a Added nfs_flush_attr_cache() and nfs_flush_read_cache().
Timo Sirainen <tss@iki.fi>
parents: 5968
diff changeset
283 }