Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull second set of VFS changes from Al Viro: "Assorted f_pos race fixes, making do_splice_direct() safe to call with i_mutex on parent, O_TMPFILE support, Jeff's locks.c series, ->d_hash/->d_compare calling conventions changes from Linus, misc stuff all over the place." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits) Document ->tmpfile() ext4: ->tmpfile() support vfs: export lseek_execute() to modules lseek_execute() doesn't need an inode passed to it block_dev: switch to fixed_size_llseek() cpqphp_sysfs: switch to fixed_size_llseek() tile-srom: switch to fixed_size_llseek() proc_powerpc: switch to fixed_size_llseek() ubi/cdev: switch to fixed_size_llseek() pci/proc: switch to fixed_size_llseek() isapnp: switch to fixed_size_llseek() lpfc: switch to fixed_size_llseek() locks: give the blocked_hash its own spinlock locks: add a new "lm_owner_key" lock operation locks: turn the blocked_list into a hashtable locks: convert fl_link to a hlist_node locks: avoid taking global lock if possible when waking up blocked waiters locks: protect most of the file_lock handling with i_lock locks: encapsulate the fl_link list handling locks: make "added" in __posix_lock_file a bool ...
这个提交包含在:
@@ -1759,6 +1759,45 @@ retry:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ext3_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
{
|
||||
handle_t *handle;
|
||||
struct inode *inode;
|
||||
int err, retries = 0;
|
||||
|
||||
dquot_initialize(dir);
|
||||
|
||||
retry:
|
||||
handle = ext3_journal_start(dir, EXT3_MAXQUOTAS_INIT_BLOCKS(dir->i_sb) +
|
||||
4 + EXT3_XATTR_TRANS_BLOCKS);
|
||||
|
||||
if (IS_ERR(handle))
|
||||
return PTR_ERR(handle);
|
||||
|
||||
inode = ext3_new_inode (handle, dir, NULL, mode);
|
||||
err = PTR_ERR(inode);
|
||||
if (!IS_ERR(inode)) {
|
||||
inode->i_op = &ext3_file_inode_operations;
|
||||
inode->i_fop = &ext3_file_operations;
|
||||
ext3_set_aops(inode);
|
||||
err = ext3_orphan_add(handle, inode);
|
||||
if (err)
|
||||
goto err_drop_inode;
|
||||
mark_inode_dirty(inode);
|
||||
d_tmpfile(dentry, inode);
|
||||
unlock_new_inode(inode);
|
||||
}
|
||||
ext3_journal_stop(handle);
|
||||
if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
|
||||
goto retry;
|
||||
return err;
|
||||
err_drop_inode:
|
||||
ext3_journal_stop(handle);
|
||||
unlock_new_inode(inode);
|
||||
iput(inode);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ext3_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
|
||||
{
|
||||
handle_t *handle;
|
||||
@@ -2300,7 +2339,7 @@ static int ext3_link (struct dentry * old_dentry,
|
||||
|
||||
retry:
|
||||
handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
|
||||
EXT3_INDEX_EXTRA_TRANS_BLOCKS);
|
||||
EXT3_INDEX_EXTRA_TRANS_BLOCKS + 1);
|
||||
if (IS_ERR(handle))
|
||||
return PTR_ERR(handle);
|
||||
|
||||
@@ -2314,6 +2353,11 @@ retry:
|
||||
err = ext3_add_entry(handle, dentry, inode);
|
||||
if (!err) {
|
||||
ext3_mark_inode_dirty(handle, inode);
|
||||
/* this can happen only for tmpfile being
|
||||
* linked the first time
|
||||
*/
|
||||
if (inode->i_nlink == 1)
|
||||
ext3_orphan_del(handle, inode);
|
||||
d_instantiate(dentry, inode);
|
||||
} else {
|
||||
drop_nlink(inode);
|
||||
@@ -2516,6 +2560,7 @@ const struct inode_operations ext3_dir_inode_operations = {
|
||||
.mkdir = ext3_mkdir,
|
||||
.rmdir = ext3_rmdir,
|
||||
.mknod = ext3_mknod,
|
||||
.tmpfile = ext3_tmpfile,
|
||||
.rename = ext3_rename,
|
||||
.setattr = ext3_setattr,
|
||||
#ifdef CONFIG_EXT3_FS_XATTR
|
||||
|
在新工单中引用
屏蔽一个用户