Date: Mon, 18 Nov 2002 20:19:30 -0800 From: Terry Lambert <tlambert2@mindspring.com> To: "Clark C. Evans" <cce@clarkevans.com> Cc: freebsd-hackers@freebsd.org Subject: Re: cd9660 and fcntl (shared locks) Message-ID: <3DD9BBD2.E622B74F@mindspring.com> References: <20021119032023.GA54980@doublegemini.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------A92E3CA1A58A73776799BC8D Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit "Clark C. Evans" wrote: > When I open a file mounted via cd9660 as O_RDONLY and then flock(fd,LOCK_SH) > it returns invalid argument; is there a reason why the cd-rom file > system can't just return success here, make flock a no-op that is always > successful? There are many cases where you want general code to use > shared locks on files opened for reading to make sure that it doesn't > get changed during the read. This general code should be useable on > file systems mounted read only. > > Thoughts? Is there an easy patch? FreeBSD implements advisory locking wrong; I've tried to get it fixed several times, but no one is interested. It looks like someone started to add suport, but then didn't, and perpetuated the implementation problem. Here is a patch which finishes adding add advisory locking support to isofs (wrong way to do it, but only way to do it without changing VOP_ADVLOCK semantics). -- Terry --------------A92E3CA1A58A73776799BC8D Content-Type: text/plain; charset=us-ascii; name="cd9660.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cd9660.diff" Index: isofs/cd9660/cd9660_vnops.c =================================================================== RCS file: /cvs/src/sys/isofs/cd9660/cd9660_vnops.c,v retrieving revision 1.80 diff -c -r1.80 cd9660_vnops.c *** isofs/cd9660/cd9660_vnops.c 28 Sep 2002 17:14:52 -0000 1.80 --- isofs/cd9660/cd9660_vnops.c 19 Nov 2002 00:13:27 -0000 *************** *** 53,58 **** --- 53,59 ---- #include <sys/dirent.h> #include <sys/unistd.h> #include <sys/filio.h> + #include <sys/lockf.h> #include <vm/vm.h> #include <vm/vnode_pager.h> *************** *** 64,69 **** --- 65,71 ---- static int cd9660_setattr(struct vop_setattr_args *); static int cd9660_access(struct vop_access_args *); + static int cd9660_advlock(struct vop_advlock_args *); static int cd9660_getattr(struct vop_getattr_args *); static int cd9660_ioctl(struct vop_ioctl_args *); static int cd9660_pathconf(struct vop_pathconf_args *); *************** *** 776,787 **** --- 778,808 ---- } /* + * Advisory record locking support + */ + static int + cd9660_advlock(ap) + struct vop_advlock_args /* { + struct vnode *a_vp; + caddr_t a_id; + int a_op; + struct flock *a_fl; + int a_flags; + } */ *ap; + { + struct iso_node *ip = VTOI(ap->a_vp); + + return (lf_advlock(ap, &(ip->i_lockf), ip->i_size)); + } + + /* * Global vfs data structures for cd9660 */ vop_t **cd9660_vnodeop_p; static struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = { { &vop_default_desc, (vop_t *) vop_defaultop }, { &vop_access_desc, (vop_t *) cd9660_access }, + { &vop_advlock_desc, (vop_t *) cd9660_advlock }, { &vop_bmap_desc, (vop_t *) cd9660_bmap }, { &vop_cachedlookup_desc, (vop_t *) cd9660_lookup }, { &vop_getattr_desc, (vop_t *) cd9660_getattr }, --------------A92E3CA1A58A73776799BC8D-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3DD9BBD2.E622B74F>