Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-22 Thread Anand Jain



On 21/05/14 00:33, David Sterba wrote:

On Tue, May 20, 2014 at 02:36:48PM +0800, Anand Jain wrote:

From: Anand Jain anand.j...@oracle.com

generally if you use
   echo test  /sys/fs/btrfs/fsid/label
it would introduce return char at the end and it can not
be part of the label. The correct command is
   echo -n test  /sys/fs/btrfs/fsid/label

This patch will check for this user error

Signed-off-by: Anand Jain anand.j...@oracle.com
---
  v2: accepts review comments. Thanks Eric and Roman

  fs/btrfs/sysfs.c |   20 +---
  1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
index c5eb214..ca63fcd 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -373,22 +373,36 @@ static ssize_t btrfs_label_store(struct kobject *kobj,
struct btrfs_trans_handle *trans;
struct btrfs_root *root = fs_info-fs_root;
int ret;
+   char *label;
+   char *pos;

-   if (len = BTRFS_LABEL_SIZE) {
+   label = kzalloc(len, GFP_NOFS);


You can avoid allocating the buffer entirely:

- search for '\n', if found, use only that amount of bytes
- check for maximum size, copy to label if ok


Thats too good.
Thanks.
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-21 Thread Anand Jain




(Random aside: why does btrfs support online fs relabeling, anyway?)

-Eric


  Online you mean when mounted ?

  But I had an opinion that should we support label store from the sysfs
  interface when the (sysfs) interface can't communicate the module's
  specific errors back to the user.?

Thanks
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-21 Thread Eric Sandeen
On 5/21/14, 9:05 PM, Anand Jain wrote:
 

 (Random aside: why does btrfs support online fs relabeling, anyway?)

 -Eric
 
   Online you mean when mounted ?

Yep - I'm just not sure who would ever want to do that.

Aren't labels primarly used for mounting, during the mount process?

So changing it while mounted seems like a feature looking for a usecase...

-Eric
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-21 Thread Roman Mamedov
On Wed, 21 May 2014 21:14:07 -0500
Eric Sandeen sand...@redhat.com wrote:

  (Random aside: why does btrfs support online fs relabeling, anyway?)
 
  -Eric
  
Online you mean when mounted ?
 
 Yep - I'm just not sure who would ever want to do that.
 
 Aren't labels primarly used for mounting, during the mount process?

Well if you want to change the label of your root filesystem, how else would
you go about that? If Btrfs did not support this, then only while booted from a
rescue LiveCD? That's quite a bit more involved and not even always feasible
in case of remote machines with no IPMI or similar management.

Extfs supports online change of the volume label as well, albeit probably not
via a sysfs file, but with the tune2fs utility:

  tune2fs -L name /dev/blockdevice

-- 
With respect,
Roman


signature.asc
Description: PGP signature


Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-20 Thread Eric Sandeen
On 5/20/14, 1:36 AM, Anand Jain wrote:
 From: Anand Jain anand.j...@oracle.com
 
 generally if you use
   echo test  /sys/fs/btrfs/fsid/label
 it would introduce return char at the end and it can not
 be part of the label. The correct command is
   echo -n test  /sys/fs/btrfs/fsid/label
 
 This patch will check for this user error
 
 Signed-off-by: Anand Jain anand.j...@oracle.com
 ---
  v2: accepts review comments. Thanks Eric and Roman
 
  fs/btrfs/sysfs.c |   20 +---
  1 files changed, 17 insertions(+), 3 deletions(-)
 
 diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
 index c5eb214..ca63fcd 100644
 --- a/fs/btrfs/sysfs.c
 +++ b/fs/btrfs/sysfs.c
 @@ -373,22 +373,36 @@ static ssize_t btrfs_label_store(struct kobject *kobj,
   struct btrfs_trans_handle *trans;
   struct btrfs_root *root = fs_info-fs_root;
   int ret;
 + char *label;
 + char *pos;
  
 - if (len = BTRFS_LABEL_SIZE) {
 + label = kzalloc(len, GFP_NOFS);
 + if (!label)
 + return -ENOMEM;
 +
 + memcpy(label, buf, len);

  + strlcpy(label, buf, len);

would ensure that the resulting string is null-terminated... I don't know
if buf comes in 0-terminated or not, or if len includes \0.  *shrug*
these are strings after all...

 + if ((pos = strchr(label, '\n')))
 + *pos = '\0';

label = strstrip(label); might be simpler/better?

(this would strip all leading  trailing whitespace, I presume that'd
be desirable, but then maybe someone really does want  mylabel \t  ?)

 +
 + if (strlen(label) = BTRFS_LABEL_SIZE) {

hm, strlen doesn't include the \0 right?  so if we had 256 chars + \0, this
would pass, and the subsequent strcpy will copy 257 bytes into a 256-byte
buffer, right?

(I'm terrible at string handling in C, so I might be wrong... you all
can point and laugh if I am)

   pr_err(BTRFS: unable to set label with more than %d bytes\n,
  BTRFS_LABEL_SIZE - 1);
 + kfree(label);
   return -EINVAL;
   }
  
   trans = btrfs_start_transaction(root, 0);
 - if (IS_ERR(trans))
 + if (IS_ERR(trans)) {
 + kfree(label);
   return PTR_ERR(trans);
 + }
  
   spin_lock(root-fs_info-super_lock);
 - strcpy(fs_info-super_copy-label, buf);
 + strcpy(fs_info-super_copy-label, label);
   spin_unlock(root-fs_info-super_lock);
   ret = btrfs_commit_transaction(trans, root);
  
 + kfree(label);

after the 3rd kfree() maybe an

out:

target would be better

(Random aside: why does btrfs support online fs relabeling, anyway?)

-Eric

   if (!ret)
   return len;
  
 

--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-20 Thread David Sterba
On Tue, May 20, 2014 at 02:36:48PM +0800, Anand Jain wrote:
 From: Anand Jain anand.j...@oracle.com
 
 generally if you use
   echo test  /sys/fs/btrfs/fsid/label
 it would introduce return char at the end and it can not
 be part of the label. The correct command is
   echo -n test  /sys/fs/btrfs/fsid/label
 
 This patch will check for this user error
 
 Signed-off-by: Anand Jain anand.j...@oracle.com
 ---
  v2: accepts review comments. Thanks Eric and Roman
 
  fs/btrfs/sysfs.c |   20 +---
  1 files changed, 17 insertions(+), 3 deletions(-)
 
 diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
 index c5eb214..ca63fcd 100644
 --- a/fs/btrfs/sysfs.c
 +++ b/fs/btrfs/sysfs.c
 @@ -373,22 +373,36 @@ static ssize_t btrfs_label_store(struct kobject *kobj,
   struct btrfs_trans_handle *trans;
   struct btrfs_root *root = fs_info-fs_root;
   int ret;
 + char *label;
 + char *pos;
  
 - if (len = BTRFS_LABEL_SIZE) {
 + label = kzalloc(len, GFP_NOFS);

You can avoid allocating the buffer entirely:

- search for '\n', if found, use only that amount of bytes
- check for maximum size, copy to label if ok
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2 v2] btrfs: label should not contain return char

2014-05-20 Thread Eric Sandeen
On 5/20/14, 11:33 AM, David Sterba wrote:
 On Tue, May 20, 2014 at 02:36:48PM +0800, Anand Jain wrote:
 From: Anand Jain anand.j...@oracle.com

 generally if you use
   echo test  /sys/fs/btrfs/fsid/label
 it would introduce return char at the end and it can not
 be part of the label. The correct command is
   echo -n test  /sys/fs/btrfs/fsid/label

 This patch will check for this user error

 Signed-off-by: Anand Jain anand.j...@oracle.com
 ---
  v2: accepts review comments. Thanks Eric and Roman

  fs/btrfs/sysfs.c |   20 +---
  1 files changed, 17 insertions(+), 3 deletions(-)

 diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
 index c5eb214..ca63fcd 100644
 --- a/fs/btrfs/sysfs.c
 +++ b/fs/btrfs/sysfs.c
 @@ -373,22 +373,36 @@ static ssize_t btrfs_label_store(struct kobject *kobj,
  struct btrfs_trans_handle *trans;
  struct btrfs_root *root = fs_info-fs_root;
  int ret;
 +char *label;
 +char *pos;
  
 -if (len = BTRFS_LABEL_SIZE) {
 +label = kzalloc(len, GFP_NOFS);
 
 You can avoid allocating the buffer entirely:
 
 - search for '\n', if found, use only that amount of bytes
 - check for maximum size, copy to label if ok

that's probably better than my strstrip idea, which requires
writable memory.  Odds of finding \t are slim.  ;)

-Eric

--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html