Wow, thanks Matt! - a
Matt Benjamin <[EMAIL PROTECTED]> writes: > Adam, > > There is work ongoing to improve the Unix-like clients' locking > support. At the moment, I don't think OpenAFS 1.4 or 1.5 have an easy > way to do (either notion you suggested of ) what you want, but, it was > easy to hack up a patch to do your first suggestion (I didn't want to > think about the second one). > > ** disclaimer: hackery ** > > Somewhat tested, only on i386 Linux 2.6. Not reviewed. Uses C ioctl > space (seems like should be O, but that's not really in 1.4.2, at > least). Not what we'll be configuring in future, really, because Unix > client locking options are increased with new features. Still, people > should have the freedom to disable "no-op" byte range locks. > > Matt > > Adam Megacz wrote: >> Is there any way to set the Linux OpenAFS client to simply refuse all >> requests for byte-range locks? >> >> Barring that, is there a way to find out which file the message "afs: >> byte-range lock/unlock ignored; make sure no one else is running this >> program" refers to? >> >> - a >> >> > > > -- > > Matt Benjamin > > The Linux Box > 206 South Fifth Ave. Suite 150 > Ann Arbor, MI 48104 > > http://linuxbox.com > > tel. 734-761-4689 > fax. 734-769-8938 > cel. 734-216-5309 > > > 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
