Commit a6e6df25 authored by Erez Zadok's avatar Erez Zadok Committed by Linus Torvalds

[PATCH] fs/stack.c: Copy i_nlink after all other attributes are copied

A user-specified get_nlinks may depend on other inode attributes.

Cc: Michael Halcrow <mhalcrow@us.ibm.com>
Signed-off-by: default avatarErez Zadok <ezk@cs.sunysb.edu>
Signed-off-by: default avatarJosef 'Jeff' Sipek <jsipek@cs.sunysb.edu>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bc5393a6
...@@ -20,11 +20,6 @@ EXPORT_SYMBOL_GPL(fsstack_copy_inode_size); ...@@ -20,11 +20,6 @@ EXPORT_SYMBOL_GPL(fsstack_copy_inode_size);
void fsstack_copy_attr_all(struct inode *dest, const struct inode *src, void fsstack_copy_attr_all(struct inode *dest, const struct inode *src,
int (*get_nlinks)(struct inode *)) int (*get_nlinks)(struct inode *))
{ {
if (!get_nlinks)
dest->i_nlink = src->i_nlink;
else
dest->i_nlink = (*get_nlinks)(dest);
dest->i_mode = src->i_mode; dest->i_mode = src->i_mode;
dest->i_uid = src->i_uid; dest->i_uid = src->i_uid;
dest->i_gid = src->i_gid; dest->i_gid = src->i_gid;
...@@ -34,5 +29,14 @@ void fsstack_copy_attr_all(struct inode *dest, const struct inode *src, ...@@ -34,5 +29,14 @@ void fsstack_copy_attr_all(struct inode *dest, const struct inode *src,
dest->i_ctime = src->i_ctime; dest->i_ctime = src->i_ctime;
dest->i_blkbits = src->i_blkbits; dest->i_blkbits = src->i_blkbits;
dest->i_flags = src->i_flags; dest->i_flags = src->i_flags;
/*
* Update the nlinks AFTER updating the above fields, because the
* get_links callback may depend on them.
*/
if (!get_nlinks)
dest->i_nlink = src->i_nlink;
else
dest->i_nlink = (*get_nlinks)(dest);
} }
EXPORT_SYMBOL_GPL(fsstack_copy_attr_all); EXPORT_SYMBOL_GPL(fsstack_copy_attr_all);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment