aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2014-03-04 10:30:23 -0500
committerJeff Layton <jlayton@redhat.com>2014-03-31 08:24:43 -0400
commit90478939dce096ed5b239cad16237dca0a59d66f (patch)
tree743b3d825bc56bd1c0ab4d9487abba7b6883af86
parent5d50ffd7c31dab47c6b828841ca1ec70a1b40169 (diff)
locks: require that flock->l_pid be set to 0 for file-private locks
Neil Brown suggested potentially overloading the l_pid value as a "lock context" field for file-private locks. While I don't think we will probably want to do that here, it's probably a good idea to ensure that in the future we could extend this API without breaking existing callers. Typically the l_pid value is ignored for incoming struct flock arguments, serving mainly as a place to return the pid of the owner if there is a conflicting lock. For file-private locks, require that it currently be set to 0 and return EINVAL if it isn't. If we eventually want to make a non-zero l_pid mean something, then this will help ensure that we don't break legacy programs that are using file-private locks. Cc: Neil Brown <neilb@suse.de> Signed-off-by: Jeff Layton <jlayton@redhat.com>
-rw-r--r--fs/locks.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/locks.c b/fs/locks.c
index 3b54b98236ee..09d6c8c33c81 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -1931,6 +1931,10 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock __user *l)
1931 goto out; 1931 goto out;
1932 1932
1933 if (cmd == F_GETLKP) { 1933 if (cmd == F_GETLKP) {
1934 error = -EINVAL;
1935 if (flock.l_pid != 0)
1936 goto out;
1937
1934 cmd = F_GETLK; 1938 cmd = F_GETLK;
1935 file_lock.fl_flags |= FL_FILE_PVT; 1939 file_lock.fl_flags |= FL_FILE_PVT;
1936 file_lock.fl_owner = (fl_owner_t)filp; 1940 file_lock.fl_owner = (fl_owner_t)filp;
@@ -2062,11 +2066,19 @@ again:
2062 */ 2066 */
2063 switch (cmd) { 2067 switch (cmd) {
2064 case F_SETLKP: 2068 case F_SETLKP:
2069 error = -EINVAL;
2070 if (flock.l_pid != 0)
2071 goto out;
2072
2065 cmd = F_SETLK; 2073 cmd = F_SETLK;
2066 file_lock->fl_flags |= FL_FILE_PVT; 2074 file_lock->fl_flags |= FL_FILE_PVT;
2067 file_lock->fl_owner = (fl_owner_t)filp; 2075 file_lock->fl_owner = (fl_owner_t)filp;
2068 break; 2076 break;
2069 case F_SETLKPW: 2077 case F_SETLKPW:
2078 error = -EINVAL;
2079 if (flock.l_pid != 0)
2080 goto out;
2081
2070 cmd = F_SETLKW; 2082 cmd = F_SETLKW;
2071 file_lock->fl_flags |= FL_FILE_PVT; 2083 file_lock->fl_flags |= FL_FILE_PVT;
2072 file_lock->fl_owner = (fl_owner_t)filp; 2084 file_lock->fl_owner = (fl_owner_t)filp;
@@ -2121,6 +2133,10 @@ int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l)
2121 goto out; 2133 goto out;
2122 2134
2123 if (cmd == F_GETLKP) { 2135 if (cmd == F_GETLKP) {
2136 error = -EINVAL;
2137 if (flock.l_pid != 0)
2138 goto out;
2139
2124 cmd = F_GETLK64; 2140 cmd = F_GETLK64;
2125 file_lock.fl_flags |= FL_FILE_PVT; 2141 file_lock.fl_flags |= FL_FILE_PVT;
2126 file_lock.fl_owner = (fl_owner_t)filp; 2142 file_lock.fl_owner = (fl_owner_t)filp;
@@ -2185,11 +2201,19 @@ again:
2185 */ 2201 */
2186 switch (cmd) { 2202 switch (cmd) {
2187 case F_SETLKP: 2203 case F_SETLKP:
2204 error = -EINVAL;
2205 if (flock.l_pid != 0)
2206 goto out;
2207
2188 cmd = F_SETLK64; 2208 cmd = F_SETLK64;
2189 file_lock->fl_flags |= FL_FILE_PVT; 2209 file_lock->fl_flags |= FL_FILE_PVT;
2190 file_lock->fl_owner = (fl_owner_t)filp; 2210 file_lock->fl_owner = (fl_owner_t)filp;
2191 break; 2211 break;
2192 case F_SETLKPW: 2212 case F_SETLKPW:
2213 error = -EINVAL;
2214 if (flock.l_pid != 0)
2215 goto out;
2216
2193 cmd = F_SETLKW64; 2217 cmd = F_SETLKW64;
2194 file_lock->fl_flags |= FL_FILE_PVT; 2218 file_lock->fl_flags |= FL_FILE_PVT;
2195 file_lock->fl_owner = (fl_owner_t)filp; 2219 file_lock->fl_owner = (fl_owner_t)filp;