vfs: check i_nlink limits in vfs_{mkdir,rename_dir,link}
New field of struct super_block - ->s_max_links. Maximal allowed value of ->i_nlink or 0; in the latter case all checks still need to be done in ->link/->mkdir/->rename instances. Note that this limit applies both to directoris and to non-directories. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -143,9 +143,6 @@ static int exofs_link(struct dentry *old_dentry, struct inode *dir,
|
||||
{
|
||||
struct inode *inode = old_dentry->d_inode;
|
||||
|
||||
if (inode->i_nlink >= EXOFS_LINK_MAX)
|
||||
return -EMLINK;
|
||||
|
||||
inode->i_ctime = CURRENT_TIME;
|
||||
inode_inc_link_count(inode);
|
||||
ihold(inode);
|
||||
@@ -156,10 +153,7 @@ static int exofs_link(struct dentry *old_dentry, struct inode *dir,
|
||||
static int exofs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
{
|
||||
struct inode *inode;
|
||||
int err = -EMLINK;
|
||||
|
||||
if (dir->i_nlink >= EXOFS_LINK_MAX)
|
||||
goto out;
|
||||
int err;
|
||||
|
||||
inode_inc_link_count(dir);
|
||||
|
||||
@@ -275,11 +269,6 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
if (err)
|
||||
goto out_dir;
|
||||
} else {
|
||||
if (dir_de) {
|
||||
err = -EMLINK;
|
||||
if (new_dir->i_nlink >= EXOFS_LINK_MAX)
|
||||
goto out_dir;
|
||||
}
|
||||
err = exofs_add_link(new_dentry, old_inode);
|
||||
if (err)
|
||||
goto out_dir;
|
||||
|
@@ -754,6 +754,7 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
sb->s_blocksize = EXOFS_BLKSIZE;
|
||||
sb->s_blocksize_bits = EXOFS_BLKSHIFT;
|
||||
sb->s_maxbytes = MAX_LFS_FILESIZE;
|
||||
sb->s_max_links = EXOFS_LINK_MAX;
|
||||
atomic_set(&sbi->s_curr_pending, 0);
|
||||
sb->s_bdev = NULL;
|
||||
sb->s_dev = 0;
|
||||
|
Reference in New Issue
Block a user