[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.

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 &&
                ((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);
 
 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

Reply via email to