On Feb 19, 2008, at 3:54 PM, Pete Wyckoff wrote:
[EMAIL PROTECTED] wrote on Tue, 19 Feb 2008 14:57 -0500:
You wouldn't have to add read-only export capability- its already
there :)
Have a look at the "ReadOnly" option and comments that go with it in
src/common/misc/server-config.c. I've used it (and the associated
squashing options) a little bit and it seems to work fine. Would
this work
for what you need?
That's awesome. I should have known there would be something like
this.
It's a bit of an overachiever though. I can't readdir. In fact I
could manage a write, however, if the getattr could be faked around.
Looks like there were some issues with 0/1 in these functions. Not
sure if this appeared in the server request cleanup or if it was
already there.
Yep, that could be from the cleanups I made. Sorry about that.
Can you (all) look this over and make sure it is reasonable? Keep
in mind that the enum for PINT_SERVER_REQ_READONLY has value 0, and
_MODIFY is 1. There's a change in prelude.sm, grep for
PINT_SERVER_CHECK_NONE, that I'm a bit unsure about.
-- Pete
readonly symbolic
Change access_type functions from 0/1 to use the enum
PINT_server_req_access_type. There may have been some backward
conditionals in here. This at least makes them all visible,
and fixes a problem with ReadOnly exports where only reads
(but not writes) were forbidden.
---
src/server/io.sm | 6 +++---
src/server/prelude.sm | 13 +++++++++----
src/server/pvfs2-server-req.c | 10 ++++++----
src/server/pvfs2-server.h | 11 ++++++-----
src/server/small-io.sm | 6 +++---
5 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/src/server/io.sm b/src/server/io.sm
index c82d19f..064cf6b 100644
--- a/src/server/io.sm
+++ b/src/server/io.sm
@@ -379,14 +379,14 @@ static PINT_sm_action io_send_completion_ack(
return err;
}
-static inline int PINT_server_req_access_io(
+static enum PINT_server_req_access_type PINT_server_req_access_io(
struct PVFS_server_req *req)
{
if(req->u.io.io_type == PVFS_IO_READ)
{
- return 1;
+ return PINT_SERVER_REQ_READONLY;
}
- return 0;
+ return PINT_SERVER_REQ_MODIFY;
}
PINT_GET_OBJECT_REF_DEFINE(io);
diff --git a/src/server/prelude.sm b/src/server/prelude.sm
index b6662b6..a04c7bd 100644
--- a/src/server/prelude.sm
+++ b/src/server/prelude.sm
@@ -289,15 +289,20 @@ static int iterate_ro_wildcards(struct
filesystem_configuration_s *fsconfig, PVF
return 0;
}
-static int permit_operation(PVFS_fs_id fsid, int read_only,
PVFS_BMI_addr_t client_addr)
+/*
+ * Return zero if this operation should be allowed.
+ */
+static int permit_operation(PVFS_fs_id fsid,
+ enum PINT_server_req_access_type
access_type,
+ PVFS_BMI_addr_t client_addr)
{
int exp_flags = 0;
struct server_configuration_s *serv_config = NULL;
struct filesystem_configuration_s * fsconfig = NULL;
- if (read_only == 1)
+ if (access_type == PINT_SERVER_REQ_READONLY)
{
- return 0;
+ return 0; /* anything that doesn't modify state is okay */
}
serv_config = PINT_get_server_config();
fsconfig = PINT_config_find_fs_id(serv_config, fsid);
@@ -480,7 +485,7 @@ static PINT_sm_action prelude_perm_check(
break;
case PINT_SERVER_CHECK_NONE:
if(squashed_flag &&
- !PINT_server_req_get_access_type(s_op->req) &&
+ PINT_server_req_get_access_type(s_op->req) ==
PINT_SERVER_REQ_MODIFY &&
Yes, I think that's right. If its squashed, and its not read-only,
then return EACCES. The real question is whether all the converted
structs have the proper access types. They all look ok though.
((s_op->req->op == PVFS_SERV_IO) ||
(s_op->req->op == PVFS_SERV_SMALL_IO) ||
(s_op->req->op == PVFS_SERV_TRUNCATE)))
diff --git a/src/server/pvfs2-server-req.c b/src/server/pvfs2-server-
req.c
index f5051fa..60fa4c5 100644
--- a/src/server/pvfs2-server-req.c
+++ b/src/server/pvfs2-server-req.c
@@ -86,14 +86,16 @@ struct PINT_server_req_entry
PINT_server_req_table[] =
#define CHECK_OP(_op_) assert(_op_ ==
PINT_server_req_table[_op_].op_type)
-inline int PINT_server_req_readonly(struct PVFS_server_req *req)
+enum PINT_server_req_access_type PINT_server_req_readonly(
+ struct PVFS_server_req *req)
{
- return 1;
+ return PINT_SERVER_REQ_READONLY;
}
-inline int PINT_server_req_modify(struct PVFS_server_req *req)
+enum PINT_server_req_access_type PINT_server_req_modify(
+ struct PVFS_server_req *req)
{
- return 0;
+ return PINT_SERVER_REQ_MODIFY;
}
enum PINT_server_req_permissions
diff --git a/src/server/pvfs2-server.h b/src/server/pvfs2-server.h
index 90769be..6bfd0ba 100644
--- a/src/server/pvfs2-server.h
+++ b/src/server/pvfs2-server.h
@@ -97,10 +97,10 @@ static inline int
PINT_get_object_ref_##req_name( \
return
0; \
}
-typedef int (*PINT_server_req_access_callback)(struct
PVFS_server_req *req);
-
-int PINT_server_req_readonly(struct PVFS_server_req *req);
-int PINT_server_req_modify(struct PVFS_server_req *req);
+enum PINT_server_req_access_type PINT_server_req_readonly(
+ struct PVFS_server_req *req);
+enum PINT_server_req_access_type PINT_server_req_modify(
+ struct PVFS_server_req *req);
There might be an issue with returning those enums, because they're
not defined everywhere. I remember having to change them back to ints
to try to get the test code to build, but then I just commented out
some of the tests because of more complicated linkage problems. You
might try compiling the tests to make sure, otherwise I'm cool with
this change.
-sam
struct PINT_server_req_params
{
@@ -121,7 +121,8 @@ struct PINT_server_req_params
* Default functions PINT_server_req_readonly and
PINT_server_req_modify
* are used for requests that always require the same access type.
*/
- PINT_server_req_access_callback access_type;
+ enum PINT_server_req_access_type (*access_type)(
+ struct PVFS_server_req *req);
/* Specifies the scheduling policy for the request. In some
cases,
* we can bypass the request scheduler and proceed directly with
the
diff --git a/src/server/small-io.sm b/src/server/small-io.sm
index 38b78c7..3793866 100644
--- a/src/server/small-io.sm
+++ b/src/server/small-io.sm
@@ -241,14 +241,14 @@ static PINT_sm_action small_io_cleanup(
return server_state_machine_complete(smcb);
}
-static inline int PINT_server_req_access_small_io(
+static inline enum PINT_server_req_access_type
PINT_server_req_access_small_io(
struct PVFS_server_req *req)
{
if(req->u.io.io_type == PVFS_IO_READ)
{
- return 1;
+ return PINT_SERVER_REQ_READONLY;
}
- return 0;
+ return PINT_SERVER_REQ_MODIFY;
}
PINT_GET_OBJECT_REF_DEFINE(small_io);
--
1.5.4.1
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers