diff mbox series

rbd: introduce new option abort_on_full

Message ID 1544518554-21982-1-git-send-email-dongsheng.yang@easystack.cn (mailing list archive)
State New, archived
Headers show
Series rbd: introduce new option abort_on_full | expand

Commit Message

Dongsheng Yang Dec. 11, 2018, 8:55 a.m. UTC
Introduce a new option abort_on_full, default to false. Then
we can get -ENOSPC when the pool is full, or reaches quota.

Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
---
 drivers/block/rbd.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Ilya Dryomov Dec. 11, 2018, 5:11 p.m. UTC | #1
On Tue, Dec 11, 2018 at 9:56 AM Dongsheng Yang
<dongsheng.yang@easystack.cn> wrote:
>
> Introduce a new option abort_on_full, default to false. Then
> we can get -ENOSPC when the pool is full, or reaches quota.
>
> Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
> ---
>  drivers/block/rbd.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 8e5140b..7cd35e2 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -744,6 +744,7 @@ enum {
>         Opt_lock_on_read,
>         Opt_exclusive,
>         Opt_notrim,
> +       Opt_abort_on_full,
>         Opt_err
>  };
>
> @@ -760,6 +761,7 @@ enum {
>         {Opt_lock_on_read, "lock_on_read"},
>         {Opt_exclusive, "exclusive"},
>         {Opt_notrim, "notrim"},
> +       {Opt_abort_on_full, "abort_on_full"},
>         {Opt_err, NULL}
>  };
>
> @@ -770,6 +772,7 @@ struct rbd_options {
>         bool    lock_on_read;
>         bool    exclusive;
>         bool    trim;
> +       bool    abort_on_full;
>  };
>
>  #define RBD_QUEUE_DEPTH_DEFAULT        BLKDEV_MAX_RQ
> @@ -778,6 +781,7 @@ struct rbd_options {
>  #define RBD_LOCK_ON_READ_DEFAULT false
>  #define RBD_EXCLUSIVE_DEFAULT  false
>  #define RBD_TRIM_DEFAULT       true
> +#define RBD_ABORT_ON_FULL_DEFAULT false
>
>  struct parse_rbd_opts_ctx {
>         struct rbd_spec         *spec;
> @@ -841,6 +845,9 @@ static int parse_rbd_opts_token(char *c, void *private)
>         case Opt_notrim:
>                 pctx->opts->trim = false;
>                 break;
> +       case Opt_abort_on_full:
> +               pctx->opts->abort_on_full = true;
> +               break;
>         default:
>                 /* libceph prints "bad option" msg */
>                 return -EINVAL;
> @@ -5393,6 +5400,7 @@ static int rbd_add_parse_args(const char *buf,
>         pctx.opts->lock_on_read = RBD_LOCK_ON_READ_DEFAULT;
>         pctx.opts->exclusive = RBD_EXCLUSIVE_DEFAULT;
>         pctx.opts->trim = RBD_TRIM_DEFAULT;
> +       pctx.opts->abort_on_full = RBD_ABORT_ON_FULL_DEFAULT;
>
>         copts = ceph_parse_options(options, mon_addrs,
>                                    mon_addrs + mon_addrs_size - 1,
> @@ -5851,6 +5859,8 @@ static ssize_t do_rbd_add(struct bus_type *bus,
>                 goto err_out_args;
>         }
>
> +       rbdc->client->osdc.abort_on_full = rbd_opts->abort_on_full;
> +
>         /* pick the pool */
>         rc = ceph_pg_poolid_by_name(rbdc->client->osdc.osdmap, spec->pool_name);
>         if (rc < 0) {

Hi Dongsheng,

I think it should be a libceph option, not rbd.  By default, libceph
instances are shared and we don't want someone mapping a new image with
abort_on_full to interfere with existing mappings.

Thanks,

                Ilya
Dongsheng Yang Dec. 12, 2018, 5:26 a.m. UTC | #2
On 12/12/2018 01:11 AM, Ilya Dryomov wrote:
> On Tue, Dec 11, 2018 at 9:56 AM Dongsheng Yang
> <dongsheng.yang@easystack.cn> wrote:
>> Introduce a new option abort_on_full, default to false. Then
>> we can get -ENOSPC when the pool is full, or reaches quota.
>>
>> Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
>> ---
>>   drivers/block/rbd.c | 10 ++++++++++
>>   1 file changed, 10 insertions(+)
>>
>> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
>> index 8e5140b..7cd35e2 100644
>> --- a/drivers/block/rbd.c
>> +++ b/drivers/block/rbd.c
>> @@ -744,6 +744,7 @@ enum {
>>          Opt_lock_on_read,
>>          Opt_exclusive,
>>          Opt_notrim,
>> +       Opt_abort_on_full,
>>          Opt_err
>>   };
>>
>> @@ -760,6 +761,7 @@ enum {
>>          {Opt_lock_on_read, "lock_on_read"},
>>          {Opt_exclusive, "exclusive"},
>>          {Opt_notrim, "notrim"},
>> +       {Opt_abort_on_full, "abort_on_full"},
>>          {Opt_err, NULL}
>>   };
>>
>> @@ -770,6 +772,7 @@ struct rbd_options {
>>          bool    lock_on_read;
>>          bool    exclusive;
>>          bool    trim;
>> +       bool    abort_on_full;
>>   };
>>
>>   #define RBD_QUEUE_DEPTH_DEFAULT        BLKDEV_MAX_RQ
>> @@ -778,6 +781,7 @@ struct rbd_options {
>>   #define RBD_LOCK_ON_READ_DEFAULT false
>>   #define RBD_EXCLUSIVE_DEFAULT  false
>>   #define RBD_TRIM_DEFAULT       true
>> +#define RBD_ABORT_ON_FULL_DEFAULT false
>>
>>   struct parse_rbd_opts_ctx {
>>          struct rbd_spec         *spec;
>> @@ -841,6 +845,9 @@ static int parse_rbd_opts_token(char *c, void *private)
>>          case Opt_notrim:
>>                  pctx->opts->trim = false;
>>                  break;
>> +       case Opt_abort_on_full:
>> +               pctx->opts->abort_on_full = true;
>> +               break;
>>          default:
>>                  /* libceph prints "bad option" msg */
>>                  return -EINVAL;
>> @@ -5393,6 +5400,7 @@ static int rbd_add_parse_args(const char *buf,
>>          pctx.opts->lock_on_read = RBD_LOCK_ON_READ_DEFAULT;
>>          pctx.opts->exclusive = RBD_EXCLUSIVE_DEFAULT;
>>          pctx.opts->trim = RBD_TRIM_DEFAULT;
>> +       pctx.opts->abort_on_full = RBD_ABORT_ON_FULL_DEFAULT;
>>
>>          copts = ceph_parse_options(options, mon_addrs,
>>                                     mon_addrs + mon_addrs_size - 1,
>> @@ -5851,6 +5859,8 @@ static ssize_t do_rbd_add(struct bus_type *bus,
>>                  goto err_out_args;
>>          }
>>
>> +       rbdc->client->osdc.abort_on_full = rbd_opts->abort_on_full;
>> +
>>          /* pick the pool */
>>          rc = ceph_pg_poolid_by_name(rbdc->client->osdc.osdmap, spec->pool_name);
>>          if (rc < 0) {
> Hi Dongsheng,
>
> I think it should be a libceph option, not rbd.  By default, libceph
> instances are shared and we don't want someone mapping a new image with
> abort_on_full to interfere with existing mappings.
  Right.

Thanx
>
> Thanks,
>
>                  Ilya
>
diff mbox series

Patch

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 8e5140b..7cd35e2 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -744,6 +744,7 @@  enum {
 	Opt_lock_on_read,
 	Opt_exclusive,
 	Opt_notrim,
+	Opt_abort_on_full,
 	Opt_err
 };
 
@@ -760,6 +761,7 @@  enum {
 	{Opt_lock_on_read, "lock_on_read"},
 	{Opt_exclusive, "exclusive"},
 	{Opt_notrim, "notrim"},
+	{Opt_abort_on_full, "abort_on_full"},
 	{Opt_err, NULL}
 };
 
@@ -770,6 +772,7 @@  struct rbd_options {
 	bool	lock_on_read;
 	bool	exclusive;
 	bool	trim;
+	bool	abort_on_full;
 };
 
 #define RBD_QUEUE_DEPTH_DEFAULT	BLKDEV_MAX_RQ
@@ -778,6 +781,7 @@  struct rbd_options {
 #define RBD_LOCK_ON_READ_DEFAULT false
 #define RBD_EXCLUSIVE_DEFAULT	false
 #define RBD_TRIM_DEFAULT	true
+#define RBD_ABORT_ON_FULL_DEFAULT false
 
 struct parse_rbd_opts_ctx {
 	struct rbd_spec		*spec;
@@ -841,6 +845,9 @@  static int parse_rbd_opts_token(char *c, void *private)
 	case Opt_notrim:
 		pctx->opts->trim = false;
 		break;
+	case Opt_abort_on_full:
+		pctx->opts->abort_on_full = true;
+		break;
 	default:
 		/* libceph prints "bad option" msg */
 		return -EINVAL;
@@ -5393,6 +5400,7 @@  static int rbd_add_parse_args(const char *buf,
 	pctx.opts->lock_on_read = RBD_LOCK_ON_READ_DEFAULT;
 	pctx.opts->exclusive = RBD_EXCLUSIVE_DEFAULT;
 	pctx.opts->trim = RBD_TRIM_DEFAULT;
+	pctx.opts->abort_on_full = RBD_ABORT_ON_FULL_DEFAULT;
 
 	copts = ceph_parse_options(options, mon_addrs,
 				   mon_addrs + mon_addrs_size - 1,
@@ -5851,6 +5859,8 @@  static ssize_t do_rbd_add(struct bus_type *bus,
 		goto err_out_args;
 	}
 
+	rbdc->client->osdc.abort_on_full = rbd_opts->abort_on_full;
+
 	/* pick the pool */
 	rc = ceph_pg_poolid_by_name(rbdc->client->osdc.osdmap, spec->pool_name);
 	if (rc < 0) {