NFS: Pass the inode down to the getattr() callback
Allow the getattr() callback to check things like whether or not we hold a delegation so that it can adjust the attributes that it is asking for. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
30846df06f
commit
a841b54dbd
@ -969,7 +969,8 @@ struct nfs_server *nfs_create_server(struct nfs_mount_info *mount_info,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(fattr->valid & NFS_ATTR_FATTR)) {
|
if (!(fattr->valid & NFS_ATTR_FATTR)) {
|
||||||
error = nfs_mod->rpc_ops->getattr(server, mount_info->mntfh, fattr, NULL);
|
error = nfs_mod->rpc_ops->getattr(server, mount_info->mntfh,
|
||||||
|
fattr, NULL, NULL);
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
dprintk("nfs_create_server: getattr error = %d\n", -error);
|
dprintk("nfs_create_server: getattr error = %d\n", -error);
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -1656,7 +1656,8 @@ int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fhandle,
|
|||||||
nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
||||||
if (!(fattr->valid & NFS_ATTR_FATTR)) {
|
if (!(fattr->valid & NFS_ATTR_FATTR)) {
|
||||||
struct nfs_server *server = NFS_SB(dentry->d_sb);
|
struct nfs_server *server = NFS_SB(dentry->d_sb);
|
||||||
error = server->nfs_client->rpc_ops->getattr(server, fhandle, fattr, NULL);
|
error = server->nfs_client->rpc_ops->getattr(server, fhandle,
|
||||||
|
fattr, NULL, NULL);
|
||||||
if (error < 0)
|
if (error < 0)
|
||||||
goto out_error;
|
goto out_error;
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ nfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rpc_ops = NFS_SB(sb)->nfs_client->rpc_ops;
|
rpc_ops = NFS_SB(sb)->nfs_client->rpc_ops;
|
||||||
ret = rpc_ops->getattr(NFS_SB(sb), server_fh, fattr, label);
|
ret = rpc_ops->getattr(NFS_SB(sb), server_fh, fattr, label, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dprintk("%s: getattr failed %d\n", __func__, ret);
|
dprintk("%s: getattr failed %d\n", __func__, ret);
|
||||||
dentry = ERR_PTR(ret);
|
dentry = ERR_PTR(ret);
|
||||||
|
@ -1101,7 +1101,8 @@ __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = NFS_PROTO(inode)->getattr(server, NFS_FH(inode), fattr, label);
|
status = NFS_PROTO(inode)->getattr(server, NFS_FH(inode), fattr,
|
||||||
|
label, inode);
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Lu) getattr failed, error=%d\n",
|
dfprintk(PAGECACHE, "nfs_revalidate_inode: (%s/%Lu) getattr failed, error=%d\n",
|
||||||
inode->i_sb->s_id,
|
inode->i_sb->s_id,
|
||||||
|
@ -101,7 +101,8 @@ nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
|||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||||
|
struct inode *inode)
|
||||||
{
|
{
|
||||||
struct rpc_message msg = {
|
struct rpc_message msg = {
|
||||||
.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR],
|
.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR],
|
||||||
|
@ -92,8 +92,8 @@ static void nfs4_layoutget_release(void *calldata);
|
|||||||
static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
|
static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
|
||||||
static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
|
static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
|
||||||
static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
|
static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
|
||||||
static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct nfs4_label *label);
|
static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct nfs4_label *label, struct inode *inode);
|
||||||
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label);
|
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label, struct inode *inode);
|
||||||
static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
|
static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
|
||||||
struct nfs_fattr *fattr, struct iattr *sattr,
|
struct nfs_fattr *fattr, struct iattr *sattr,
|
||||||
struct nfs_open_context *ctx, struct nfs4_label *ilabel,
|
struct nfs_open_context *ctx, struct nfs4_label *ilabel,
|
||||||
@ -2494,7 +2494,8 @@ static int _nfs4_proc_open(struct nfs4_opendata *data,
|
|||||||
}
|
}
|
||||||
if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) {
|
if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) {
|
||||||
nfs4_sequence_free_slot(&o_res->seq_res);
|
nfs4_sequence_free_slot(&o_res->seq_res);
|
||||||
nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr, o_res->f_label);
|
nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr,
|
||||||
|
o_res->f_label, NULL);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3763,7 +3764,7 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh,
|
|||||||
if (IS_ERR(label))
|
if (IS_ERR(label))
|
||||||
return PTR_ERR(label);
|
return PTR_ERR(label);
|
||||||
|
|
||||||
error = nfs4_proc_getattr(server, mntfh, fattr, label);
|
error = nfs4_proc_getattr(server, mntfh, fattr, label, NULL);
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
dprintk("nfs4_get_root: getattr error = %d\n", -error);
|
dprintk("nfs4_get_root: getattr error = %d\n", -error);
|
||||||
goto err_free_label;
|
goto err_free_label;
|
||||||
@ -3828,7 +3829,8 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||||
|
struct inode *inode)
|
||||||
{
|
{
|
||||||
struct nfs4_getattr_arg args = {
|
struct nfs4_getattr_arg args = {
|
||||||
.fh = fhandle,
|
.fh = fhandle,
|
||||||
@ -3852,12 +3854,13 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||||
|
struct inode *inode)
|
||||||
{
|
{
|
||||||
struct nfs4_exception exception = { };
|
struct nfs4_exception exception = { };
|
||||||
int err;
|
int err;
|
||||||
do {
|
do {
|
||||||
err = _nfs4_proc_getattr(server, fhandle, fattr, label);
|
err = _nfs4_proc_getattr(server, fhandle, fattr, label, inode);
|
||||||
trace_nfs4_getattr(server, fhandle, fattr, err);
|
trace_nfs4_getattr(server, fhandle, fattr, err);
|
||||||
err = nfs4_handle_exception(server, err,
|
err = nfs4_handle_exception(server, err,
|
||||||
&exception);
|
&exception);
|
||||||
|
@ -99,7 +99,8 @@ nfs_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
|
|||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
nfs_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
|
||||||
struct nfs_fattr *fattr, struct nfs4_label *label)
|
struct nfs_fattr *fattr, struct nfs4_label *label,
|
||||||
|
struct inode *inode)
|
||||||
{
|
{
|
||||||
struct rpc_message msg = {
|
struct rpc_message msg = {
|
||||||
.rpc_proc = &nfs_procedures[NFSPROC_GETATTR],
|
.rpc_proc = &nfs_procedures[NFSPROC_GETATTR],
|
||||||
|
@ -1581,7 +1581,8 @@ struct nfs_rpc_ops {
|
|||||||
struct dentry *(*try_mount) (int, const char *, struct nfs_mount_info *,
|
struct dentry *(*try_mount) (int, const char *, struct nfs_mount_info *,
|
||||||
struct nfs_subversion *);
|
struct nfs_subversion *);
|
||||||
int (*getattr) (struct nfs_server *, struct nfs_fh *,
|
int (*getattr) (struct nfs_server *, struct nfs_fh *,
|
||||||
struct nfs_fattr *, struct nfs4_label *);
|
struct nfs_fattr *, struct nfs4_label *,
|
||||||
|
struct inode *);
|
||||||
int (*setattr) (struct dentry *, struct nfs_fattr *,
|
int (*setattr) (struct dentry *, struct nfs_fattr *,
|
||||||
struct iattr *);
|
struct iattr *);
|
||||||
int (*lookup) (struct inode *, const struct qstr *,
|
int (*lookup) (struct inode *, const struct qstr *,
|
||||||
|
Loading…
Reference in New Issue
Block a user