[Pvfs2-developers] read-only mounts

Phil Carns carns at mcs.anl.gov
Tue Feb 19 17:16:26 EST 2008


Hunh- I'm not sure when that quit working.  I think your changes look 
fine, though.

-Phil

Pete Wyckoff wrote:
> carns at mcs.anl.gov 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);



More information about the Pvfs2-developers mailing list