* [PATCH 0/5] Misc props.c cleanups
@ 2019-02-08 7:02 Anand Jain
2019-02-08 7:02 ` [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock Anand Jain
` (5 more replies)
0 siblings, 6 replies; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:02 UTC (permalink / raw)
To: linux-btrfs
While adding the readmirror property found few cleanup things which
can be fixed. As these aren't part of upcoming readmirror property
I am sending these separately. Except for 1/5 rest fixes are in
props.c. 1/5 is in volume.c.
Anand Jain (5):
btrfs: fix comment its device list mutex not volume lock
btrfs: kill __btrfs_set_prop()
btrfs: reorg functions to drop forward declaration
btrfs: drop redundant forward declaration in props.c
btrfs: trivial, fix c coding style
fs/btrfs/ioctl.c | 10 +--
fs/btrfs/props.c | 201 ++++++++++++++++++++++++-----------------------------
fs/btrfs/props.h | 6 +-
fs/btrfs/volumes.c | 2 +-
fs/btrfs/xattr.c | 2 +-
5 files changed, 100 insertions(+), 121 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
@ 2019-02-08 7:02 ` Anand Jain
2019-02-08 7:07 ` Nikolay Borisov
2019-02-08 7:02 ` [PATCH 2/5] btrfs: kill __btrfs_set_prop() Anand Jain
` (4 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:02 UTC (permalink / raw)
To: linux-btrfs
We have killed volume mutex (commit: dccdb07bc996
btrfs: kill btrfs_fs_info::volume_mutex) update comment. This a trival one
seems to have escaped.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/volumes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index fe122e6099ae..8160749cd9ba 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1129,7 +1129,7 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
mutex_lock(&orig->device_list_mutex);
fs_devices->total_devices = orig->total_devices;
- /* We have held the volume lock, it is safe to get the devices. */
+ /* We have held the device_list_mutex, it is safe to get the devices. */
list_for_each_entry(orig_dev, &orig->devices, dev_list) {
struct rcu_string *name;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 2/5] btrfs: kill __btrfs_set_prop()
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
2019-02-08 7:02 ` [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock Anand Jain
@ 2019-02-08 7:02 ` Anand Jain
2019-02-08 7:02 ` [PATCH 3/5] btrfs: reorg functions to drop forward declaration Anand Jain
` (3 subsequent siblings)
5 siblings, 0 replies; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:02 UTC (permalink / raw)
To: linux-btrfs
btrfs_set_prop() is a redirect to __btrfs_set_prop() with the
transaction handler equal to NULL. And __btrfs_set_prop() inturn diectly
uses trans to do_setxattr() which when trans is NULL creates a transaction.
Instead rename __btrfs_set_prop() to btrfs_set_prop(), and update the
caller with NULL argument.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/ioctl.c | 10 ++++++----
fs/btrfs/props.c | 22 +++++-----------------
fs/btrfs/props.h | 6 ++----
fs/btrfs/xattr.c | 2 +-
4 files changed, 14 insertions(+), 26 deletions(-)
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 3f9d7be30bf4..5a4ed2f66e09 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -284,7 +284,8 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
binode->flags &= ~BTRFS_INODE_COMPRESS;
binode->flags |= BTRFS_INODE_NOCOMPRESS;
- ret = btrfs_set_prop(inode, "btrfs.compression", NULL, 0, 0);
+ ret = btrfs_set_prop(NULL, inode, "btrfs.compression", NULL, 0,
+ 0);
if (ret && ret != -ENODATA)
goto out_drop;
} else if (fsflags & FS_COMPR_FL) {
@@ -302,13 +303,14 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg)
if (!comp || comp[0] == 0)
comp = btrfs_compress_type2str(BTRFS_COMPRESS_ZLIB);
- ret = btrfs_set_prop(inode, "btrfs.compression",
- comp, strlen(comp), 0);
+ ret = btrfs_set_prop(NULL, inode, "btrfs.compression", comp,
+ strlen(comp), 0);
if (ret)
goto out_drop;
} else {
- ret = btrfs_set_prop(inode, "btrfs.compression", NULL, 0, 0);
+ ret = btrfs_set_prop(NULL, inode, "btrfs.compression", NULL, 0,
+ 0);
if (ret && ret != -ENODATA)
goto out_drop;
binode->flags &= ~(BTRFS_INODE_COMPRESS | BTRFS_INODE_NOCOMPRESS);
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index dc6140013ae8..4525a2a4d1cd 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -85,12 +85,9 @@ static const struct hlist_head *find_prop_handlers_by_hash(const u64 hash)
return NULL;
}
-static int __btrfs_set_prop(struct btrfs_trans_handle *trans,
- struct inode *inode,
- const char *name,
- const char *value,
- size_t value_len,
- int flags)
+int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
+ const char *name, const char *value, size_t value_len,
+ int flags)
{
const struct prop_handler *handler;
int ret;
@@ -133,15 +130,6 @@ static int __btrfs_set_prop(struct btrfs_trans_handle *trans,
return 0;
}
-int btrfs_set_prop(struct inode *inode,
- const char *name,
- const char *value,
- size_t value_len,
- int flags)
-{
- return __btrfs_set_prop(NULL, inode, name, value, value_len, flags);
-}
-
static int iterate_object_props(struct btrfs_root *root,
struct btrfs_path *path,
u64 objectid,
@@ -313,8 +301,8 @@ static int inherit_props(struct btrfs_trans_handle *trans,
num_bytes, BTRFS_RESERVE_NO_FLUSH);
if (ret)
goto out;
- ret = __btrfs_set_prop(trans, inode, h->xattr_name,
- value, strlen(value), 0);
+ ret = btrfs_set_prop(trans, inode, h->xattr_name, value,
+ strlen(value), 0);
btrfs_block_rsv_release(fs_info, trans->block_rsv, num_bytes);
if (ret)
goto out;
diff --git a/fs/btrfs/props.h b/fs/btrfs/props.h
index 618815b4f9d5..9dbdae47cf27 100644
--- a/fs/btrfs/props.h
+++ b/fs/btrfs/props.h
@@ -10,10 +10,8 @@
void __init btrfs_props_init(void);
-int btrfs_set_prop(struct inode *inode,
- const char *name,
- const char *value,
- size_t value_len,
+int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
+ const char *name, const char *value, size_t value_len,
int flags);
int btrfs_load_inode_props(struct inode *inode, struct btrfs_path *path);
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index f141b45ce349..499bb79ba135 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -379,7 +379,7 @@ static int btrfs_xattr_handler_set_prop(const struct xattr_handler *handler,
size_t size, int flags)
{
name = xattr_full_name(handler, name);
- return btrfs_set_prop(inode, name, value, size, flags);
+ return btrfs_set_prop(NULL, inode, name, value, size, flags);
}
static const struct xattr_handler btrfs_security_xattr_handler = {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 3/5] btrfs: reorg functions to drop forward declaration
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
2019-02-08 7:02 ` [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock Anand Jain
2019-02-08 7:02 ` [PATCH 2/5] btrfs: kill __btrfs_set_prop() Anand Jain
@ 2019-02-08 7:02 ` Anand Jain
2019-02-08 7:10 ` Nikolay Borisov
2019-02-08 7:02 ` [PATCH 4/5] btrfs: drop redundant forward declaration in props.c Anand Jain
` (2 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:02 UTC (permalink / raw)
To: linux-btrfs
In preparation to drop forward declaration of the functions,
prop_compression_validate(), prop_compression_apply() and
prop_compression_extract(). Move prop_handlers[], btrfs_props_init()
prop_compression_validate(), prop_compression_apply() and
prop_compression_extract() appropriately with in the file. No functional
changes.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/props.c | 157 ++++++++++++++++++++++++++++---------------------------
1 file changed, 79 insertions(+), 78 deletions(-)
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index 4525a2a4d1cd..6f52e3d21012 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -29,30 +29,6 @@ static int prop_compression_apply(struct inode *inode,
size_t len);
static const char *prop_compression_extract(struct inode *inode);
-static struct prop_handler prop_handlers[] = {
- {
- .xattr_name = XATTR_BTRFS_PREFIX "compression",
- .validate = prop_compression_validate,
- .apply = prop_compression_apply,
- .extract = prop_compression_extract,
- .inheritable = 1
- },
-};
-
-void __init btrfs_props_init(void)
-{
- int i;
-
- hash_init(prop_handlers_ht);
-
- for (i = 0; i < ARRAY_SIZE(prop_handlers); i++) {
- struct prop_handler *p = &prop_handlers[i];
- u64 h = btrfs_name_hash(p->xattr_name, strlen(p->xattr_name));
-
- hash_add(prop_handlers_ht, &p->node, h);
- }
-}
-
static const struct hlist_head *find_prop_handlers_by_hash(const u64 hash)
{
struct hlist_head *h;
@@ -271,6 +247,78 @@ int btrfs_load_inode_props(struct inode *inode, struct btrfs_path *path)
return ret;
}
+static int prop_compression_validate(const char *value, size_t len)
+{
+ if (!value)
+ return 0;
+
+ if (!strncmp("lzo", value, len))
+ return 0;
+ else if (!strncmp("zlib", value, len))
+ return 0;
+ else if (!strncmp("zstd", value, len))
+ return 0;
+
+ return -EINVAL;
+}
+
+static int prop_compression_apply(struct inode *inode, const char *value,
+ size_t len)
+{
+ struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+ int type;
+
+ if (len == 0) {
+ BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
+ BTRFS_I(inode)->flags &= ~BTRFS_INODE_COMPRESS;
+ BTRFS_I(inode)->prop_compress = BTRFS_COMPRESS_NONE;
+
+ return 0;
+ }
+
+ if (!strncmp("lzo", value, 3)) {
+ type = BTRFS_COMPRESS_LZO;
+ btrfs_set_fs_incompat(fs_info, COMPRESS_LZO);
+ } else if (!strncmp("zlib", value, 4)) {
+ type = BTRFS_COMPRESS_ZLIB;
+ } else if (!strncmp("zstd", value, len)) {
+ type = BTRFS_COMPRESS_ZSTD;
+ btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
+ } else {
+ return -EINVAL;
+ }
+
+ BTRFS_I(inode)->flags &= ~BTRFS_INODE_NOCOMPRESS;
+ BTRFS_I(inode)->flags |= BTRFS_INODE_COMPRESS;
+ BTRFS_I(inode)->prop_compress = type;
+
+ return 0;
+}
+
+static const char *prop_compression_extract(struct inode *inode)
+{
+ switch (BTRFS_I(inode)->prop_compress) {
+ case BTRFS_COMPRESS_ZLIB:
+ case BTRFS_COMPRESS_LZO:
+ case BTRFS_COMPRESS_ZSTD:
+ return btrfs_compress_type2str(BTRFS_I(inode)->prop_compress);
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+static struct prop_handler prop_handlers[] = {
+ {
+ .xattr_name = XATTR_BTRFS_PREFIX "compression",
+ .validate = prop_compression_validate,
+ .apply = prop_compression_apply,
+ .extract = prop_compression_extract,
+ .inheritable = 1
+ },
+};
+
static int inherit_props(struct btrfs_trans_handle *trans,
struct inode *inode,
struct inode *parent)
@@ -352,64 +400,17 @@ int btrfs_subvol_inherit_props(struct btrfs_trans_handle *trans,
return ret;
}
-static int prop_compression_validate(const char *value, size_t len)
-{
- if (!strncmp("lzo", value, len))
- return 0;
- else if (!strncmp("zlib", value, len))
- return 0;
- else if (!strncmp("zstd", value, len))
- return 0;
-
- return -EINVAL;
-}
-
-static int prop_compression_apply(struct inode *inode,
- const char *value,
- size_t len)
+void __init btrfs_props_init(void)
{
- struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
- int type;
-
- if (len == 0) {
- BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
- BTRFS_I(inode)->flags &= ~BTRFS_INODE_COMPRESS;
- BTRFS_I(inode)->prop_compress = BTRFS_COMPRESS_NONE;
-
- return 0;
- }
-
- if (!strncmp("lzo", value, 3)) {
- type = BTRFS_COMPRESS_LZO;
- btrfs_set_fs_incompat(fs_info, COMPRESS_LZO);
- } else if (!strncmp("zlib", value, 4)) {
- type = BTRFS_COMPRESS_ZLIB;
- } else if (!strncmp("zstd", value, len)) {
- type = BTRFS_COMPRESS_ZSTD;
- btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
- } else {
- return -EINVAL;
- }
+ int i;
- BTRFS_I(inode)->flags &= ~BTRFS_INODE_NOCOMPRESS;
- BTRFS_I(inode)->flags |= BTRFS_INODE_COMPRESS;
- BTRFS_I(inode)->prop_compress = type;
+ hash_init(prop_handlers_ht);
- return 0;
-}
+ for (i = 0; i < ARRAY_SIZE(prop_handlers); i++) {
+ struct prop_handler *p = &prop_handlers[i];
+ u64 h = btrfs_name_hash(p->xattr_name, strlen(p->xattr_name));
-static const char *prop_compression_extract(struct inode *inode)
-{
- switch (BTRFS_I(inode)->prop_compress) {
- case BTRFS_COMPRESS_ZLIB:
- case BTRFS_COMPRESS_LZO:
- case BTRFS_COMPRESS_ZSTD:
- return btrfs_compress_type2str(BTRFS_I(inode)->prop_compress);
- default:
- break;
+ hash_add(prop_handlers_ht, &p->node, h);
}
-
- return NULL;
}
-
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 4/5] btrfs: drop redundant forward declaration in props.c
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
` (2 preceding siblings ...)
2019-02-08 7:02 ` [PATCH 3/5] btrfs: reorg functions to drop forward declaration Anand Jain
@ 2019-02-08 7:02 ` Anand Jain
2019-02-08 7:09 ` Nikolay Borisov
2019-02-08 7:02 ` [PATCH 5/5] btrfs: trivial, fix c coding style Anand Jain
2019-02-08 7:15 ` [PATCH 0/5] Misc props.c cleanups Nikolay Borisov
5 siblings, 1 reply; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:02 UTC (permalink / raw)
To: linux-btrfs
Drop forward declaration of the functions,
prop_compression_validate(), prop_compression_apply() and
prop_compression_extract().
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/props.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index 6f52e3d21012..77a03076b18e 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -23,12 +23,6 @@ struct prop_handler {
int inheritable;
};
-static int prop_compression_validate(const char *value, size_t len);
-static int prop_compression_apply(struct inode *inode,
- const char *value,
- size_t len);
-static const char *prop_compression_extract(struct inode *inode);
-
static const struct hlist_head *find_prop_handlers_by_hash(const u64 hash)
{
struct hlist_head *h;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 5/5] btrfs: trivial, fix c coding style
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
` (3 preceding siblings ...)
2019-02-08 7:02 ` [PATCH 4/5] btrfs: drop redundant forward declaration in props.c Anand Jain
@ 2019-02-08 7:02 ` Anand Jain
2019-02-08 7:09 ` Nikolay Borisov
2019-02-08 7:15 ` [PATCH 0/5] Misc props.c cleanups Nikolay Borisov
5 siblings, 1 reply; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:02 UTC (permalink / raw)
To: linux-btrfs
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/props.c | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index 77a03076b18e..3c15f19bfd2f 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -70,8 +70,8 @@ int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
return -EINVAL;
if (value_len == 0) {
- ret = btrfs_setxattr(trans, inode, handler->xattr_name,
- NULL, 0, flags);
+ ret = btrfs_setxattr(trans, inode, handler->xattr_name, NULL, 0,
+ flags);
if (ret)
return ret;
@@ -101,12 +101,10 @@ int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
}
static int iterate_object_props(struct btrfs_root *root,
- struct btrfs_path *path,
- u64 objectid,
+ struct btrfs_path *path, u64 objectid,
void (*iterator)(void *,
const struct prop_handler *,
- const char *,
- size_t),
+ const char *, size_t),
void *ctx)
{
int ret;
@@ -211,10 +209,8 @@ static int iterate_object_props(struct btrfs_root *root,
return ret;
}
-static void inode_prop_iterator(void *ctx,
- const struct prop_handler *handler,
- const char *value,
- size_t len)
+static void inode_prop_iterator(void *ctx, const struct prop_handler *handler,
+ const char *value, size_t len)
{
struct inode *inode = ctx;
struct btrfs_root *root = BTRFS_I(inode)->root;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock
2019-02-08 7:02 ` [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock Anand Jain
@ 2019-02-08 7:07 ` Nikolay Borisov
2019-02-08 7:16 ` Anand Jain
0 siblings, 1 reply; 17+ messages in thread
From: Nikolay Borisov @ 2019-02-08 7:07 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 8.02.19 г. 9:02 ч., Anand Jain wrote:
> We have killed volume mutex (commit: dccdb07bc996
> btrfs: kill btrfs_fs_info::volume_mutex) update comment. This a trival one
> seems to have escaped.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> fs/btrfs/volumes.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index fe122e6099ae..8160749cd9ba 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1129,7 +1129,7 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
> mutex_lock(&orig->device_list_mutex);
> fs_devices->total_devices = orig->total_devices;
>
> - /* We have held the volume lock, it is safe to get the devices. */
> + /* We have held the device_list_mutex, it is safe to get the devices. */
I'd rather have the comment replaced with lockdep_assert_held it's a lot
more eloquent.
> list_for_each_entry(orig_dev, &orig->devices, dev_list) {
> struct rcu_string *name;
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 5/5] btrfs: trivial, fix c coding style
2019-02-08 7:02 ` [PATCH 5/5] btrfs: trivial, fix c coding style Anand Jain
@ 2019-02-08 7:09 ` Nikolay Borisov
0 siblings, 0 replies; 17+ messages in thread
From: Nikolay Borisov @ 2019-02-08 7:09 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 8.02.19 г. 9:02 ч., Anand Jain wrote:
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
> ---
> fs/btrfs/props.c | 16 ++++++----------
> 1 file changed, 6 insertions(+), 10 deletions(-)
>
> diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
> index 77a03076b18e..3c15f19bfd2f 100644
> --- a/fs/btrfs/props.c
> +++ b/fs/btrfs/props.c
> @@ -70,8 +70,8 @@ int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
> return -EINVAL;
>
> if (value_len == 0) {
> - ret = btrfs_setxattr(trans, inode, handler->xattr_name,
> - NULL, 0, flags);
> + ret = btrfs_setxattr(trans, inode, handler->xattr_name, NULL, 0,
> + flags);
> if (ret)
> return ret;
>
> @@ -101,12 +101,10 @@ int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
> }
>
> static int iterate_object_props(struct btrfs_root *root,
> - struct btrfs_path *path,
> - u64 objectid,
> + struct btrfs_path *path, u64 objectid,
> void (*iterator)(void *,
> const struct prop_handler *,
> - const char *,
> - size_t),
> + const char *, size_t),
> void *ctx)
> {
> int ret;
> @@ -211,10 +209,8 @@ static int iterate_object_props(struct btrfs_root *root,
> return ret;
> }
>
> -static void inode_prop_iterator(void *ctx,
> - const struct prop_handler *handler,
> - const char *value,
> - size_t len)
> +static void inode_prop_iterator(void *ctx, const struct prop_handler *handler,
> + const char *value, size_t len)
> {
> struct inode *inode = ctx;
> struct btrfs_root *root = BTRFS_I(inode)->root;
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 4/5] btrfs: drop redundant forward declaration in props.c
2019-02-08 7:02 ` [PATCH 4/5] btrfs: drop redundant forward declaration in props.c Anand Jain
@ 2019-02-08 7:09 ` Nikolay Borisov
0 siblings, 0 replies; 17+ messages in thread
From: Nikolay Borisov @ 2019-02-08 7:09 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 8.02.19 г. 9:02 ч., Anand Jain wrote:
> Drop forward declaration of the functions,
> prop_compression_validate(), prop_compression_apply() and
> prop_compression_extract().
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
> ---
> fs/btrfs/props.c | 6 ------
> 1 file changed, 6 deletions(-)
>
> diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
> index 6f52e3d21012..77a03076b18e 100644
> --- a/fs/btrfs/props.c
> +++ b/fs/btrfs/props.c
> @@ -23,12 +23,6 @@ struct prop_handler {
> int inheritable;
> };
>
> -static int prop_compression_validate(const char *value, size_t len);
> -static int prop_compression_apply(struct inode *inode,
> - const char *value,
> - size_t len);
> -static const char *prop_compression_extract(struct inode *inode);
> -
> static const struct hlist_head *find_prop_handlers_by_hash(const u64 hash)
> {
> struct hlist_head *h;
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] btrfs: reorg functions to drop forward declaration
2019-02-08 7:02 ` [PATCH 3/5] btrfs: reorg functions to drop forward declaration Anand Jain
@ 2019-02-08 7:10 ` Nikolay Borisov
2019-02-11 18:43 ` David Sterba
0 siblings, 1 reply; 17+ messages in thread
From: Nikolay Borisov @ 2019-02-08 7:10 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 8.02.19 г. 9:02 ч., Anand Jain wrote:
> In preparation to drop forward declaration of the functions,
> prop_compression_validate(), prop_compression_apply() and
> prop_compression_extract(). Move prop_handlers[], btrfs_props_init()
> prop_compression_validate(), prop_compression_apply() and
> prop_compression_extract() appropriately with in the file. No functional
> changes.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
I'm fine with this, however I think this and the next patch could really
be squashed into one, but let's see what David prefers.
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
> ---
> fs/btrfs/props.c | 157 ++++++++++++++++++++++++++++---------------------------
> 1 file changed, 79 insertions(+), 78 deletions(-)
>
> diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
> index 4525a2a4d1cd..6f52e3d21012 100644
> --- a/fs/btrfs/props.c
> +++ b/fs/btrfs/props.c
> @@ -29,30 +29,6 @@ static int prop_compression_apply(struct inode *inode,
> size_t len);
> static const char *prop_compression_extract(struct inode *inode);
>
> -static struct prop_handler prop_handlers[] = {
> - {
> - .xattr_name = XATTR_BTRFS_PREFIX "compression",
> - .validate = prop_compression_validate,
> - .apply = prop_compression_apply,
> - .extract = prop_compression_extract,
> - .inheritable = 1
> - },
> -};
> -
> -void __init btrfs_props_init(void)
> -{
> - int i;
> -
> - hash_init(prop_handlers_ht);
> -
> - for (i = 0; i < ARRAY_SIZE(prop_handlers); i++) {
> - struct prop_handler *p = &prop_handlers[i];
> - u64 h = btrfs_name_hash(p->xattr_name, strlen(p->xattr_name));
> -
> - hash_add(prop_handlers_ht, &p->node, h);
> - }
> -}
> -
> static const struct hlist_head *find_prop_handlers_by_hash(const u64 hash)
> {
> struct hlist_head *h;
> @@ -271,6 +247,78 @@ int btrfs_load_inode_props(struct inode *inode, struct btrfs_path *path)
> return ret;
> }
>
> +static int prop_compression_validate(const char *value, size_t len)
> +{
> + if (!value)
> + return 0;
> +
> + if (!strncmp("lzo", value, len))
> + return 0;
> + else if (!strncmp("zlib", value, len))
> + return 0;
> + else if (!strncmp("zstd", value, len))
> + return 0;
> +
> + return -EINVAL;
> +}
> +
> +static int prop_compression_apply(struct inode *inode, const char *value,
> + size_t len)
> +{
> + struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
> + int type;
> +
> + if (len == 0) {
> + BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
> + BTRFS_I(inode)->flags &= ~BTRFS_INODE_COMPRESS;
> + BTRFS_I(inode)->prop_compress = BTRFS_COMPRESS_NONE;
> +
> + return 0;
> + }
> +
> + if (!strncmp("lzo", value, 3)) {
> + type = BTRFS_COMPRESS_LZO;
> + btrfs_set_fs_incompat(fs_info, COMPRESS_LZO);
> + } else if (!strncmp("zlib", value, 4)) {
> + type = BTRFS_COMPRESS_ZLIB;
> + } else if (!strncmp("zstd", value, len)) {
> + type = BTRFS_COMPRESS_ZSTD;
> + btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
> + } else {
> + return -EINVAL;
> + }
> +
> + BTRFS_I(inode)->flags &= ~BTRFS_INODE_NOCOMPRESS;
> + BTRFS_I(inode)->flags |= BTRFS_INODE_COMPRESS;
> + BTRFS_I(inode)->prop_compress = type;
> +
> + return 0;
> +}
> +
> +static const char *prop_compression_extract(struct inode *inode)
> +{
> + switch (BTRFS_I(inode)->prop_compress) {
> + case BTRFS_COMPRESS_ZLIB:
> + case BTRFS_COMPRESS_LZO:
> + case BTRFS_COMPRESS_ZSTD:
> + return btrfs_compress_type2str(BTRFS_I(inode)->prop_compress);
> + default:
> + break;
> + }
> +
> + return NULL;
> +}
> +
> +static struct prop_handler prop_handlers[] = {
> + {
> + .xattr_name = XATTR_BTRFS_PREFIX "compression",
> + .validate = prop_compression_validate,
> + .apply = prop_compression_apply,
> + .extract = prop_compression_extract,
> + .inheritable = 1
> + },
> +};
> +
> static int inherit_props(struct btrfs_trans_handle *trans,
> struct inode *inode,
> struct inode *parent)
> @@ -352,64 +400,17 @@ int btrfs_subvol_inherit_props(struct btrfs_trans_handle *trans,
> return ret;
> }
>
> -static int prop_compression_validate(const char *value, size_t len)
> -{
> - if (!strncmp("lzo", value, len))
> - return 0;
> - else if (!strncmp("zlib", value, len))
> - return 0;
> - else if (!strncmp("zstd", value, len))
> - return 0;
> -
> - return -EINVAL;
> -}
> -
> -static int prop_compression_apply(struct inode *inode,
> - const char *value,
> - size_t len)
> +void __init btrfs_props_init(void)
> {
> - struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
> - int type;
> -
> - if (len == 0) {
> - BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS;
> - BTRFS_I(inode)->flags &= ~BTRFS_INODE_COMPRESS;
> - BTRFS_I(inode)->prop_compress = BTRFS_COMPRESS_NONE;
> -
> - return 0;
> - }
> -
> - if (!strncmp("lzo", value, 3)) {
> - type = BTRFS_COMPRESS_LZO;
> - btrfs_set_fs_incompat(fs_info, COMPRESS_LZO);
> - } else if (!strncmp("zlib", value, 4)) {
> - type = BTRFS_COMPRESS_ZLIB;
> - } else if (!strncmp("zstd", value, len)) {
> - type = BTRFS_COMPRESS_ZSTD;
> - btrfs_set_fs_incompat(fs_info, COMPRESS_ZSTD);
> - } else {
> - return -EINVAL;
> - }
> + int i;
>
> - BTRFS_I(inode)->flags &= ~BTRFS_INODE_NOCOMPRESS;
> - BTRFS_I(inode)->flags |= BTRFS_INODE_COMPRESS;
> - BTRFS_I(inode)->prop_compress = type;
> + hash_init(prop_handlers_ht);
>
> - return 0;
> -}
> + for (i = 0; i < ARRAY_SIZE(prop_handlers); i++) {
> + struct prop_handler *p = &prop_handlers[i];
> + u64 h = btrfs_name_hash(p->xattr_name, strlen(p->xattr_name));
>
> -static const char *prop_compression_extract(struct inode *inode)
> -{
> - switch (BTRFS_I(inode)->prop_compress) {
> - case BTRFS_COMPRESS_ZLIB:
> - case BTRFS_COMPRESS_LZO:
> - case BTRFS_COMPRESS_ZSTD:
> - return btrfs_compress_type2str(BTRFS_I(inode)->prop_compress);
> - default:
> - break;
> + hash_add(prop_handlers_ht, &p->node, h);
> }
> -
> - return NULL;
> }
>
> -
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 0/5] Misc props.c cleanups
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
` (4 preceding siblings ...)
2019-02-08 7:02 ` [PATCH 5/5] btrfs: trivial, fix c coding style Anand Jain
@ 2019-02-08 7:15 ` Nikolay Borisov
2019-02-08 7:31 ` Anand Jain
5 siblings, 1 reply; 17+ messages in thread
From: Nikolay Borisov @ 2019-02-08 7:15 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 8.02.19 г. 9:02 ч., Anand Jain wrote:
> While adding the readmirror property found few cleanup things which
> can be fixed. As these aren't part of upcoming readmirror property
> I am sending these separately. Except for 1/5 rest fixes are in
> props.c. 1/5 is in volume.c.
>
> Anand Jain (5):
> btrfs: fix comment its device list mutex not volume lock
> btrfs: kill __btrfs_set_prop()
> btrfs: reorg functions to drop forward declaration
> btrfs: drop redundant forward declaration in props.c
> btrfs: trivial, fix c coding style
>
> fs/btrfs/ioctl.c | 10 +--
> fs/btrfs/props.c | 201 ++++++++++++++++++++++++-----------------------------
> fs/btrfs/props.h | 6 +-
> fs/btrfs/volumes.c | 2 +-
> fs/btrfs/xattr.c | 2 +-
> 5 files changed, 100 insertions(+), 121 deletions(-)
>
Allow me to suggest to introduce another patch with the following hunk:
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index ea78c3d6dcfc..37e9af2a9f8c 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -229,12 +229,11 @@ int btrfs_setxattr(struct btrfs_trans_handle *trans,
if (btrfs_root_readonly(root))
return -EROFS;
- if (trans)
- return do_setxattr(trans, inode, name, value, size, flags);
-
- trans = btrfs_start_transaction(root, 2);
- if (IS_ERR(trans))
- return PTR_ERR(trans);
+ if (!trans) {
+ trans = btrfs_start_transaction(root, 2);
+ if (IS_ERR(trans))
+ return PTR_ERR(trans);
+ }
ret = do_setxattr(trans, inode, name, value, size, flags);
if (ret)
This just inverts the logic for !trans and makes the code a bit more
linear and (IMO) easier to follow.
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock
2019-02-08 7:07 ` Nikolay Borisov
@ 2019-02-08 7:16 ` Anand Jain
2019-02-08 7:19 ` Nikolay Borisov
0 siblings, 1 reply; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:16 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 2/8/19 3:07 PM, Nikolay Borisov wrote:
>
>
> On 8.02.19 г. 9:02 ч., Anand Jain wrote:
>> We have killed volume mutex (commit: dccdb07bc996
>> btrfs: kill btrfs_fs_info::volume_mutex) update comment. This a trival one
>> seems to have escaped.
>>
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>> fs/btrfs/volumes.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index fe122e6099ae..8160749cd9ba 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -1129,7 +1129,7 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
>> mutex_lock(&orig->device_list_mutex);
>> fs_devices->total_devices = orig->total_devices;
>>
>> - /* We have held the volume lock, it is safe to get the devices. */
>> + /* We have held the device_list_mutex, it is safe to get the devices. */
>
> I'd rather have the comment replaced with lockdep_assert_held it's a lot
> more eloquent.
I agree if we don't acquire the required lock in the same function,
but here, we call the required mutex_lock(&orig->device_list_mutex);
just three lines above in the same function.
Where do we need the lockdep_assert_held()?
-Anand
>> list_for_each_entry(orig_dev, &orig->devices, dev_list) {
>> struct rcu_string *name;
>>
>>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock
2019-02-08 7:16 ` Anand Jain
@ 2019-02-08 7:19 ` Nikolay Borisov
2019-02-08 7:39 ` [PATCH v2 " Anand Jain
0 siblings, 1 reply; 17+ messages in thread
From: Nikolay Borisov @ 2019-02-08 7:19 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 8.02.19 г. 9:16 ч., Anand Jain wrote:
>
>
> On 2/8/19 3:07 PM, Nikolay Borisov wrote:
>>
>>
>> On 8.02.19 г. 9:02 ч., Anand Jain wrote:
>>> We have killed volume mutex (commit: dccdb07bc996
>>> btrfs: kill btrfs_fs_info::volume_mutex) update comment. This a
>>> trival one
>>> seems to have escaped.
>>>
>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>> ---
>>> fs/btrfs/volumes.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>>> index fe122e6099ae..8160749cd9ba 100644
>>> --- a/fs/btrfs/volumes.c
>>> +++ b/fs/btrfs/volumes.c
>>> @@ -1129,7 +1129,7 @@ static struct btrfs_fs_devices
>>> *clone_fs_devices(struct btrfs_fs_devices *orig)
>>> mutex_lock(&orig->device_list_mutex);
>>> fs_devices->total_devices = orig->total_devices;
>>> - /* We have held the volume lock, it is safe to get the
>>> devices. */
>>> + /* We have held the device_list_mutex, it is safe to get the
>>> devices. */
>>
>> I'd rather have the comment replaced with lockdep_assert_held it's a lot
>> more eloquent.
>
> I agree if we don't acquire the required lock in the same function,
> but here, we call the required mutex_lock(&orig->device_list_mutex);
> just three lines above in the same function.
>
> Where do we need the lockdep_assert_held()?
You are right I missed that. In that case I'd say just remove the
comment it should be obvious what's happening.
>
> -Anand
>
>>> list_for_each_entry(orig_dev, &orig->devices, dev_list) {
>>> struct rcu_string *name;
>>>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 0/5] Misc props.c cleanups
2019-02-08 7:15 ` [PATCH 0/5] Misc props.c cleanups Nikolay Borisov
@ 2019-02-08 7:31 ` Anand Jain
0 siblings, 0 replies; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:31 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 2/8/19 3:15 PM, Nikolay Borisov wrote:
>
>
> On 8.02.19 г. 9:02 ч., Anand Jain wrote:
>> While adding the readmirror property found few cleanup things which
>> can be fixed. As these aren't part of upcoming readmirror property
>> I am sending these separately. Except for 1/5 rest fixes are in
>> props.c. 1/5 is in volume.c.
>>
>> Anand Jain (5):
>> btrfs: fix comment its device list mutex not volume lock
>> btrfs: kill __btrfs_set_prop()
>> btrfs: reorg functions to drop forward declaration
>> btrfs: drop redundant forward declaration in props.c
>> btrfs: trivial, fix c coding style
>>
>> fs/btrfs/ioctl.c | 10 +--
>> fs/btrfs/props.c | 201 ++++++++++++++++++++++++-----------------------------
>> fs/btrfs/props.h | 6 +-
>> fs/btrfs/volumes.c | 2 +-
>> fs/btrfs/xattr.c | 2 +-
>> 5 files changed, 100 insertions(+), 121 deletions(-)
>>
>
> Allow me to suggest to introduce another patch with the following hunk:
>
> diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
> index ea78c3d6dcfc..37e9af2a9f8c 100644
> --- a/fs/btrfs/xattr.c
> +++ b/fs/btrfs/xattr.c
> @@ -229,12 +229,11 @@ int btrfs_setxattr(struct btrfs_trans_handle *trans,
> if (btrfs_root_readonly(root))
> return -EROFS;
>
> - if (trans)
> - return do_setxattr(trans, inode, name, value, size, flags);
> -
> - trans = btrfs_start_transaction(root, 2);
> - if (IS_ERR(trans))
> - return PTR_ERR(trans);
> + if (!trans) {
> + trans = btrfs_start_transaction(root, 2);
> + if (IS_ERR(trans))
> + return PTR_ERR(trans);
> + }
>
> ret = do_setxattr(trans, inode, name, value, size, flags);
> if (ret)
>
>
> This just inverts the logic for !trans and makes the code a bit more
> linear and (IMO) easier to follow.
>
Thanks for the comments.
But we still have to break the linear flow for the case of
trans != NULL. Where we don't do the
inode_inc_iversion(inode);
and the rest part.
-Anand
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/5] btrfs: fix comment its device list mutex not volume lock
2019-02-08 7:19 ` Nikolay Borisov
@ 2019-02-08 7:39 ` Anand Jain
2019-02-11 18:41 ` David Sterba
0 siblings, 1 reply; 17+ messages in thread
From: Anand Jain @ 2019-02-08 7:39 UTC (permalink / raw)
To: linux-btrfs
We have killed volume mutex (commit: dccdb07bc996
btrfs: kill btrfs_fs_info::volume_mutex). This a trival one seems to have
escaped.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
v2: Delete the wrong comment instead of fixing it.
fs/btrfs/volumes.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index fe122e6099ae..03f223aa7194 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1129,7 +1129,6 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
mutex_lock(&orig->device_list_mutex);
fs_devices->total_devices = orig->total_devices;
- /* We have held the volume lock, it is safe to get the devices. */
list_for_each_entry(orig_dev, &orig->devices, dev_list) {
struct rcu_string *name;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/5] btrfs: fix comment its device list mutex not volume lock
2019-02-08 7:39 ` [PATCH v2 " Anand Jain
@ 2019-02-11 18:41 ` David Sterba
0 siblings, 0 replies; 17+ messages in thread
From: David Sterba @ 2019-02-11 18:41 UTC (permalink / raw)
To: Anand Jain; +Cc: linux-btrfs
On Fri, Feb 08, 2019 at 03:39:37PM +0800, Anand Jain wrote:
> We have killed volume mutex (commit: dccdb07bc996
> btrfs: kill btrfs_fs_info::volume_mutex). This a trival one seems to have
> escaped.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> v2: Delete the wrong comment instead of fixing it.
This patch has been added to misc-next, thanks.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/5] btrfs: reorg functions to drop forward declaration
2019-02-08 7:10 ` Nikolay Borisov
@ 2019-02-11 18:43 ` David Sterba
0 siblings, 0 replies; 17+ messages in thread
From: David Sterba @ 2019-02-11 18:43 UTC (permalink / raw)
To: Nikolay Borisov; +Cc: Anand Jain, linux-btrfs
On Fri, Feb 08, 2019 at 09:10:41AM +0200, Nikolay Borisov wrote:
>
>
> On 8.02.19 г. 9:02 ч., Anand Jain wrote:
> > In preparation to drop forward declaration of the functions,
> > prop_compression_validate(), prop_compression_apply() and
> > prop_compression_extract(). Move prop_handlers[], btrfs_props_init()
> > prop_compression_validate(), prop_compression_apply() and
> > prop_compression_extract() appropriately with in the file. No functional
> > changes.
> >
> > Signed-off-by: Anand Jain <anand.jain@oracle.com>
>
> I'm fine with this, however I think this and the next patch could really
> be squashed into one, but let's see what David prefers.
I agree, moving the functions in order remove the prototypes in one
patch is fine.
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2019-02-11 18:44 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-08 7:02 [PATCH 0/5] Misc props.c cleanups Anand Jain
2019-02-08 7:02 ` [PATCH 1/5] btrfs: fix comment its device list mutex not volume lock Anand Jain
2019-02-08 7:07 ` Nikolay Borisov
2019-02-08 7:16 ` Anand Jain
2019-02-08 7:19 ` Nikolay Borisov
2019-02-08 7:39 ` [PATCH v2 " Anand Jain
2019-02-11 18:41 ` David Sterba
2019-02-08 7:02 ` [PATCH 2/5] btrfs: kill __btrfs_set_prop() Anand Jain
2019-02-08 7:02 ` [PATCH 3/5] btrfs: reorg functions to drop forward declaration Anand Jain
2019-02-08 7:10 ` Nikolay Borisov
2019-02-11 18:43 ` David Sterba
2019-02-08 7:02 ` [PATCH 4/5] btrfs: drop redundant forward declaration in props.c Anand Jain
2019-02-08 7:09 ` Nikolay Borisov
2019-02-08 7:02 ` [PATCH 5/5] btrfs: trivial, fix c coding style Anand Jain
2019-02-08 7:09 ` Nikolay Borisov
2019-02-08 7:15 ` [PATCH 0/5] Misc props.c cleanups Nikolay Borisov
2019-02-08 7:31 ` Anand Jain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).