lkml.org 
[lkml]   [2014]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16 217/357] shmem: fix nlink for rename overwrite directory
    Date
    3.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Miklos Szeredi <mszeredi@suse.cz>

    commit b928095b0a7cff7fb9fcf4c706348ceb8ab2c295 upstream.

    If overwriting an empty directory with rename, then need to drop the extra
    nlink.

    Test prog:

    #include <stdio.h>
    #include <fcntl.h>
    #include <err.h>
    #include <sys/stat.h>

    int main(void)
    {
    const char *test_dir1 = "test-dir1";
    const char *test_dir2 = "test-dir2";
    int res;
    int fd;
    struct stat statbuf;

    res = mkdir(test_dir1, 0777);
    if (res == -1)
    err(1, "mkdir(\"%s\")", test_dir1);

    res = mkdir(test_dir2, 0777);
    if (res == -1)
    err(1, "mkdir(\"%s\")", test_dir2);

    fd = open(test_dir2, O_RDONLY);
    if (fd == -1)
    err(1, "open(\"%s\")", test_dir2);

    res = rename(test_dir1, test_dir2);
    if (res == -1)
    err(1, "rename(\"%s\", \"%s\")", test_dir1, test_dir2);

    res = fstat(fd, &statbuf);
    if (res == -1)
    err(1, "fstat(%i)", fd);

    if (statbuf.st_nlink != 0) {
    fprintf(stderr, "nlink is %lu, should be 0\n", statbuf.st_nlink);
    return 1;
    }

    return 0;
    }

    Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    mm/shmem.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    --- a/mm/shmem.c
    +++ b/mm/shmem.c
    @@ -2064,8 +2064,10 @@ static int shmem_rename(struct inode *ol

    if (new_dentry->d_inode) {
    (void) shmem_unlink(new_dir, new_dentry);
    - if (they_are_dirs)
    + if (they_are_dirs) {
    + drop_nlink(new_dentry->d_inode);
    drop_nlink(old_dir);
    + }
    } else if (they_are_dirs) {
    drop_nlink(old_dir);
    inc_nlink(new_dir);



    \
     
     \ /
      Last update: 2014-10-04 03:01    [W:2.961 / U:0.644 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site