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

Reply via email to