diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f5f125fdae1b..2ce069880d6b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -3628,16 +3628,16 @@ out: | |||
3628 | return ret; | 3628 | return ret; |
3629 | } | 3629 | } |
3630 | 3630 | ||
3631 | static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len) | 3631 | static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size_t pgbase, size_t acl_len) |
3632 | { | 3632 | { |
3633 | struct nfs4_cached_acl *acl; | 3633 | struct nfs4_cached_acl *acl; |
3634 | 3634 | ||
3635 | if (buf && acl_len <= PAGE_SIZE) { | 3635 | if (pages && acl_len <= PAGE_SIZE) { |
3636 | acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL); | 3636 | acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL); |
3637 | if (acl == NULL) | 3637 | if (acl == NULL) |
3638 | goto out; | 3638 | goto out; |
3639 | acl->cached = 1; | 3639 | acl->cached = 1; |
3640 | memcpy(acl->data, buf, acl_len); | 3640 | _copy_from_pages(acl->data, pages, pgbase, acl_len); |
3641 | } else { | 3641 | } else { |
3642 | acl = kmalloc(sizeof(*acl), GFP_KERNEL); | 3642 | acl = kmalloc(sizeof(*acl), GFP_KERNEL); |
3643 | if (acl == NULL) | 3643 | if (acl == NULL) |
@@ -3670,7 +3670,6 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
3670 | struct nfs_getaclres res = { | 3670 | struct nfs_getaclres res = { |
3671 | .acl_len = buflen, | 3671 | .acl_len = buflen, |
3672 | }; | 3672 | }; |
3673 | void *resp_buf; | ||
3674 | struct rpc_message msg = { | 3673 | struct rpc_message msg = { |
3675 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL], | 3674 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL], |
3676 | .rpc_argp = &args, | 3675 | .rpc_argp = &args, |
@@ -3705,7 +3704,6 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
3705 | * the page we send as a guess */ | 3704 | * the page we send as a guess */ |
3706 | if (buf == NULL) | 3705 | if (buf == NULL) |
3707 | res.acl_flags |= NFS4_ACL_LEN_REQUEST; | 3706 | res.acl_flags |= NFS4_ACL_LEN_REQUEST; |
3708 | resp_buf = page_address(pages[0]); | ||
3709 | 3707 | ||
3710 | dprintk("%s buf %p buflen %zu npages %d args.acl_len %zu\n", | 3708 | dprintk("%s buf %p buflen %zu npages %d args.acl_len %zu\n", |
3711 | __func__, buf, buflen, npages, args.acl_len); | 3709 | __func__, buf, buflen, npages, args.acl_len); |
@@ -3716,9 +3714,9 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
3716 | 3714 | ||
3717 | acl_len = res.acl_len - res.acl_data_offset; | 3715 | acl_len = res.acl_len - res.acl_data_offset; |
3718 | if (acl_len > args.acl_len) | 3716 | if (acl_len > args.acl_len) |
3719 | nfs4_write_cached_acl(inode, NULL, acl_len); | 3717 | nfs4_write_cached_acl(inode, NULL, 0, acl_len); |
3720 | else | 3718 | else |
3721 | nfs4_write_cached_acl(inode, resp_buf + res.acl_data_offset, | 3719 | nfs4_write_cached_acl(inode, pages, res.acl_data_offset, |
3722 | acl_len); | 3720 | acl_len); |
3723 | if (buf) { | 3721 | if (buf) { |
3724 | ret = -ERANGE; | 3722 | ret = -ERANGE; |