|
@@ -912,6 +912,7 @@ struct nfs4_opendata {
|
|
|
struct nfs_open_confirmres c_res;
|
|
|
struct nfs4_string owner_name;
|
|
|
struct nfs4_string group_name;
|
|
|
+ struct nfs4_label *a_label;
|
|
|
struct nfs_fattr f_attr;
|
|
|
struct nfs4_label *f_label;
|
|
|
struct dentry *dir;
|
|
@@ -1015,6 +1016,10 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
|
|
if (IS_ERR(p->f_label))
|
|
|
goto err_free_p;
|
|
|
|
|
|
+ p->a_label = nfs4_label_alloc(server, gfp_mask);
|
|
|
+ if (IS_ERR(p->a_label))
|
|
|
+ goto err_free_f;
|
|
|
+
|
|
|
alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
|
|
|
p->o_arg.seqid = alloc_seqid(&sp->so_seqid, gfp_mask);
|
|
|
if (IS_ERR(p->o_arg.seqid))
|
|
@@ -1043,7 +1048,7 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
|
|
p->o_arg.server = server;
|
|
|
p->o_arg.bitmask = nfs4_bitmask(server, label);
|
|
|
p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0];
|
|
|
- p->o_arg.label = label;
|
|
|
+ p->o_arg.label = nfs4_label_copy(p->a_label, label);
|
|
|
p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim);
|
|
|
switch (p->o_arg.claim) {
|
|
|
case NFS4_OPEN_CLAIM_NULL:
|
|
@@ -1076,6 +1081,8 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
|
|
return p;
|
|
|
|
|
|
err_free_label:
|
|
|
+ nfs4_label_free(p->a_label);
|
|
|
+err_free_f:
|
|
|
nfs4_label_free(p->f_label);
|
|
|
err_free_p:
|
|
|
kfree(p);
|
|
@@ -1095,6 +1102,7 @@ static void nfs4_opendata_free(struct kref *kref)
|
|
|
nfs4_put_open_state(p->state);
|
|
|
nfs4_put_state_owner(p->owner);
|
|
|
|
|
|
+ nfs4_label_free(p->a_label);
|
|
|
nfs4_label_free(p->f_label);
|
|
|
|
|
|
dput(p->dir);
|