diff options
-rw-r--r-- | drivers/block/nbd.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index a4f2c7b7d8cf..eeefa5cac520 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -55,7 +55,6 @@ struct nbd_device { struct gendisk *disk; int blksize; loff_t bytesize; - pid_t pid; /* pid of nbd-client, if attached */ int xmit_timeout; int disconnect; /* a disconnect has been requested by user */ @@ -379,9 +378,9 @@ static ssize_t pid_show(struct device *dev, struct device_attribute *attr, char *buf) { struct gendisk *disk = dev_to_disk(dev); + struct nbd_device *nbd = (struct nbd_device *)disk->private_data; - return sprintf(buf, "%ld\n", - (long) ((struct nbd_device *)disk->private_data)->pid); + return sprintf(buf, "%d\n", task_pid_nr(nbd->task_recv)); } static struct device_attribute pid_attr = { @@ -397,16 +396,16 @@ static int nbd_do_it(struct nbd_device *nbd) BUG_ON(nbd->magic != NBD_MAGIC); sk_set_memalloc(nbd->sock->sk); - nbd->pid = task_pid_nr(current); + + nbd->task_recv = current; + ret = device_create_file(disk_to_dev(nbd->disk), &pid_attr); if (ret) { dev_err(disk_to_dev(nbd->disk), "device_create_file failed!\n"); - nbd->pid = 0; + nbd->task_recv = NULL; return ret; } - nbd->task_recv = current; - while (1) { req = nbd_read_stat(nbd); if (IS_ERR(req)) { @@ -417,6 +416,8 @@ static int nbd_do_it(struct nbd_device *nbd) nbd_end_request(nbd, req); } + device_remove_file(disk_to_dev(nbd->disk), &pid_attr); + nbd->task_recv = NULL; if (signal_pending(current)) { @@ -431,8 +432,6 @@ static int nbd_do_it(struct nbd_device *nbd) ret = -ETIMEDOUT; } - device_remove_file(disk_to_dev(nbd->disk), &pid_attr); - nbd->pid = 0; return ret; } @@ -708,7 +707,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, struct socket *sock; int error; - if (nbd->pid) + if (nbd->task_recv) return -EBUSY; if (!nbd->sock) return -EINVAL; |