History

Configure out file locking features

This patch adds the CONFIG_FILE_LOCKING option which allows to remove support for advisory locks. With this patch enabled, the flock() system call, the F_GETLK, F_SETLK and F_SETLKW operations of fcntl() and NFS support are disabled. These features are not necessarly needed on embedded systems. It allows to save ~11 Kb of kernel code and data: text data bss dec hex filename 1125436 118764 212992 1457192 163c28 vmlinux.old 1114299 118564 212992 1445855 160fdf vmlinux -11137 -200 0 -11337 -2C49 +/- This patch has originally been written by Matt Mackall <mpm@selenic.com>, and is part of the Linux Tiny project.

Thomas Petazzoni committed 18 years ago

Commit bfcd17a1 parent 04716e66 files · +70 −9Browse files

Unified · Split

6 files
  1. fs/Kconfig +8 −0
  2. fs/Makefile +2 −1
  3. fs/proc/proc_misc.c +4 −0
  4. include/linux/fs.h +50 −7
  5. kernel/sys_ni.c +1 −0
  6. kernel/sysctl.c +5 −1
fs/Kconfig+8−0
@@ -419,6 +419,14 @@ config FS_POSIX_ACL · 418 unmodified lines
419 bool419 bool
420 default n420 default n
421 421
422config FILE_LOCKING
423 bool "Enable POSIX file locking API" if EMBEDDED
424 default y
425 help
426 This option enables standard file locking support, required
427 for filesystems like NFS and for the flock() system
428 call. Disabling this option saves about 11k.
429
422source "fs/xfs/Kconfig"430source "fs/xfs/Kconfig"
423source "fs/gfs2/Kconfig"431source "fs/gfs2/Kconfig"
424 432
fs/Makefile+2−1
@@ -7,7 +7,7 @@ · 6 unmodified lines
7 7
8obj-y := open.o read_write.o file_table.o super.o \8obj-y := open.o read_write.o file_table.o super.o \
9 char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \9 char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
10 ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \10 ioctl.o readdir.o select.o fifo.o dcache.o inode.o \
11 attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \11 attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \
12 seq_file.o xattr.o libfs.o fs-writeback.o \12 seq_file.o xattr.o libfs.o fs-writeback.o \
13 pnode.o drop_caches.o splice.o sync.o utimes.o \13 pnode.o drop_caches.o splice.o sync.o utimes.o \
@@ -27,6 +27,7 @@ obj-$(CONFIG_ANON_INODES) += anon_inodes.o · 13 unmodified lines
27obj-$(CONFIG_SIGNALFD) += signalfd.o27obj-$(CONFIG_SIGNALFD) += signalfd.o
28obj-$(CONFIG_TIMERFD) += timerfd.o28obj-$(CONFIG_TIMERFD) += timerfd.o
29obj-$(CONFIG_EVENTFD) += eventfd.o29obj-$(CONFIG_EVENTFD) += eventfd.o
30obj-$(CONFIG_FILE_LOCKING) += locks.o
30obj-$(CONFIG_COMPAT) += compat.o compat_ioctl.o31obj-$(CONFIG_COMPAT) += compat.o compat_ioctl.o
31 32
32nfsd-$(CONFIG_NFSD) := nfsctl.o33nfsd-$(CONFIG_NFSD) := nfsctl.o
fs/proc/proc_misc.c+4−0
@@ -684,6 +684,7 @@ static int cmdline_read_proc(char *page, char **start, off_t off, · 683 unmodified lines
684 return proc_calc_metrics(page, start, off, count, eof, len);684 return proc_calc_metrics(page, start, off, count, eof, len);
685}685}
686 686
687#ifdef CONFIG_FILE_LOCKING
687static int locks_open(struct inode *inode, struct file *filp)688static int locks_open(struct inode *inode, struct file *filp)
688{689{
689 return seq_open(filp, &locks_seq_operations);690 return seq_open(filp, &locks_seq_operations);
@@ -695,6 +696,7 @@ static const struct file_operations proc_locks_operations = { · 5 unmodified lines
695 .llseek = seq_lseek,696 .llseek = seq_lseek,
696 .release = seq_release,697 .release = seq_release,
697};698};
699#endif /* CONFIG_FILE_LOCKING */
698 700
699static int execdomains_read_proc(char *page, char **start, off_t off,701static int execdomains_read_proc(char *page, char **start, off_t off,
700 int count, int *eof, void *data)702 int count, int *eof, void *data)
@@ -888,7 +890,9 @@ void __init proc_misc_init(void) · 187 unmodified lines
888#ifdef CONFIG_PRINTK890#ifdef CONFIG_PRINTK
889 proc_create("kmsg", S_IRUSR, NULL, &proc_kmsg_operations);891 proc_create("kmsg", S_IRUSR, NULL, &proc_kmsg_operations);
890#endif892#endif
893#ifdef CONFIG_FILE_LOCKING
891 proc_create("locks", 0, NULL, &proc_locks_operations);894 proc_create("locks", 0, NULL, &proc_locks_operations);
895#endif
892 proc_create("devices", 0, NULL, &proc_devinfo_operations);896 proc_create("devices", 0, NULL, &proc_devinfo_operations);
893 proc_create("cpuinfo", 0, NULL, &proc_cpuinfo_operations);897 proc_create("cpuinfo", 0, NULL, &proc_cpuinfo_operations);
894#ifdef CONFIG_BLOCK898#ifdef CONFIG_BLOCK
include/linux/fs.h+50−7
@@ -983,6 +983,13 @@ struct file_lock { · 982 unmodified lines
983 983
984#include <linux/fcntl.h>984#include <linux/fcntl.h>
985 985
986extern void send_sigio(struct fown_struct *fown, int fd, int band);
987
988/* fs/sync.c */
989extern int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
990 loff_t endbyte, unsigned int flags);
991
992#ifdef CONFIG_FILE_LOCKING
986extern int fcntl_getlk(struct file *, struct flock __user *);993extern int fcntl_getlk(struct file *, struct flock __user *);
987extern int fcntl_setlk(unsigned int, struct file *, unsigned int,994extern int fcntl_setlk(unsigned int, struct file *, unsigned int,
988 struct flock __user *);995 struct flock __user *);
@@ -993,14 +1000,9 @@ extern int fcntl_setlk64(unsigned int, struct file *, unsigned int, · 4 unmodified lines
993 struct flock64 __user *);1000 struct flock64 __user *);
994#endif1001#endif
995 1002
996extern void send_sigio(struct fown_struct *fown, int fd, int band);
997extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg);1003extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg);
998extern int fcntl_getlease(struct file *filp);1004extern int fcntl_getlease(struct file *filp);
999 1005
1000/* fs/sync.c */
1001extern int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
1002 loff_t endbyte, unsigned int flags);
1003
1004/* fs/locks.c */1006/* fs/locks.c */
1005extern void locks_init_lock(struct file_lock *);1007extern void locks_init_lock(struct file_lock *);
1006extern void locks_copy_lock(struct file_lock *, struct file_lock *);1008extern void locks_copy_lock(struct file_lock *, struct file_lock *);
@@ -1023,6 +1025,37 @@ extern int lease_modify(struct file_lock **, int); · 16 unmodified lines
1023extern int lock_may_read(struct inode *, loff_t start, unsigned long count);1025extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
1024extern int lock_may_write(struct inode *, loff_t start, unsigned long count);1026extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
1025extern struct seq_operations locks_seq_operations;1027extern struct seq_operations locks_seq_operations;
1028#else /* !CONFIG_FILE_LOCKING */
1029#define fcntl_getlk(a, b) ({ -EINVAL; })
1030#define fcntl_setlk(a, b, c, d) ({ -EACCES; })
1031#if BITS_PER_LONG == 32
1032#define fcntl_getlk64(a, b) ({ -EINVAL; })
1033#define fcntl_setlk64(a, b, c, d) ({ -EACCES; })
1034#endif
1035#define fcntl_setlease(a, b, c) ({ 0; })
1036#define fcntl_getlease(a) ({ 0; })
1037#define locks_init_lock(a) ({ })
1038#define __locks_copy_lock(a, b) ({ })
1039#define locks_copy_lock(a, b) ({ })
1040#define locks_remove_posix(a, b) ({ })
1041#define locks_remove_flock(a) ({ })
1042#define posix_test_lock(a, b) ({ 0; })
1043#define posix_lock_file(a, b, c) ({ -ENOLCK; })
1044#define posix_lock_file_wait(a, b) ({ -ENOLCK; })
1045#define posix_unblock_lock(a, b) (-ENOENT)
1046#define vfs_test_lock(a, b) ({ 0; })
1047#define vfs_lock_file(a, b, c, d) (-ENOLCK)
1048#define vfs_cancel_lock(a, b) ({ 0; })
1049#define flock_lock_file_wait(a, b) ({ -ENOLCK; })
1050#define __break_lease(a, b) ({ 0; })
1051#define lease_get_mtime(a, b) ({ })
1052#define generic_setlease(a, b, c) ({ -EINVAL; })
1053#define vfs_setlease(a, b, c) ({ -EINVAL; })
1054#define lease_modify(a, b) ({ -EINVAL; })
1055#define lock_may_read(a, b, c) ({ 1; })
1056#define lock_may_write(a, b, c) ({ 1; })
1057#endif /* !CONFIG_FILE_LOCKING */
1058
1026 1059
1027struct fasync_struct {1060struct fasync_struct {
1028 int magic;1061 int magic;
@@ -1554,9 +1587,12 @@ extern int vfs_statfs(struct dentry *, struct kstatfs *); · 525 unmodified lines
1554/* /sys/fs */1587/* /sys/fs */
1555extern struct kobject *fs_kobj;1588extern struct kobject *fs_kobj;
1556 1589
1590extern int rw_verify_area(int, struct file *, loff_t *, size_t);
1591
1557#define FLOCK_VERIFY_READ 11592#define FLOCK_VERIFY_READ 1
1558#define FLOCK_VERIFY_WRITE 21593#define FLOCK_VERIFY_WRITE 2
1559 1594
1595#ifdef CONFIG_FILE_LOCKING
1560extern int locks_mandatory_locked(struct inode *);1596extern int locks_mandatory_locked(struct inode *);
1561extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size_t);1597extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size_t);
1562 1598
@@ -1587,8 +1623,6 @@ static inline int locks_verify_locked(struct inode *inode) · 24 unmodified lines
1587 return 0;1623 return 0;
1588}1624}
1589 1625
1590extern int rw_verify_area(int, struct file *, loff_t *, size_t);
1591
1592static inline int locks_verify_truncate(struct inode *inode,1626static inline int locks_verify_truncate(struct inode *inode,
1593 struct file *filp,1627 struct file *filp,
1594 loff_t size)1628 loff_t size)
@@ -1609,6 +1643,15 @@ static inline int break_lease(struct inode *inode, unsigned int mode) · 14 unmodified lines
1609 return __break_lease(inode, mode);1643 return __break_lease(inode, mode);
1610 return 0;1644 return 0;
1611}1645}
1646#else /* !CONFIG_FILE_LOCKING */
1647#define locks_mandatory_locked(a) ({ 0; })
1648#define locks_mandatory_area(a, b, c, d, e) ({ 0; })
1649#define __mandatory_lock(a) ({ 0; })
1650#define mandatory_lock(a) ({ 0; })
1651#define locks_verify_locked(a) ({ 0; })
1652#define locks_verify_truncate(a, b, c) ({ 0; })
1653#define break_lease(a, b) ({ 0; })
1654#endif /* CONFIG_FILE_LOCKING */
1612 1655
1613/* fs/open.c */1656/* fs/open.c */
1614 1657
kernel/sys_ni.c+1−0
@@ -125,6 +125,7 @@ cond_syscall(sys_vm86old); · 124 unmodified lines
125cond_syscall(sys_vm86);125cond_syscall(sys_vm86);
126cond_syscall(compat_sys_ipc);126cond_syscall(compat_sys_ipc);
127cond_syscall(compat_sys_sysctl);127cond_syscall(compat_sys_sysctl);
128cond_syscall(sys_flock);
128 129
129/* arch-specific weak syscall entries */130/* arch-specific weak syscall entries */
130cond_syscall(sys_pciconfig_read);131cond_syscall(sys_pciconfig_read);
kernel/sysctl.c+5−1
@@ -97,7 +97,7 @@ static int sixty = 60; · 96 unmodified lines
97static int neg_one = -1;97static int neg_one = -1;
98#endif98#endif
99 99
100#ifdef CONFIG_MMU100#if defined(CONFIG_MMU) && defined(CONFIG_FILE_LOCKING)
101static int two = 2;101static int two = 2;
102#endif102#endif
103 103
@@ -1261,6 +1261,7 @@ static struct ctl_table fs_table[] = { · 1157 unmodified lines
1261 .extra1 = &minolduid,1261 .extra1 = &minolduid,
1262 .extra2 = &maxolduid,1262 .extra2 = &maxolduid,
1263 },1263 },
1264#ifdef CONFIG_FILE_LOCKING
1264 {1265 {
1265 .ctl_name = FS_LEASES,1266 .ctl_name = FS_LEASES,
1266 .procname = "leases-enable",1267 .procname = "leases-enable",
@@ -1269,6 +1270,7 @@ static struct ctl_table fs_table[] = { · 2 unmodified lines
1269 .mode = 0644,1270 .mode = 0644,
1270 .proc_handler = &proc_dointvec,1271 .proc_handler = &proc_dointvec,
1271 },1272 },
1273#endif
1272#ifdef CONFIG_DNOTIFY1274#ifdef CONFIG_DNOTIFY
1273 {1275 {
1274 .ctl_name = FS_DIR_NOTIFY,1276 .ctl_name = FS_DIR_NOTIFY,
@@ -1280,6 +1282,7 @@ static struct ctl_table fs_table[] = { · 5 unmodified lines
1280 },1282 },
1281#endif1283#endif
1282#ifdef CONFIG_MMU1284#ifdef CONFIG_MMU
1285#ifdef CONFIG_FILE_LOCKING
1283 {1286 {
1284 .ctl_name = FS_LEASE_TIME,1287 .ctl_name = FS_LEASE_TIME,
1285 .procname = "lease-break-time",1288 .procname = "lease-break-time",
@@ -1291,6 +1294,7 @@ static struct ctl_table fs_table[] = { · 5 unmodified lines
1291 .extra1 = &zero,1294 .extra1 = &zero,
1292 .extra2 = &two,1295 .extra2 = &two,
1293 },1296 },
1297#endif
1294 {1298 {
1295 .procname = "aio-nr",1299 .procname = "aio-nr",
1296 .data = &aio_nr,1300 .data = &aio_nr,