]> git.hungrycats.org Git - linux/commitdiff
fix sysvfs symlinks
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 24 Nov 2015 02:11:08 +0000 (21:11 -0500)
committerWilly Tarreau <w@1wt.eu>
Fri, 29 Jan 2016 21:12:45 +0000 (22:12 +0100)
commit 0ebf7f10d67a70e120f365018f1c5fce9ddc567d upstream.

The thing got broken back in 2002 - sysvfs does *not* have inline
symlinks; even short ones have bodies stored in the first block
of file.  sysv_symlink() handles that correctly; unfortunately,
attempting to look an existing symlink up will end up confusing
them for inline symlinks, and interpret the block number containing
the body as the body itself.

Nobody has noticed until now, which says something about the level
of testing sysvfs gets ;-/

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
[bwh: Backported to 3.2:
 - Adjust context
 - Also delete unused sysv_fast_symlink_inode_operations]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
(cherry picked from commit 081c769778f7a41f4eb3d633df26ad572575c980)
Signed-off-by: Willy Tarreau <w@1wt.eu>
fs/sysv/Makefile
fs/sysv/inode.c
fs/sysv/symlink.c [deleted file]

index 3591f9d7a48a4a38948d30f7b523103471b85889..7a75e70a4b61b9d9fdc9fdd5d087be105304d62e 100644 (file)
@@ -5,4 +5,4 @@
 obj-$(CONFIG_SYSV_FS) += sysv.o
 
 sysv-objs := ialloc.o balloc.o inode.o itree.o file.o dir.o \
-            namei.o super.o symlink.o
+            namei.o super.o
index 9824743832a7212c4b1386b8127c712f62fa215b..cea880427b0c97ddf95557b922939da387b1289a 100644 (file)
@@ -174,14 +174,8 @@ void sysv_set_inode(struct inode *inode, dev_t rdev)
                inode->i_fop = &sysv_dir_operations;
                inode->i_mapping->a_ops = &sysv_aops;
        } else if (S_ISLNK(inode->i_mode)) {
-               if (inode->i_blocks) {
-                       inode->i_op = &sysv_symlink_inode_operations;
-                       inode->i_mapping->a_ops = &sysv_aops;
-               } else {
-                       inode->i_op = &sysv_fast_symlink_inode_operations;
-                       nd_terminate_link(SYSV_I(inode)->i_data, inode->i_size,
-                               sizeof(SYSV_I(inode)->i_data) - 1);
-               }
+               inode->i_op = &sysv_symlink_inode_operations;
+               inode->i_mapping->a_ops = &sysv_aops;
        } else
                init_special_inode(inode, inode->i_mode, rdev);
 }
diff --git a/fs/sysv/symlink.c b/fs/sysv/symlink.c
deleted file mode 100644 (file)
index 00d2f8a..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  linux/fs/sysv/symlink.c
- *
- *  Handling of System V filesystem fast symlinks extensions.
- *  Aug 2001, Christoph Hellwig (hch@infradead.org)
- */
-
-#include "sysv.h"
-#include <linux/namei.h>
-
-static void *sysv_follow_link(struct dentry *dentry, struct nameidata *nd)
-{
-       nd_set_link(nd, (char *)SYSV_I(dentry->d_inode)->i_data);
-       return NULL;
-}
-
-const struct inode_operations sysv_fast_symlink_inode_operations = {
-       .readlink       = generic_readlink,
-       .follow_link    = sysv_follow_link,
-};