Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs pile (part one) from Al Viro: "Assorted stuff - cleaning namei.c up a bit, fixing ->d_name/->d_parent locking violations, etc. The most visible changes here are death of FS_REVAL_DOT (replaced with "has ->d_weak_revalidate()") and a new helper getting from struct file to inode. Some bits of preparation to xattr method interface changes. Misc patches by various people sent this cycle *and* ocfs2 fixes from several cycles ago that should've been upstream right then. PS: the next vfs pile will be xattr stuff." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (46 commits) saner proc_get_inode() calling conventions proc: avoid extra pde_put() in proc_fill_super() fs: change return values from -EACCES to -EPERM fs/exec.c: make bprm_mm_init() static ocfs2/dlm: use GFP_ATOMIC inside a spin_lock ocfs2: fix possible use-after-free with AIO ocfs2: Fix oops in ocfs2_fast_symlink_readpage() code path get_empty_filp()/alloc_file() leave both ->f_pos and ->f_version zero target: writev() on single-element vector is pointless export kernel_write(), convert open-coded instances fs: encode_fh: return FILEID_INVALID if invalid fid_type kill f_vfsmnt vfs: kill FS_REVAL_DOT by adding a d_weak_revalidate dentry op nfsd: handle vfs_getattr errors in acl protocol switch vfs_getattr() to struct path default SET_PERSONALITY() in linux/elf.h ceph: prepopulate inodes only when request is aborted d_hash_and_lookup(): export, switch open-coded instances 9p: switch v9fs_set_create_acl() to inode+fid, do it before d_instantiate() 9p: split dropping the acls from v9fs_set_create_acl() ...
这个提交包含在:
48
fs/nfs/dir.c
48
fs/nfs/dir.c
@@ -281,7 +281,7 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des
|
||||
|
||||
for (i = 0; i < array->size; i++) {
|
||||
if (array->array[i].cookie == *desc->dir_cookie) {
|
||||
struct nfs_inode *nfsi = NFS_I(desc->file->f_path.dentry->d_inode);
|
||||
struct nfs_inode *nfsi = NFS_I(file_inode(desc->file));
|
||||
struct nfs_open_dir_context *ctx = desc->file->private_data;
|
||||
|
||||
new_pos = desc->current_index + i;
|
||||
@@ -629,7 +629,7 @@ out:
|
||||
static
|
||||
int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page)
|
||||
{
|
||||
struct inode *inode = desc->file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(desc->file);
|
||||
int ret;
|
||||
|
||||
ret = nfs_readdir_xdr_to_array(desc, page, inode);
|
||||
@@ -660,7 +660,7 @@ void cache_page_release(nfs_readdir_descriptor_t *desc)
|
||||
static
|
||||
struct page *get_cache_page(nfs_readdir_descriptor_t *desc)
|
||||
{
|
||||
return read_cache_page(desc->file->f_path.dentry->d_inode->i_mapping,
|
||||
return read_cache_page(file_inode(desc->file)->i_mapping,
|
||||
desc->page_index, (filler_t *)nfs_readdir_filler, desc);
|
||||
}
|
||||
|
||||
@@ -764,7 +764,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
|
||||
{
|
||||
struct page *page = NULL;
|
||||
int status;
|
||||
struct inode *inode = desc->file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(desc->file);
|
||||
struct nfs_open_dir_context *ctx = desc->file->private_data;
|
||||
|
||||
dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n",
|
||||
@@ -1135,6 +1135,45 @@ out_error:
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* A weaker form of d_revalidate for revalidating just the dentry->d_inode
|
||||
* when we don't really care about the dentry name. This is called when a
|
||||
* pathwalk ends on a dentry that was not found via a normal lookup in the
|
||||
* parent dir (e.g.: ".", "..", procfs symlinks or mountpoint traversals).
|
||||
*
|
||||
* In this situation, we just want to verify that the inode itself is OK
|
||||
* since the dentry might have changed on the server.
|
||||
*/
|
||||
static int nfs_weak_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
{
|
||||
int error;
|
||||
struct inode *inode = dentry->d_inode;
|
||||
|
||||
/*
|
||||
* I believe we can only get a negative dentry here in the case of a
|
||||
* procfs-style symlink. Just assume it's correct for now, but we may
|
||||
* eventually need to do something more here.
|
||||
*/
|
||||
if (!inode) {
|
||||
dfprintk(LOOKUPCACHE, "%s: %s/%s has negative inode\n",
|
||||
__func__, dentry->d_parent->d_name.name,
|
||||
dentry->d_name.name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (is_bad_inode(inode)) {
|
||||
dfprintk(LOOKUPCACHE, "%s: %s/%s has dud inode\n",
|
||||
__func__, dentry->d_parent->d_name.name,
|
||||
dentry->d_name.name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
error = nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
||||
dfprintk(LOOKUPCACHE, "NFS: %s: inode %lu is %s\n",
|
||||
__func__, inode->i_ino, error ? "invalid" : "valid");
|
||||
return !error;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called from dput() when d_count is going to 0.
|
||||
*/
|
||||
@@ -1202,6 +1241,7 @@ static void nfs_d_release(struct dentry *dentry)
|
||||
|
||||
const struct dentry_operations nfs_dentry_operations = {
|
||||
.d_revalidate = nfs_lookup_revalidate,
|
||||
.d_weak_revalidate = nfs_weak_revalidate,
|
||||
.d_delete = nfs_dentry_delete,
|
||||
.d_iput = nfs_dentry_iput,
|
||||
.d_automount = nfs_d_automount,
|
||||
|
@@ -292,7 +292,7 @@ static int
|
||||
nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
{
|
||||
int ret;
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
|
||||
do {
|
||||
ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
|
||||
|
@@ -765,7 +765,7 @@ out:
|
||||
static ssize_t
|
||||
idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
|
||||
{
|
||||
struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode);
|
||||
struct rpc_inode *rpci = RPC_I(file_inode(filp));
|
||||
struct idmap *idmap = (struct idmap *)rpci->private;
|
||||
struct key_construction *cons;
|
||||
struct idmap_msg im;
|
||||
|
@@ -711,7 +711,7 @@ EXPORT_SYMBOL_GPL(put_nfs_open_context);
|
||||
*/
|
||||
void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(filp);
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
filp->private_data = get_nfs_open_context(ctx);
|
||||
@@ -744,7 +744,7 @@ struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_c
|
||||
|
||||
static void nfs_file_clear_open_context(struct file *filp)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(filp);
|
||||
struct nfs_open_context *ctx = nfs_file_open_context(filp);
|
||||
|
||||
if (ctx) {
|
||||
|
@@ -872,7 +872,7 @@ static void nfs3_proc_commit_setup(struct nfs_commit_data *data, struct rpc_mess
|
||||
static int
|
||||
nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(filp);
|
||||
|
||||
return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl);
|
||||
}
|
||||
|
@@ -94,7 +94,7 @@ static int
|
||||
nfs4_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
|
||||
{
|
||||
int ret;
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
|
||||
do {
|
||||
ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
|
||||
|
@@ -28,7 +28,7 @@ static struct file_system_type nfs4_remote_fs_type = {
|
||||
.name = "nfs4",
|
||||
.mount = nfs4_remote_mount,
|
||||
.kill_sb = nfs_kill_super,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
|
||||
};
|
||||
|
||||
static struct file_system_type nfs4_remote_referral_fs_type = {
|
||||
@@ -36,7 +36,7 @@ static struct file_system_type nfs4_remote_referral_fs_type = {
|
||||
.name = "nfs4",
|
||||
.mount = nfs4_remote_referral_mount,
|
||||
.kill_sb = nfs_kill_super,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
|
||||
};
|
||||
|
||||
struct file_system_type nfs4_referral_fs_type = {
|
||||
@@ -44,7 +44,7 @@ struct file_system_type nfs4_referral_fs_type = {
|
||||
.name = "nfs4",
|
||||
.mount = nfs4_referral_mount,
|
||||
.kill_sb = nfs_kill_super,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
|
||||
};
|
||||
|
||||
static const struct super_operations nfs4_sops = {
|
||||
|
@@ -662,7 +662,7 @@ nfs_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg)
|
||||
static int
|
||||
nfs_proc_lock(struct file *filp, int cmd, struct file_lock *fl)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(filp);
|
||||
|
||||
return nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl);
|
||||
}
|
||||
|
@@ -291,7 +291,7 @@ struct file_system_type nfs_fs_type = {
|
||||
.name = "nfs",
|
||||
.mount = nfs_fs_mount,
|
||||
.kill_sb = nfs_kill_super,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(nfs_fs_type);
|
||||
|
||||
@@ -300,7 +300,7 @@ struct file_system_type nfs_xdev_fs_type = {
|
||||
.name = "nfs",
|
||||
.mount = nfs_xdev_mount,
|
||||
.kill_sb = nfs_kill_super,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
|
||||
};
|
||||
|
||||
const struct super_operations nfs_sops = {
|
||||
@@ -330,7 +330,7 @@ struct file_system_type nfs4_fs_type = {
|
||||
.name = "nfs4",
|
||||
.mount = nfs_fs_mount,
|
||||
.kill_sb = nfs_kill_super,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE|FS_BINARY_MOUNTDATA,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(nfs4_fs_type);
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户