mirror of https://gitee.com/openkylin/linux.git
switch vfs_getattr() to struct path
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
e72837e3e7
commit
3dadecce20
|
@ -302,7 +302,8 @@ static int handle_remove(const char *nodename, struct device *dev)
|
||||||
|
|
||||||
if (dentry->d_inode) {
|
if (dentry->d_inode) {
|
||||||
struct kstat stat;
|
struct kstat stat;
|
||||||
err = vfs_getattr(parent.mnt, dentry, &stat);
|
struct path p = {.mnt = parent.mnt, .dentry = dentry};
|
||||||
|
err = vfs_getattr(&p, &stat);
|
||||||
if (!err && dev_mynode(dev, dentry->d_inode, &stat)) {
|
if (!err && dev_mynode(dev, dentry->d_inode, &stat)) {
|
||||||
struct iattr newattrs;
|
struct iattr newattrs;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -290,7 +290,7 @@ MODULE_PARM_DESC(path, "customized firmware image search path with a higher prio
|
||||||
static noinline_for_stack long fw_file_size(struct file *file)
|
static noinline_for_stack long fw_file_size(struct file *file)
|
||||||
{
|
{
|
||||||
struct kstat st;
|
struct kstat st;
|
||||||
if (vfs_getattr(file->f_path.mnt, file->f_path.dentry, &st))
|
if (vfs_getattr(&file->f_path, &st))
|
||||||
return -1;
|
return -1;
|
||||||
if (!S_ISREG(st.mode))
|
if (!S_ISREG(st.mode))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -1139,7 +1139,7 @@ loop_get_status(struct loop_device *lo, struct loop_info64 *info)
|
||||||
|
|
||||||
if (lo->lo_state != Lo_bound)
|
if (lo->lo_state != Lo_bound)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
error = vfs_getattr(file->f_path.mnt, file->f_path.dentry, &stat);
|
error = vfs_getattr(&file->f_path, &stat);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
|
@ -509,6 +509,12 @@ ecryptfs_dentry_to_lower_mnt(struct dentry *dentry)
|
||||||
return ((struct ecryptfs_dentry_info *)dentry->d_fsdata)->lower_path.mnt;
|
return ((struct ecryptfs_dentry_info *)dentry->d_fsdata)->lower_path.mnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct path *
|
||||||
|
ecryptfs_dentry_to_lower_path(struct dentry *dentry)
|
||||||
|
{
|
||||||
|
return &((struct ecryptfs_dentry_info *)dentry->d_fsdata)->lower_path;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
ecryptfs_set_dentry_lower_mnt(struct dentry *dentry, struct vfsmount *lower_mnt)
|
ecryptfs_set_dentry_lower_mnt(struct dentry *dentry, struct vfsmount *lower_mnt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1027,8 +1027,7 @@ int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
|
||||||
struct kstat lower_stat;
|
struct kstat lower_stat;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = vfs_getattr(ecryptfs_dentry_to_lower_mnt(dentry),
|
rc = vfs_getattr(ecryptfs_dentry_to_lower_path(dentry), &lower_stat);
|
||||||
ecryptfs_dentry_to_lower(dentry), &lower_stat);
|
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
fsstack_copy_attr_all(dentry->d_inode,
|
fsstack_copy_attr_all(dentry->d_inode,
|
||||||
ecryptfs_inode_to_lower(dentry->d_inode));
|
ecryptfs_inode_to_lower(dentry->d_inode));
|
||||||
|
|
|
@ -43,7 +43,6 @@ static __be32
|
||||||
nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle *argp,
|
nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle *argp,
|
||||||
struct nfsd3_attrstat *resp)
|
struct nfsd3_attrstat *resp)
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
__be32 nfserr;
|
__be32 nfserr;
|
||||||
|
|
||||||
dprintk("nfsd: GETATTR(3) %s\n",
|
dprintk("nfsd: GETATTR(3) %s\n",
|
||||||
|
@ -55,9 +54,7 @@ nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle *argp,
|
||||||
if (nfserr)
|
if (nfserr)
|
||||||
RETURN_STATUS(nfserr);
|
RETURN_STATUS(nfserr);
|
||||||
|
|
||||||
err = vfs_getattr(resp->fh.fh_export->ex_path.mnt,
|
nfserr = fh_getattr(&resp->fh, &resp->stat);
|
||||||
resp->fh.fh_dentry, &resp->stat);
|
|
||||||
nfserr = nfserrno(err);
|
|
||||||
|
|
||||||
RETURN_STATUS(nfserr);
|
RETURN_STATUS(nfserr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "xdr3.h"
|
#include "xdr3.h"
|
||||||
#include "auth.h"
|
#include "auth.h"
|
||||||
#include "netns.h"
|
#include "netns.h"
|
||||||
|
#include "vfs.h"
|
||||||
|
|
||||||
#define NFSDDBG_FACILITY NFSDDBG_XDR
|
#define NFSDDBG_FACILITY NFSDDBG_XDR
|
||||||
|
|
||||||
|
@ -204,10 +205,10 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
||||||
{
|
{
|
||||||
struct dentry *dentry = fhp->fh_dentry;
|
struct dentry *dentry = fhp->fh_dentry;
|
||||||
if (dentry && dentry->d_inode) {
|
if (dentry && dentry->d_inode) {
|
||||||
int err;
|
__be32 err;
|
||||||
struct kstat stat;
|
struct kstat stat;
|
||||||
|
|
||||||
err = vfs_getattr(fhp->fh_export->ex_path.mnt, dentry, &stat);
|
err = fh_getattr(fhp, &stat);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
*p++ = xdr_one; /* attributes follow */
|
*p++ = xdr_one; /* attributes follow */
|
||||||
lease_get_mtime(dentry->d_inode, &stat.mtime);
|
lease_get_mtime(dentry->d_inode, &stat.mtime);
|
||||||
|
@ -254,13 +255,12 @@ encode_wcc_data(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
||||||
*/
|
*/
|
||||||
void fill_post_wcc(struct svc_fh *fhp)
|
void fill_post_wcc(struct svc_fh *fhp)
|
||||||
{
|
{
|
||||||
int err;
|
__be32 err;
|
||||||
|
|
||||||
if (fhp->fh_post_saved)
|
if (fhp->fh_post_saved)
|
||||||
printk("nfsd: inode locked twice during operation.\n");
|
printk("nfsd: inode locked twice during operation.\n");
|
||||||
|
|
||||||
err = vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry,
|
err = fh_getattr(fhp, &fhp->fh_post_attr);
|
||||||
&fhp->fh_post_attr);
|
|
||||||
fhp->fh_post_change = fhp->fh_dentry->d_inode->i_version;
|
fhp->fh_post_change = fhp->fh_dentry->d_inode->i_version;
|
||||||
if (err) {
|
if (err) {
|
||||||
fhp->fh_post_saved = 0;
|
fhp->fh_post_saved = 0;
|
||||||
|
|
|
@ -1997,7 +1997,7 @@ static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)
|
||||||
if (path.dentry != path.mnt->mnt_root)
|
if (path.dentry != path.mnt->mnt_root)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
err = vfs_getattr(path.mnt, path.dentry, stat);
|
err = vfs_getattr(&path, stat);
|
||||||
path_put(&path);
|
path_put(&path);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -2050,7 +2050,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vfs_getattr(exp->ex_path.mnt, dentry, &stat);
|
err = vfs_getattr(&path, &stat);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_nfserr;
|
goto out_nfserr;
|
||||||
if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL |
|
if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL |
|
||||||
|
|
|
@ -26,17 +26,13 @@ static __be32
|
||||||
nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp)
|
nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp)
|
||||||
{
|
{
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt,
|
return fh_getattr(&resp->fh, &resp->stat);
|
||||||
resp->fh.fh_dentry,
|
|
||||||
&resp->stat));
|
|
||||||
}
|
}
|
||||||
static __be32
|
static __be32
|
||||||
nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp)
|
nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp)
|
||||||
{
|
{
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt,
|
return fh_getattr(&resp->fh, &resp->stat);
|
||||||
resp->fh.fh_dentry,
|
|
||||||
&resp->stat));
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Get a file's attributes
|
* Get a file's attributes
|
||||||
|
@ -150,9 +146,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp,
|
||||||
&resp->count);
|
&resp->count);
|
||||||
|
|
||||||
if (nfserr) return nfserr;
|
if (nfserr) return nfserr;
|
||||||
return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt,
|
return fh_getattr(&resp->fh, &resp->stat);
|
||||||
resp->fh.fh_dentry,
|
|
||||||
&resp->stat));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
|
* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "vfs.h"
|
||||||
#include "xdr.h"
|
#include "xdr.h"
|
||||||
#include "auth.h"
|
#include "auth.h"
|
||||||
|
|
||||||
|
@ -197,7 +198,7 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
|
||||||
__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
||||||
{
|
{
|
||||||
struct kstat stat;
|
struct kstat stat;
|
||||||
vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, &stat);
|
fh_getattr(fhp, &stat); /* BUG */
|
||||||
return encode_fattr(rqstp, p, fhp, &stat);
|
return encode_fattr(rqstp, p, fhp, &stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#define LINUX_NFSD_VFS_H
|
#define LINUX_NFSD_VFS_H
|
||||||
|
|
||||||
#include "nfsfh.h"
|
#include "nfsfh.h"
|
||||||
|
#include "nfsd.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flags for nfsd_permission
|
* Flags for nfsd_permission
|
||||||
|
@ -125,4 +126,11 @@ static inline void fh_drop_write(struct svc_fh *fh)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline __be32 fh_getattr(struct svc_fh *fh, struct kstat *stat)
|
||||||
|
{
|
||||||
|
struct path p = {.mnt = fh->fh_export->ex_path.mnt,
|
||||||
|
.dentry = fh->fh_dentry};
|
||||||
|
return nfserrno(vfs_getattr(&p, stat));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* LINUX_NFSD_VFS_H */
|
#endif /* LINUX_NFSD_VFS_H */
|
||||||
|
|
13
fs/stat.c
13
fs/stat.c
|
@ -37,17 +37,17 @@ void generic_fillattr(struct inode *inode, struct kstat *stat)
|
||||||
|
|
||||||
EXPORT_SYMBOL(generic_fillattr);
|
EXPORT_SYMBOL(generic_fillattr);
|
||||||
|
|
||||||
int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
|
int vfs_getattr(struct path *path, struct kstat *stat)
|
||||||
{
|
{
|
||||||
struct inode *inode = dentry->d_inode;
|
struct inode *inode = path->dentry->d_inode;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
retval = security_inode_getattr(mnt, dentry);
|
retval = security_inode_getattr(path->mnt, path->dentry);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
if (inode->i_op->getattr)
|
if (inode->i_op->getattr)
|
||||||
return inode->i_op->getattr(mnt, dentry, stat);
|
return inode->i_op->getattr(path->mnt, path->dentry, stat);
|
||||||
|
|
||||||
generic_fillattr(inode, stat);
|
generic_fillattr(inode, stat);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -61,8 +61,7 @@ int vfs_fstat(unsigned int fd, struct kstat *stat)
|
||||||
int error = -EBADF;
|
int error = -EBADF;
|
||||||
|
|
||||||
if (f.file) {
|
if (f.file) {
|
||||||
error = vfs_getattr(f.file->f_path.mnt, f.file->f_path.dentry,
|
error = vfs_getattr(&f.file->f_path, stat);
|
||||||
stat);
|
|
||||||
fdput(f);
|
fdput(f);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
|
@ -89,7 +88,7 @@ int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
error = vfs_getattr(path.mnt, path.dentry, stat);
|
error = vfs_getattr(&path, stat);
|
||||||
path_put(&path);
|
path_put(&path);
|
||||||
if (retry_estale(error, lookup_flags)) {
|
if (retry_estale(error, lookup_flags)) {
|
||||||
lookup_flags |= LOOKUP_REVAL;
|
lookup_flags |= LOOKUP_REVAL;
|
||||||
|
|
|
@ -2468,7 +2468,7 @@ extern int page_symlink(struct inode *inode, const char *symname, int len);
|
||||||
extern const struct inode_operations page_symlink_inode_operations;
|
extern const struct inode_operations page_symlink_inode_operations;
|
||||||
extern int generic_readlink(struct dentry *, char __user *, int);
|
extern int generic_readlink(struct dentry *, char __user *, int);
|
||||||
extern void generic_fillattr(struct inode *, struct kstat *);
|
extern void generic_fillattr(struct inode *, struct kstat *);
|
||||||
extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
extern int vfs_getattr(struct path *, struct kstat *);
|
||||||
void __inode_add_bytes(struct inode *inode, loff_t bytes);
|
void __inode_add_bytes(struct inode *inode, loff_t bytes);
|
||||||
void inode_add_bytes(struct inode *inode, loff_t bytes);
|
void inode_add_bytes(struct inode *inode, loff_t bytes);
|
||||||
void inode_sub_bytes(struct inode *inode, loff_t bytes);
|
void inode_sub_bytes(struct inode *inode, loff_t bytes);
|
||||||
|
|
|
@ -2519,7 +2519,7 @@ static int copy_module_from_fd(int fd, struct load_info *info)
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
err = vfs_getattr(file->f_vfsmnt, file->f_dentry, &stat);
|
err = vfs_getattr(&file->f_path, &stat);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue