Skip to content

Commit d0eab9f

Browse files
jtlaytonbrauner
authored andcommitted
filelock: lift the ban on directory leases in generic_setlease
With the addition of the try_break_lease calls in directory changing operations, allow generic_setlease to hand them out. Write leases on directories are never allowed however, so continue to reject them. For now, there is no API for requesting delegations from userland, so ensure that userland is prevented from acquiring a lease on a directory. Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: NeilBrown <neil@brown.name> Signed-off-by: Jeff Layton <jlayton@kernel.org> Link: https://patch.msgid.link/20251111-dir-deleg-ro-v6-13-52f3feebb2f2@kernel.org Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 92bf535 commit d0eab9f

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

fs/locks.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,14 +1935,19 @@ static int generic_delete_lease(struct file *filp, void *owner)
19351935
int generic_setlease(struct file *filp, int arg, struct file_lease **flp,
19361936
void **priv)
19371937
{
1938-
if (!S_ISREG(file_inode(filp)->i_mode))
1938+
struct inode *inode = file_inode(filp);
1939+
1940+
if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
19391941
return -EINVAL;
19401942

19411943
switch (arg) {
19421944
case F_UNLCK:
19431945
return generic_delete_lease(filp, *priv);
1944-
case F_RDLCK:
19451946
case F_WRLCK:
1947+
if (S_ISDIR(inode->i_mode))
1948+
return -EINVAL;
1949+
fallthrough;
1950+
case F_RDLCK:
19461951
if (!(*flp)->fl_lmops->lm_break) {
19471952
WARN_ON_ONCE(1);
19481953
return -ENOLCK;
@@ -2071,6 +2076,9 @@ static int do_fcntl_add_lease(unsigned int fd, struct file *filp, int arg)
20712076
*/
20722077
int fcntl_setlease(unsigned int fd, struct file *filp, int arg)
20732078
{
2079+
if (S_ISDIR(file_inode(filp)->i_mode))
2080+
return -EINVAL;
2081+
20742082
if (arg == F_UNLCK)
20752083
return vfs_setlease(filp, F_UNLCK, NULL, (void **)&filp);
20762084
return do_fcntl_add_lease(fd, filp, arg);

0 commit comments

Comments
 (0)