diff options
author | Steve French <sfrench@us.ibm.com> | 2005-12-31 10:27:22 -0800 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2005-12-31 10:27:22 -0800 |
commit | eea60caef610c7a6c58c0de9c80ae1e438e01301 (patch) | |
tree | 25e19289bba003fe085e589430d0d981fd6b73a7 /fs/nfs/file.c | |
parent | da8543ef125afc7bba4da526b61a1ae07dc25109 (diff) | |
parent | 82c9df820112c6286a8e8fbe482e94b65b49062c (diff) | |
download | kernel-crypto-eea60caef610c7a6c58c0de9c80ae1e438e01301.tar.gz kernel-crypto-eea60caef610c7a6c58c0de9c80ae1e438e01301.tar.xz kernel-crypto-eea60caef610c7a6c58c0de9c80ae1e438e01301.zip |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/nfs/file.c')
-rw-r--r-- | fs/nfs/file.c | 26 |
1 files changed, 6 insertions, 20 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 57d3e77d97e..7a79fbe9f53 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -433,11 +433,7 @@ static int do_unlk(struct file *filp, int cmd, struct file_lock *fl) * Flush all pending writes before doing anything * with locks.. */ - filemap_fdatawrite(filp->f_mapping); - down(&inode->i_sem); - nfs_wb_all(inode); - up(&inode->i_sem); - filemap_fdatawait(filp->f_mapping); + nfs_sync_mapping(filp->f_mapping); /* NOTE: special case * If we're signalled while cleaning up locks on process exit, we @@ -465,15 +461,8 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl) * Flush all pending writes before doing anything * with locks.. */ - status = filemap_fdatawrite(filp->f_mapping); - if (status == 0) { - down(&inode->i_sem); - status = nfs_wb_all(inode); - up(&inode->i_sem); - if (status == 0) - status = filemap_fdatawait(filp->f_mapping); - } - if (status < 0) + status = nfs_sync_mapping(filp->f_mapping); + if (status != 0) goto out; lock_kernel(); @@ -497,11 +486,7 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl) * Make sure we clear the cache whenever we try to get the lock. * This makes locking act as a cache coherency point. */ - filemap_fdatawrite(filp->f_mapping); - down(&inode->i_sem); - nfs_wb_all(inode); /* we may have slept */ - up(&inode->i_sem); - filemap_fdatawait(filp->f_mapping); + nfs_sync_mapping(filp->f_mapping); nfs_zap_caches(inode); out: rpc_clnt_sigunmask(NFS_CLIENT(inode), &oldset); @@ -524,7 +509,8 @@ static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) return -EINVAL; /* No mandatory locks over NFS */ - if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) + if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID && + fl->fl_type != F_UNLCK) return -ENOLCK; if (IS_GETLK(cmd)) |