[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: Erez Zadok <ezk@cs.sunysb.edu>
Signed-off-by: Josef 'Jeff' Sipek <jsipek@cs.sunysb.edu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Erez Zadok 2007-02-18 23:57:45 -05:00 committed by Linus Torvalds
parent bc5393a6c9
commit a6e6df25ec

View file

@ -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,
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);