Is there any chance of this patch -- or something close to it -- being
integrated into OpenAFS?

  - a


Matt Benjamin <[EMAIL PROTECTED]> writes:
> diff -Nur openafs-1.4.2/src/afs/afs_pioctl.c 
> openafs-1.4.2-lockhack/src/afs/afs_pioctl.c
> --- openafs-1.4.2/src/afs/afs_pioctl.c        2006-03-02 01:44:05.000000000 
> -0500
> +++ openafs-1.4.2-lockhack/src/afs/afs_pioctl.c       2007-01-28 
> 15:12:49.000000000 -0500
> @@ -90,6 +90,9 @@
>  DECL_PIOCTL(PPrefetchFromTape);
>  DECL_PIOCTL(PResidencyCmd);
>  DECL_PIOCTL(PCallBackAddr);
> +DECL_PIOCTL(PGetRangeLockFlags);
> +DECL_PIOCTL(PSetRangeLockFlags);
> +DECL_PIOCTL(PNoOp);
>  
>  /*
>   * A macro that says whether we're going to need HandleClientContext().
> @@ -192,6 +195,13 @@
>       PNewAlias,              /* 1 -- create new cell alias */
>       PListAliases,           /* 2 -- list cell aliases */
>       PCallBackAddr,          /* 3 -- request addr for callback rxcon */
> +     PNoOp, /* placeholders, known to be in 1.5 plus rxk5 */
> +     PNoOp,
> +     PNoOp,
> +     PNoOp,
> +     PNoOp,
> +     PGetRangeLockFlags, /* 9 - get range lock flag set */
> +     PSetRangeLockFlags, /* 10 - set range lock flag set */
>  };
>  
>  #define PSetClientContext 99 /*  Special pioctl to setup caller's creds  */
> @@ -3927,3 +3937,33 @@
>  #endif /* UKERNEL */
>      return 0;
>  }
> +
> +DECL_PIOCTL(PNoOp)
> +{
> +
> +    afs_warn("no op pioctl\n");
> +
> +    return 0;
> +}
> +
> +DECL_PIOCTL(PGetRangeLockFlags)
> +{
> +    memcpy(aout, (char *)&range_lock_flags, sizeof(afs_int32));
> +    *aoutSize = sizeof(afs_int32);
> +
> +    return 0;
> +}
> +
> +DECL_PIOCTL(PSetRangeLockFlags)
> +{
> +    afs_int32 tmpval;
> +
> +    if (!afs_osi_suser(*acred))
> +     return EPERM;
> +    if (ainSize != sizeof(afs_int32) || ain == NULL)
> +     return EINVAL;
> +    memcpy((char *)&tmpval, ain, sizeof(afs_int32));
> +    range_lock_flags = tmpval;
> +
> +    return 0;
> +}
> diff -Nur openafs-1.4.2/src/afs/afs_prototypes.h 
> openafs-1.4.2-lockhack/src/afs/afs_prototypes.h
> --- openafs-1.4.2/src/afs/afs_prototypes.h    2006-08-14 18:12:22.000000000 
> -0400
> +++ openafs-1.4.2-lockhack/src/afs/afs_prototypes.h   2007-01-28 
> 14:16:13.000000000 -0500
> @@ -934,7 +934,7 @@
>                     int clid);
>  extern int HandleFlock(register struct vcache *avc, int acom,
>                      struct vrequest *areq, pid_t clid, int onlymine);
> -
> +extern afs_int32 range_lock_flags;
>  
>  
>  /* VNOPS/afs_vnop_lookup.c */
> diff -Nur openafs-1.4.2/src/afs/VNOPS/afs_vnop_flock.c 
> openafs-1.4.2-lockhack/src/afs/VNOPS/afs_vnop_flock.c
> --- openafs-1.4.2/src/afs/VNOPS/afs_vnop_flock.c      2006-06-02 
> 17:23:52.000000000 -0400
> +++ openafs-1.4.2-lockhack/src/afs/VNOPS/afs_vnop_flock.c     2007-01-28 
> 15:37:06.000000000 -0500
> @@ -26,6 +26,9 @@
>  #include "afs/afs_osidnlc.h"
>  #include "afs/unified_afs.h"
>  
> +/* Exported variables */
> +afs_int32 range_lock_flags = 0;
> +
>  /* Static prototypes */
>  static int HandleGetLock(register struct vcache *avc,
>                        register struct AFS_FLOCK *af,
> @@ -465,8 +468,12 @@
>  
>      /* otherwise, it is time to nag the user */
>      lastWarnTime = now;
> -    afs_warn
> -     ("afs: byte-range lock/unlock ignored; make sure no one else is running 
> this program.\n");
> +    if(range_lock_flags & 0x0000001)
> +         afs_warn
> +                 ("afs: byte-range lock/unlock request refused per 
> settings");
> +    else
> +         afs_warn
> +                 ("afs: byte-range lock/unlock ignored; make sure no one 
> else is running this program.\n");
>  }
>  
>  
> @@ -550,9 +557,14 @@
>      /* next line makes byte range locks always succeed,
>       * even when they should block */
>      if (af->l_whence != 0 || af->l_start != 0 || af->l_len != 0) {
> -     DoLockWarning();
> -     afs_PutFakeStat(&fakestate);
> -     return 0;
> +         int r = 0;
> +         /* unless the client would prefer they always fail */
> +         if(range_lock_flags & 0x00000001) {
> +                 r = EINVAL;
> +         }
> +         DoLockWarning();
> +         afs_PutFakeStat(&fakestate);
> +         return r;
>      }
>      /* otherwise we can turn this into a whole-file flock */
>      if (af->l_type == F_RDLCK)
> diff -Nur openafs-1.4.2/src/config/venus.h 
> openafs-1.4.2-lockhack/src/config/venus.h
> --- openafs-1.4.2/src/config/venus.h  2005-05-08 02:18:12.000000000 -0400
> +++ openafs-1.4.2-lockhack/src/config/venus.h 2007-01-28 14:58:15.000000000 
> -0500
> @@ -181,5 +181,8 @@
>  #define VIOC_NEWALIAS                _CVICEIOCTL(1)  /* create new cell 
> alias */
>  #define VIOC_GETALIAS                _CVICEIOCTL(2)  /* get alias info */
>  #define VIOC_CBADDR          _CVICEIOCTL(3)  /* push callback addr */
> +#define VIOC_GETRANGELOCKFLAGS        _CVICEIOCTL(9) /* Get range lockctl 
> flags */
> +#define VIOC_SETRANGELOCKFLAGS        _CVICEIOCTL(10) /* Set range lockctl 
> flags */
> +
>  
>  #endif /* AFS_VENUS_H */
> diff -Nur openafs-1.4.2/src/venus/fs.c openafs-1.4.2-lockhack/src/venus/fs.c
> --- openafs-1.4.2/src/venus/fs.c      2006-07-31 13:07:52.000000000 -0400
> +++ openafs-1.4.2-lockhack/src/venus/fs.c     2007-01-28 15:11:12.000000000 
> -0500
> @@ -20,6 +20,7 @@
>  #include <netdb.h>
>  #include <errno.h>
>  #include <stdio.h>
> +#include <ctype.h>
>  #include <netinet/in.h>
>  #include <sys/stat.h>
>  #include <afs/stds.h>
> @@ -3131,6 +3132,61 @@
>      return 0;
>  }
>  
> +static afs_int32
> +SetRangeLockFlagsCmd(struct cmd_syndesc *as, char *arock)
> +{
> +    afs_int32 code = 0, flags, digit, flags_len, ix;
> +    struct ViceIoctl blob;
> +    char *tp;
> +
> +    tp = as->parms[0].items->data;
> +    flags_len = strlen(tp);
> +    digit = 1; 
> +    for(ix = 0; ix < flags_len; ++ix) {
> +         if(!isdigit(tp[0])) {
> +                 digit = 0;
> +                 break;
> +         }
> +    }
> +    if (digit == 0) {
> +     fprintf(stderr, "%s: %s must be an undecorated digit string.\n", pn, 
> tp);
> +     return EINVAL;
> +    }
> +    flags = atoi(tp);
> +
> +    blob.in = (char *)&flags;
> +    blob.in_size = sizeof(flags);
> +    blob.out_size = 0;
> +    code = pioctl(0, VIOC_SETRANGELOCKFLAGS, &blob, 1);
> +    if (code)
> +     Die(errno, NULL);
> +    return 0;
> +}
> +
> +static afs_int32
> +GetRangeLockFlagsCmd(struct cmd_syndesc *as, char *arock)
> +{
> +    afs_int32 code = 0, flags;
> +    struct ViceIoctl blob;
> +    char *tp;
> +
> +    blob.in = NULL;
> +    blob.in_size = 0;
> +    blob.out_size = sizeof(flags);
> +    blob.out = space;
> +
> +    code = pioctl(0, VIOC_GETRANGELOCKFLAGS, &blob, 1);
> +
> +    if (code)
> +     Die(errno, NULL);
> +    else {
> +     tp = space;
> +     memcpy(&flags, tp, sizeof(afs_int32));
> +     printf("Client range lock flags currently %d\n", flags);
> +    }
> +    return 0;
> +}
> +
>  #include "AFS_component_version_number.c"
>  
>  int
> @@ -3422,6 +3478,14 @@
>      ts = cmd_CreateSyntax("getcrypt", GetCryptCmd, 0,
>                         "get cache manager encryption flag");
>  
> +    ts = cmd_CreateSyntax("setrangelockflags", SetRangeLockFlagsCmd, 0,
> +                       "set cache manager byte-range lock behavior flags");
> +    cmd_AddParm(ts, "-flagset", CMD_SINGLE, 0, 
> +             "flag set (0 default, 01 fail range requests)");
> +
> +    ts = cmd_CreateSyntax("getrangelockflags", GetRangeLockFlagsCmd, 0,
> +                       "get cache manager byte-range lock behavior flags");
> +
>      ts = cmd_CreateSyntax("rxstatproc", RxStatProcCmd, 0,
>                         "Manage per process RX statistics");
>      cmd_AddParm(ts, "-enable", CMD_FLAG, CMD_OPTIONAL, "Enable RX stats");

-- 
PGP/GPG: 5C9F F366 C9CF 2145 E770  B1B8 EFB1 462D A146 C380

_______________________________________________
OpenAFS-devel mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to