File 0014-fuse-Fix-emulation-of-open-call.patch of Package libguestfs
From 2230c05ebf3c334bc53c53bbd890fe5cb1d358ad Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones@redhat.com>
Date: Tue, 7 Dec 2010 14:49:34 +0000
Subject: [PATCH 14/72] fuse: Fix emulation of open call.
We were being over-complex in this call. All the FUSE API requires
this call to do is to check permissions.
(cherry picked from commit de419e4bace5d5be58a87d76f0c63ec39f327d1a)
---
fuse/guestmount.c | 47 +++++------------------------------------------
1 files changed, 5 insertions(+), 42 deletions(-)
diff --git a/fuse/guestmount.c b/fuse/guestmount.c
index 1b3abf9..8fe9122 100644
--- a/fuse/guestmount.c
+++ b/fuse/guestmount.c
@@ -535,53 +535,16 @@ fg_utimens (const char *path, const struct timespec ts[2])
return 0;
}
-/* This call is quite hard to emulate through the guestfs(3) API. In
- * one sense it's a little like access (see above) because it tests
- * whether opening a file would succeed given the flags. But it also
- * has side effects such as truncating the file if O_TRUNC is given.
- * Therefore we need to emulate it ... painfully.
+/* All this function needs to do is to check that the requested open
+ * flags are valid. See the notes in <fuse/fuse.h>.
*/
static int
fg_open (const char *path, struct fuse_file_info *fi)
{
- int r, exists;
+ int flags = fi->flags & 3;
- if (fi->flags & O_WRONLY) {
- if (read_only)
- return -EROFS;
- }
-
- exists = guestfs_exists (g, path);
- if (exists == -1)
- return error ();
-
- if (fi->flags & O_CREAT) {
- if (read_only)
- return -EROFS;
-
- dir_cache_invalidate (path);
-
- /* Exclusive? File must not exist already. */
- if (fi->flags & O_EXCL) {
- if (exists)
- return -EEXIST;
- }
-
- /* Create? Touch it and optionally truncate it. */
- r = guestfs_touch (g, path);
- if (r == -1)
- return error ();
-
- if (fi->flags & O_TRUNC) {
- r = guestfs_truncate (g, path);
- if (r == -1)
- return error ();
- }
- } else {
- /* Not create, just check it exists. */
- if (!exists)
- return -ENOENT;
- }
+ if (read_only && flags != O_RDONLY)
+ return -EROFS;
return 0;
}
--
1.7.1