Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull final vfs updates from Al Viro: - The ->i_mutex wrappers (with small prereq in lustre) - a fix for too early freeing of symlink bodies on shmem (they need to be RCU-delayed) (-stable fodder) - followup to dedupe stuff merged this cycle * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: vfs: abort dedupe loop if fatal signals are pending make sure that freeing shmem fast symlinks is RCU-delayed wrappers for ->i_mutex access lustre: remove unused declaration
This commit is contained in:
@@ -2763,11 +2763,11 @@ ssize_t generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
ssize_t ret;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
inode_lock(inode);
|
||||
ret = generic_write_checks(iocb, from);
|
||||
if (ret > 0)
|
||||
ret = __generic_file_write_iter(iocb, from);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
|
||||
if (ret > 0) {
|
||||
ssize_t err;
|
||||
|
21
mm/shmem.c
21
mm/shmem.c
@@ -701,8 +701,7 @@ static void shmem_evict_inode(struct inode *inode)
|
||||
list_del_init(&info->swaplist);
|
||||
mutex_unlock(&shmem_swaplist_mutex);
|
||||
}
|
||||
} else
|
||||
kfree(info->symlink);
|
||||
}
|
||||
|
||||
simple_xattrs_free(&info->xattrs);
|
||||
WARN_ON(inode->i_blocks);
|
||||
@@ -1902,7 +1901,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence)
|
||||
if (whence != SEEK_DATA && whence != SEEK_HOLE)
|
||||
return generic_file_llseek_size(file, offset, whence,
|
||||
MAX_LFS_FILESIZE, i_size_read(inode));
|
||||
mutex_lock(&inode->i_mutex);
|
||||
inode_lock(inode);
|
||||
/* We're holding i_mutex so we can access i_size directly */
|
||||
|
||||
if (offset < 0)
|
||||
@@ -1926,7 +1925,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence)
|
||||
|
||||
if (offset >= 0)
|
||||
offset = vfs_setpos(file, offset, MAX_LFS_FILESIZE);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
return offset;
|
||||
}
|
||||
|
||||
@@ -2091,7 +2090,7 @@ int shmem_add_seals(struct file *file, unsigned int seals)
|
||||
if (seals & ~(unsigned int)F_ALL_SEALS)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
inode_lock(inode);
|
||||
|
||||
if (info->seals & F_SEAL_SEAL) {
|
||||
error = -EPERM;
|
||||
@@ -2114,7 +2113,7 @@ int shmem_add_seals(struct file *file, unsigned int seals)
|
||||
error = 0;
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(shmem_add_seals);
|
||||
@@ -2164,7 +2163,7 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset,
|
||||
if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
inode_lock(inode);
|
||||
|
||||
if (mode & FALLOC_FL_PUNCH_HOLE) {
|
||||
struct address_space *mapping = file->f_mapping;
|
||||
@@ -2277,7 +2276,7 @@ undone:
|
||||
inode->i_private = NULL;
|
||||
spin_unlock(&inode->i_lock);
|
||||
out:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -2549,13 +2548,12 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
|
||||
info = SHMEM_I(inode);
|
||||
inode->i_size = len-1;
|
||||
if (len <= SHORT_SYMLINK_LEN) {
|
||||
info->symlink = kmemdup(symname, len, GFP_KERNEL);
|
||||
if (!info->symlink) {
|
||||
inode->i_link = kmemdup(symname, len, GFP_KERNEL);
|
||||
if (!inode->i_link) {
|
||||
iput(inode);
|
||||
return -ENOMEM;
|
||||
}
|
||||
inode->i_op = &shmem_short_symlink_operations;
|
||||
inode->i_link = info->symlink;
|
||||
} else {
|
||||
inode_nohighmem(inode);
|
||||
error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
|
||||
@@ -3132,6 +3130,7 @@ static struct inode *shmem_alloc_inode(struct super_block *sb)
|
||||
static void shmem_destroy_callback(struct rcu_head *head)
|
||||
{
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
kfree(inode->i_link);
|
||||
kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
|
||||
}
|
||||
|
||||
|
@@ -1956,9 +1956,9 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
|
||||
set_blocksize(bdev, old_block_size);
|
||||
blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL);
|
||||
} else {
|
||||
mutex_lock(&inode->i_mutex);
|
||||
inode_lock(inode);
|
||||
inode->i_flags &= ~S_SWAPFILE;
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
}
|
||||
filp_close(swap_file, NULL);
|
||||
|
||||
@@ -2183,7 +2183,7 @@ static int claim_swapfile(struct swap_info_struct *p, struct inode *inode)
|
||||
p->flags |= SWP_BLKDEV;
|
||||
} else if (S_ISREG(inode->i_mode)) {
|
||||
p->bdev = inode->i_sb->s_bdev;
|
||||
mutex_lock(&inode->i_mutex);
|
||||
inode_lock(inode);
|
||||
if (IS_SWAPFILE(inode))
|
||||
return -EBUSY;
|
||||
} else
|
||||
@@ -2416,7 +2416,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
|
||||
mapping = swap_file->f_mapping;
|
||||
inode = mapping->host;
|
||||
|
||||
/* If S_ISREG(inode->i_mode) will do mutex_lock(&inode->i_mutex); */
|
||||
/* If S_ISREG(inode->i_mode) will do inode_lock(inode); */
|
||||
error = claim_swapfile(p, inode);
|
||||
if (unlikely(error))
|
||||
goto bad_swap;
|
||||
@@ -2561,7 +2561,7 @@ bad_swap:
|
||||
vfree(cluster_info);
|
||||
if (swap_file) {
|
||||
if (inode && S_ISREG(inode->i_mode)) {
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
inode = NULL;
|
||||
}
|
||||
filp_close(swap_file, NULL);
|
||||
@@ -2574,7 +2574,7 @@ out:
|
||||
if (name)
|
||||
putname(name);
|
||||
if (inode && S_ISREG(inode->i_mode))
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
inode_unlock(inode);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user