Skip to content

Commit

Permalink
locks: Allow disabling mandatory locking at compile time
Browse files Browse the repository at this point in the history
Mandatory locking appears to be almost unused and buggy and there
appears no real interest in doing anything with it.  Since effectively
no one uses the code and since the code is buggy let's allow it to be
disabled at compile time.  I would just suggest removing the code but
undoubtedly that will break some piece of userspace code somewhere.

For the distributions that don't care about this piece of code
this gives a nice starting point to make mandatory locking go away.

Cc: Benjamin Coddington <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Cc: Jeff Layton <[email protected]>
Cc: J. Bruce Fields <[email protected]>
Signed-off-by: "Eric W. Biederman" <[email protected]>
Signed-off-by: Jeff Layton <[email protected]>
  • Loading branch information
Jeff Layton committed Nov 16, 2015
1 parent 8005c49 commit 9e8925b
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 34 deletions.
10 changes: 10 additions & 0 deletions fs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,16 @@ config FILE_LOCKING
for filesystems like NFS and for the flock() system
call. Disabling this option saves about 11k.

config MANDATORY_FILE_LOCKING
bool "Enable Mandatory file locking"
depends on FILE_LOCKING
default y
help
This option enables files appropriately marked files on appropriely
mounted filesystems to support mandatory locking.

To the best of my knowledge this is dead code that no one cares about.

source "fs/notify/Kconfig"

source "fs/quota/Kconfig"
Expand Down
2 changes: 2 additions & 0 deletions fs/locks.c
Original file line number Diff line number Diff line change
Expand Up @@ -1191,6 +1191,7 @@ static int posix_lock_inode_wait(struct inode *inode, struct file_lock *fl)
return error;
}

#ifdef CONFIG_MANDATORY_FILE_LOCKING
/**
* locks_mandatory_locked - Check for an active lock
* @file: the file to check
Expand Down Expand Up @@ -1289,6 +1290,7 @@ int locks_mandatory_area(int read_write, struct inode *inode,
}

EXPORT_SYMBOL(locks_mandatory_area);
#endif /* CONFIG_MANDATORY_FILE_LOCKING */

static void lease_clear_pending(struct file_lock *fl, int arg)
{
Expand Down
10 changes: 10 additions & 0 deletions fs/namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1584,6 +1584,14 @@ static inline bool may_mount(void)
return ns_capable(current->nsproxy->mnt_ns->user_ns, CAP_SYS_ADMIN);
}

static inline bool may_mandlock(void)
{
#ifndef CONFIG_MANDATORY_FILE_LOCKING
return false;
#endif
return true;
}

/*
* Now umount can handle mount points as well as block devices.
* This is important for filesystems which use unnamed block devices.
Expand Down Expand Up @@ -2677,6 +2685,8 @@ long do_mount(const char *dev_name, const char __user *dir_name,
type_page, flags, data_page);
if (!retval && !may_mount())
retval = -EPERM;
if (!retval && (flags & MS_MANDLOCK) && !may_mandlock())
retval = -EPERM;
if (retval)
goto dput_out;

Expand Down
74 changes: 40 additions & 34 deletions include/linux/fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -2030,7 +2030,7 @@ extern struct kobject *fs_kobj;
#define FLOCK_VERIFY_READ 1
#define FLOCK_VERIFY_WRITE 2

#ifdef CONFIG_FILE_LOCKING
#ifdef CONFIG_MANDATORY_FILE_LOCKING
extern int locks_mandatory_locked(struct file *);
extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size_t);

Expand Down Expand Up @@ -2075,6 +2075,45 @@ static inline int locks_verify_truncate(struct inode *inode,
return 0;
}

#else /* !CONFIG_MANDATORY_FILE_LOCKING */

static inline int locks_mandatory_locked(struct file *file)
{
return 0;
}

static inline int locks_mandatory_area(int rw, struct inode *inode,
struct file *filp, loff_t offset,
size_t count)
{
return 0;
}

static inline int __mandatory_lock(struct inode *inode)
{
return 0;
}

static inline int mandatory_lock(struct inode *inode)
{
return 0;
}

static inline int locks_verify_locked(struct file *file)
{
return 0;
}

static inline int locks_verify_truncate(struct inode *inode, struct file *filp,
size_t size)
{
return 0;
}

#endif /* CONFIG_MANDATORY_FILE_LOCKING */


#ifdef CONFIG_FILE_LOCKING
static inline int break_lease(struct inode *inode, unsigned int mode)
{
/*
Expand Down Expand Up @@ -2136,39 +2175,6 @@ static inline int break_layout(struct inode *inode, bool wait)
}

#else /* !CONFIG_FILE_LOCKING */
static inline int locks_mandatory_locked(struct file *file)
{
return 0;
}

static inline int locks_mandatory_area(int rw, struct inode *inode,
struct file *filp, loff_t offset,
size_t count)
{
return 0;
}

static inline int __mandatory_lock(struct inode *inode)
{
return 0;
}

static inline int mandatory_lock(struct inode *inode)
{
return 0;
}

static inline int locks_verify_locked(struct file *file)
{
return 0;
}

static inline int locks_verify_truncate(struct inode *inode, struct file *filp,
size_t size)
{
return 0;
}

static inline int break_lease(struct inode *inode, unsigned int mode)
{
return 0;
Expand Down

0 comments on commit 9e8925b

Please sign in to comment.