diff options
author | Jim Rees <rees@umich.edu> | 2011-09-22 21:50:08 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-10-18 12:08:11 -0400 |
commit | 516f2e24faa7548a61d9ba790958528469c2e284 (patch) | |
tree | d4aa8a2fe75ada9a1af5257be8d14cb3b13fef65 | |
parent | 2da956523526e440ef4f4dd174e26f5ac06fe011 (diff) |
pnfsblock: fix return code confusion
Always return PTR_ERR, not NULL, from nfs4_blk_get_deviceinfo and
nfs4_blk_decode_device.
Check for IS_ERR, not NULL, in bl_set_layoutdriver when calling
nfs4_blk_get_deviceinfo.
Signed-off-by: Jim Rees <rees@umich.edu>
Signed-off-by: Benny Halevy <bhalevy@tonian.com>
Cc: stable@kernel.org [3.0]
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.c | 20 | ||||
-rw-r--r-- | fs/nfs/blocklayout/blocklayoutdev.c | 13 |
2 files changed, 20 insertions, 13 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index 9561c8fc8bdb..d2432f0dc40c 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c | |||
@@ -805,7 +805,7 @@ nfs4_blk_get_deviceinfo(struct nfs_server *server, const struct nfs_fh *fh, | |||
805 | struct nfs4_deviceid *d_id) | 805 | struct nfs4_deviceid *d_id) |
806 | { | 806 | { |
807 | struct pnfs_device *dev; | 807 | struct pnfs_device *dev; |
808 | struct pnfs_block_dev *rv = NULL; | 808 | struct pnfs_block_dev *rv; |
809 | u32 max_resp_sz; | 809 | u32 max_resp_sz; |
810 | int max_pages; | 810 | int max_pages; |
811 | struct page **pages = NULL; | 811 | struct page **pages = NULL; |
@@ -823,18 +823,20 @@ nfs4_blk_get_deviceinfo(struct nfs_server *server, const struct nfs_fh *fh, | |||
823 | dev = kmalloc(sizeof(*dev), GFP_NOFS); | 823 | dev = kmalloc(sizeof(*dev), GFP_NOFS); |
824 | if (!dev) { | 824 | if (!dev) { |
825 | dprintk("%s kmalloc failed\n", __func__); | 825 | dprintk("%s kmalloc failed\n", __func__); |
826 | return NULL; | 826 | return ERR_PTR(-ENOMEM); |
827 | } | 827 | } |
828 | 828 | ||
829 | pages = kzalloc(max_pages * sizeof(struct page *), GFP_NOFS); | 829 | pages = kzalloc(max_pages * sizeof(struct page *), GFP_NOFS); |
830 | if (pages == NULL) { | 830 | if (pages == NULL) { |
831 | kfree(dev); | 831 | kfree(dev); |
832 | return NULL; | 832 | return ERR_PTR(-ENOMEM); |
833 | } | 833 | } |
834 | for (i = 0; i < max_pages; i++) { | 834 | for (i = 0; i < max_pages; i++) { |
835 | pages[i] = alloc_page(GFP_NOFS); | 835 | pages[i] = alloc_page(GFP_NOFS); |
836 | if (!pages[i]) | 836 | if (!pages[i]) { |
837 | rv = ERR_PTR(-ENOMEM); | ||
837 | goto out_free; | 838 | goto out_free; |
839 | } | ||
838 | } | 840 | } |
839 | 841 | ||
840 | memcpy(&dev->dev_id, d_id, sizeof(*d_id)); | 842 | memcpy(&dev->dev_id, d_id, sizeof(*d_id)); |
@@ -847,8 +849,10 @@ nfs4_blk_get_deviceinfo(struct nfs_server *server, const struct nfs_fh *fh, | |||
847 | dprintk("%s: dev_id: %s\n", __func__, dev->dev_id.data); | 849 | dprintk("%s: dev_id: %s\n", __func__, dev->dev_id.data); |
848 | rc = nfs4_proc_getdeviceinfo(server, dev); | 850 | rc = nfs4_proc_getdeviceinfo(server, dev); |
849 | dprintk("%s getdevice info returns %d\n", __func__, rc); | 851 | dprintk("%s getdevice info returns %d\n", __func__, rc); |
850 | if (rc) | 852 | if (rc) { |
853 | rv = ERR_PTR(rc); | ||
851 | goto out_free; | 854 | goto out_free; |
855 | } | ||
852 | 856 | ||
853 | rv = nfs4_blk_decode_device(server, dev); | 857 | rv = nfs4_blk_decode_device(server, dev); |
854 | out_free: | 858 | out_free: |
@@ -866,7 +870,7 @@ bl_set_layoutdriver(struct nfs_server *server, const struct nfs_fh *fh) | |||
866 | struct pnfs_devicelist *dlist = NULL; | 870 | struct pnfs_devicelist *dlist = NULL; |
867 | struct pnfs_block_dev *bdev; | 871 | struct pnfs_block_dev *bdev; |
868 | LIST_HEAD(block_disklist); | 872 | LIST_HEAD(block_disklist); |
869 | int status = 0, i; | 873 | int status, i; |
870 | 874 | ||
871 | dprintk("%s enter\n", __func__); | 875 | dprintk("%s enter\n", __func__); |
872 | 876 | ||
@@ -898,8 +902,8 @@ bl_set_layoutdriver(struct nfs_server *server, const struct nfs_fh *fh) | |||
898 | for (i = 0; i < dlist->num_devs; i++) { | 902 | for (i = 0; i < dlist->num_devs; i++) { |
899 | bdev = nfs4_blk_get_deviceinfo(server, fh, | 903 | bdev = nfs4_blk_get_deviceinfo(server, fh, |
900 | &dlist->dev_id[i]); | 904 | &dlist->dev_id[i]); |
901 | if (!bdev) { | 905 | if (IS_ERR(bdev)) { |
902 | status = -ENODEV; | 906 | status = PTR_ERR(bdev); |
903 | goto out_error; | 907 | goto out_error; |
904 | } | 908 | } |
905 | spin_lock(&b_mt_id->bm_lock); | 909 | spin_lock(&b_mt_id->bm_lock); |
diff --git a/fs/nfs/blocklayout/blocklayoutdev.c b/fs/nfs/blocklayout/blocklayoutdev.c index a83b393fb01c..0b1fb0e25b93 100644 --- a/fs/nfs/blocklayout/blocklayoutdev.c +++ b/fs/nfs/blocklayout/blocklayoutdev.c | |||
@@ -131,7 +131,7 @@ struct pnfs_block_dev * | |||
131 | nfs4_blk_decode_device(struct nfs_server *server, | 131 | nfs4_blk_decode_device(struct nfs_server *server, |
132 | struct pnfs_device *dev) | 132 | struct pnfs_device *dev) |
133 | { | 133 | { |
134 | struct pnfs_block_dev *rv = NULL; | 134 | struct pnfs_block_dev *rv; |
135 | struct block_device *bd = NULL; | 135 | struct block_device *bd = NULL; |
136 | struct rpc_pipe_msg msg; | 136 | struct rpc_pipe_msg msg; |
137 | struct bl_msg_hdr bl_msg = { | 137 | struct bl_msg_hdr bl_msg = { |
@@ -141,7 +141,7 @@ nfs4_blk_decode_device(struct nfs_server *server, | |||
141 | uint8_t *dataptr; | 141 | uint8_t *dataptr; |
142 | DECLARE_WAITQUEUE(wq, current); | 142 | DECLARE_WAITQUEUE(wq, current); |
143 | struct bl_dev_msg *reply = &bl_mount_reply; | 143 | struct bl_dev_msg *reply = &bl_mount_reply; |
144 | int offset, len, i; | 144 | int offset, len, i, rc; |
145 | 145 | ||
146 | dprintk("%s CREATING PIPEFS MESSAGE\n", __func__); | 146 | dprintk("%s CREATING PIPEFS MESSAGE\n", __func__); |
147 | dprintk("%s: deviceid: %s, mincount: %d\n", __func__, dev->dev_id.data, | 147 | dprintk("%s: deviceid: %s, mincount: %d\n", __func__, dev->dev_id.data, |
@@ -168,8 +168,10 @@ nfs4_blk_decode_device(struct nfs_server *server, | |||
168 | 168 | ||
169 | dprintk("%s CALLING USERSPACE DAEMON\n", __func__); | 169 | dprintk("%s CALLING USERSPACE DAEMON\n", __func__); |
170 | add_wait_queue(&bl_wq, &wq); | 170 | add_wait_queue(&bl_wq, &wq); |
171 | if (rpc_queue_upcall(bl_device_pipe->d_inode, &msg) < 0) { | 171 | rc = rpc_queue_upcall(bl_device_pipe->d_inode, &msg); |
172 | if (rc < 0) { | ||
172 | remove_wait_queue(&bl_wq, &wq); | 173 | remove_wait_queue(&bl_wq, &wq); |
174 | rv = ERR_PTR(rc); | ||
173 | goto out; | 175 | goto out; |
174 | } | 176 | } |
175 | 177 | ||
@@ -187,8 +189,9 @@ nfs4_blk_decode_device(struct nfs_server *server, | |||
187 | 189 | ||
188 | bd = nfs4_blkdev_get(MKDEV(reply->major, reply->minor)); | 190 | bd = nfs4_blkdev_get(MKDEV(reply->major, reply->minor)); |
189 | if (IS_ERR(bd)) { | 191 | if (IS_ERR(bd)) { |
190 | dprintk("%s failed to open device : %ld\n", | 192 | rc = PTR_ERR(bd); |
191 | __func__, PTR_ERR(bd)); | 193 | dprintk("%s failed to open device : %d\n", __func__, rc); |
194 | rv = ERR_PTR(rc); | ||
192 | goto out; | 195 | goto out; |
193 | } | 196 | } |
194 | 197 | ||