Support mandatory locks (nbmand)
authorRohan Puri <rohan.puri15@gmail.com>
Wed, 29 Jun 2011 18:00:58 +0000 (11:00 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 1 Jul 2011 20:39:40 +0000 (13:39 -0700)
The Linux kernel already has support for mandatory locking.  This
change just replaces the Solaris mandatory locking calls with the
Linux equivilants.  In fact, it looks like this code could be
removed entirely because this checking is already done generically
in the Linux VFS.  However, for now we'll leave it in place even
if it is redundant just in case we missed something.

The original patch to update the code to support mandatory locking
was done by Rohan Puri.  This patch is an updated version which is
compatible with the previous mount option handling changes.

Original-Patch-by: Rohan Puri <rohan.puri15@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #222
Closes #253

module/zfs/zfs_vnops.c
module/zfs/zfs_znode.c

index c32b2a3..828253f 100644 (file)
@@ -399,18 +399,14 @@ zfs_read(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr)
                return (0);
        }
 
-#ifdef HAVE_MANDLOCKS
        /*
         * Check for mandatory locks
         */
-       if (MANDMODE(zp->z_mode)) {
-               if (error = chklock(ip, FREAD,
-                   uio->uio_loffset, uio->uio_resid, uio->uio_fmode, ct)) {
-                       ZFS_EXIT(zsb);
-                       return (error);
-               }
+       if (mandatory_lock(ip) &&
+           !lock_may_read(ip, uio->uio_loffset, uio->uio_resid)) {
+               ZFS_EXIT(zsb);
+               return (EAGAIN);
        }
-#endif /* HAVE_MANDLOCK */
 
        /*
         * If we're in FRSYNC mode, sync out this znode before reading it.
@@ -581,17 +577,14 @@ zfs_write(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr)
                return (EINVAL);
        }
 
-#ifdef HAVE_MANDLOCKS
        /*
         * Check for mandatory locks before calling zfs_range_lock()
         * in order to prevent a deadlock with locks set via fcntl().
         */
-       if (MANDMODE((mode_t)zp->z_mode) &&
-           (error = chklock(ip, FWRITE, woff, n, uio->uio_fmode, ct)) != 0) {
+       if (mandatory_lock(ip) && !lock_may_write(ip, woff, n)) {
                ZFS_EXIT(zsb);
-               return (error);
+               return (EAGAIN);
        }
-#endif /* HAVE_MANDLOCKS */
 
 #ifdef HAVE_UIO_ZEROCOPY
        /*
index 076161a..a51d5e6 100644 (file)
@@ -1324,9 +1324,7 @@ top:
 int
 zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
 {
-#ifdef HAVE_MANDLOCKS
        struct inode *ip = ZTOI(zp);
-#endif /* HAVE_MANDLOCKS */
        dmu_tx_t *tx;
        zfs_sb_t *zsb = ZTOZSB(zp);
        zilog_t *zilog = zsb->z_log;
@@ -1348,17 +1346,14 @@ zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
                        return (error);
        }
 
-#ifdef HAVE_MANDLOCKS
        /*
         * Check for any locks in the region to be freed.
         */
-
-       if (MANDLOCK(ip, (mode_t)mode)) {
+       if (ip->i_flock && mandatory_lock(ip)) {
                uint64_t length = (len ? len : zp->z_size - off);
-               if (error = chklock(ip, FWRITE, off, length, flag, NULL))
-                       return (error);
+               if (!lock_may_write(ip, off, length))
+                       return (EAGAIN);
        }
-#endif /* HAVE_MANDLOCKS */
 
        if (len == 0) {
                error = zfs_trunc(zp, off);