aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/locks.c14
-rw-r--r--fs/nfsd/nfs4state.c2
-rw-r--r--fs/nfsd/vfs.c2
-rw-r--r--fs/read_write.c2
-rw-r--r--include/linux/fs.h21
5 files changed, 24 insertions, 17 deletions
diff --git a/fs/locks.c b/fs/locks.c
index 43dbc7f566fa..9a3fe0d8285b 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -1119,7 +1119,7 @@ int locks_mandatory_area(int read_write, struct inode *inode,
1119 * If we've been sleeping someone might have 1119 * If we've been sleeping someone might have
1120 * changed the permissions behind our back. 1120 * changed the permissions behind our back.
1121 */ 1121 */
1122 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) 1122 if (__mandatory_lock(inode))
1123 continue; 1123 continue;
1124 } 1124 }
1125 1125
@@ -1761,9 +1761,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,
1761 /* Don't allow mandatory locks on files that may be memory mapped 1761 /* Don't allow mandatory locks on files that may be memory mapped
1762 * and shared. 1762 * and shared.
1763 */ 1763 */
1764 if (IS_MANDLOCK(inode) && 1764 if (mandatory_lock(inode) && mapping_writably_mapped(filp->f_mapping)) {
1765 (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
1766 mapping_writably_mapped(filp->f_mapping)) {
1767 error = -EAGAIN; 1765 error = -EAGAIN;
1768 goto out; 1766 goto out;
1769 } 1767 }
@@ -1887,9 +1885,7 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,
1887 /* Don't allow mandatory locks on files that may be memory mapped 1885 /* Don't allow mandatory locks on files that may be memory mapped
1888 * and shared. 1886 * and shared.
1889 */ 1887 */
1890 if (IS_MANDLOCK(inode) && 1888 if (mandatory_lock(inode) && mapping_writably_mapped(filp->f_mapping)) {
1891 (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
1892 mapping_writably_mapped(filp->f_mapping)) {
1893 error = -EAGAIN; 1889 error = -EAGAIN;
1894 goto out; 1890 goto out;
1895 } 1891 }
@@ -2083,9 +2079,7 @@ static void lock_get_status(char* out, struct file_lock *fl, int id, char *pfx)
2083 out += sprintf(out, "%6s %s ", 2079 out += sprintf(out, "%6s %s ",
2084 (fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ", 2080 (fl->fl_flags & FL_ACCESS) ? "ACCESS" : "POSIX ",
2085 (inode == NULL) ? "*NOINODE*" : 2081 (inode == NULL) ? "*NOINODE*" :
2086 (IS_MANDLOCK(inode) && 2082 mandatory_lock(inode) ? "MANDATORY" : "ADVISORY ");
2087 (inode->i_mode & (S_IXGRP | S_ISGID)) == S_ISGID) ?
2088 "MANDATORY" : "ADVISORY ");
2089 } else if (IS_FLOCK(fl)) { 2083 } else if (IS_FLOCK(fl)) {
2090 if (fl->fl_type & LOCK_MAND) { 2084 if (fl->fl_type & LOCK_MAND) {
2091 out += sprintf(out, "FLOCK MSNFS "); 2085 out += sprintf(out, "FLOCK MSNFS ");
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 3f559700788f..3c028b9c6e0e 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2044,7 +2044,7 @@ static inline int
2044io_during_grace_disallowed(struct inode *inode, int flags) 2044io_during_grace_disallowed(struct inode *inode, int flags)
2045{ 2045{
2046 return nfs4_in_grace() && (flags & (RD_STATE | WR_STATE)) 2046 return nfs4_in_grace() && (flags & (RD_STATE | WR_STATE))
2047 && MANDATORY_LOCK(inode); 2047 && mandatory_lock(inode);
2048} 2048}
2049 2049
2050/* 2050/*
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 7867151ebb83..9152f87eea18 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -65,7 +65,7 @@
65 * locks on them because there is no way to know if the accesser has 65 * locks on them because there is no way to know if the accesser has
66 * the lock. 66 * the lock.
67 */ 67 */
68#define IS_ISMNDLK(i) (S_ISREG((i)->i_mode) && MANDATORY_LOCK(i)) 68#define IS_ISMNDLK(i) (S_ISREG((i)->i_mode) && mandatory_lock(i))
69 69
70/* 70/*
71 * This is a cache of readahead params that help us choose the proper 71 * This is a cache of readahead params that help us choose the proper
diff --git a/fs/read_write.c b/fs/read_write.c
index 507ddff48a9a..124693e8d3fa 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -205,7 +205,7 @@ int rw_verify_area(int read_write, struct file *file, loff_t *ppos, size_t count
205 if (unlikely((pos < 0) || (loff_t) (pos + count) < 0)) 205 if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
206 goto Einval; 206 goto Einval;
207 207
208 if (unlikely(inode->i_flock && MANDATORY_LOCK(inode))) { 208 if (unlikely(inode->i_flock && mandatory_lock(inode))) {
209 int retval = locks_mandatory_area( 209 int retval = locks_mandatory_area(
210 read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE, 210 read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE,
211 inode, file, pos, count); 211 inode, file, pos, count);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 16421f662a7a..f5075e0e7301 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1369,12 +1369,25 @@ extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size
1369 * Candidates for mandatory locking have the setgid bit set 1369 * Candidates for mandatory locking have the setgid bit set
1370 * but no group execute bit - an otherwise meaningless combination. 1370 * but no group execute bit - an otherwise meaningless combination.
1371 */ 1371 */
1372#define MANDATORY_LOCK(inode) \ 1372
1373 (IS_MANDLOCK(inode) && ((inode)->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) 1373static inline int __mandatory_lock(struct inode *ino)
1374{
1375 return (ino->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID;
1376}
1377
1378/*
1379 * ... and these candidates should be on MS_MANDLOCK mounted fs,
1380 * otherwise these will be advisory locks
1381 */
1382
1383static inline int mandatory_lock(struct inode *ino)
1384{
1385 return IS_MANDLOCK(ino) && __mandatory_lock(ino);
1386}
1374 1387
1375static inline int locks_verify_locked(struct inode *inode) 1388static inline int locks_verify_locked(struct inode *inode)
1376{ 1389{
1377 if (MANDATORY_LOCK(inode)) 1390 if (mandatory_lock(inode))
1378 return locks_mandatory_locked(inode); 1391 return locks_mandatory_locked(inode);
1379 return 0; 1392 return 0;
1380} 1393}
@@ -1385,7 +1398,7 @@ static inline int locks_verify_truncate(struct inode *inode,
1385 struct file *filp, 1398 struct file *filp,
1386 loff_t size) 1399 loff_t size)
1387{ 1400{
1388 if (inode->i_flock && MANDATORY_LOCK(inode)) 1401 if (inode->i_flock && mandatory_lock(inode))
1389 return locks_mandatory_area( 1402 return locks_mandatory_area(
1390 FLOCK_VERIFY_WRITE, inode, filp, 1403 FLOCK_VERIFY_WRITE, inode, filp,
1391 size < inode->i_size ? size : inode->i_size, 1404 size < inode->i_size ? size : inode->i_size,