diff options
author | Jeff Layton <jlayton@redhat.com> | 2014-03-04 10:30:23 -0500 |
---|---|---|
committer | Jeff Layton <jlayton@redhat.com> | 2014-03-31 08:24:43 -0400 |
commit | 90478939dce096ed5b239cad16237dca0a59d66f (patch) | |
tree | 743b3d825bc56bd1c0ab4d9487abba7b6883af86 | |
parent | 5d50ffd7c31dab47c6b828841ca1ec70a1b40169 (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.c | 24 |
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; |