summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorRohan Puri <[email protected]>2011-06-29 11:00:58 -0700
committerBrian Behlendorf <[email protected]>2011-07-01 13:39:40 -0700
commita89c3e0bd509267225b5699c65aaf39acf2fce18 (patch)
treeff9588be2ce4bd352a220df504aa35c65a5c1459 /module
parent2cf7f52bc42f215d4ef27d0fd75fc1b1417cb841 (diff)
Support mandatory locks (nbmand)
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 <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #222 Closes #253
Diffstat (limited to 'module')
-rw-r--r--module/zfs/zfs_vnops.c19
-rw-r--r--module/zfs/zfs_znode.c11
2 files changed, 9 insertions, 21 deletions
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
index c32b2a39f..828253f96 100644
--- a/module/zfs/zfs_vnops.c
+++ b/module/zfs/zfs_vnops.c
@@ -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
/*
diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c
index 076161a85..a51d5e6f3 100644
--- a/module/zfs/zfs_znode.c
+++ b/module/zfs/zfs_znode.c
@@ -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);