Signed-off-by: Nikolay Borisov
---
fs/btrfs/btrfs_inode.h | 8
fs/btrfs/compression.c | 2 +-
fs/btrfs/inode.c | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index 36eca5464e1b..c10d21b2f0df
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent_io.c | 10 +-
fs/btrfs/extent_io.h | 4 ++--
fs/btrfs/scrub.c | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 0e73e48a9c4c..a405f63f7053
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent_io.c | 20 ++--
fs/btrfs/extent_io.h | 2 +-
fs/btrfs/inode.c | 4 ++--
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index
Signed-off-by: Nikolay Borisov
---
fs/btrfs/tree-log.c | 26 +-
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 610fe04805b6..cc616d424b7a 100644
--- a/fs/btrfs/tree-log.c
+++
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent_io.c | 14 +++---
fs/btrfs/extent_io.h | 4 +++-
fs/btrfs/inode.c | 6 +++---
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/file-item.c | 9 -
fs/btrfs/inode.c | 2 +-
fs/btrfs/ioctl.c | 2 +-
4 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/file.c | 30 ++
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 53fedf3dcaef..e37b643205e1 100644
Signed-off-by: Nikolay Borisov
---
fs/btrfs/inode.c | 16
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index f438257be5a0..c8796391eed3 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5977,15
On Fri, Feb 17, 2017 at 12:37 AM, Qu Wenruo wrote:
>
>
> At 02/16/2017 06:03 PM, Filipe Manana wrote:
>>
>> On Thu, Feb 16, 2017 at 12:39 AM, Qu Wenruo
>> wrote:
>>>
>>>
>>>
>>> At 02/15/2017 11:59 PM, Filipe Manana wrote:
On Wed,
I've noticed that some of the parameters passed to compress_pages are redundant
and that we can either reuse a parameter for both input and output value
(number of pages) or we can infer some value from the existing parameters (the
maximum output limit).
There's no functional change, the stack
The length parameter is basically duplicated for input and output in the
top level caller of the compress_pages chain. We can simply use one
variable for that and reduce stack consumption. The compression
implementation will sink the parameter to a local variable so everything
works as before.
The parameter saying how many pages can be allocated at maximum can be
merged with the output page counter, to save some stack space. The
compression implementation will sink the parameter to a local variable
so everything works as before.
The nr_pages variables can also be simply merged in
Move the buffer limit definitions out of compress_file_range.
Signed-off-by: David Sterba
---
fs/btrfs/compression.h | 15 +++
fs/btrfs/inode.c | 10 --
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/fs/btrfs/compression.h
Signed-off-by: David Sterba
---
fs/btrfs/inode.c | 11 ++-
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index bc547608ff1a..9533a516bace 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -432,8 +432,6 @@ static
The value of max_out can be calculated from the parameters passed to the
compressors, which is number of pages and the page size, and we don't
have to needlessly pass it around.
Signed-off-by: David Sterba
---
fs/btrfs/compression.c | 6 ++
fs/btrfs/compression.h | 6
From: Filipe Manana
If we want to append an item to a leaf we were trying to move off from the
leaf into its neighbors an amount of space corresponding to the item's
size. That amount of space is too much and can be reduced to the item's
size minus the amount of free space in
On Feb 11, 2017, at 12:34 PM, Kenneth Bogert wrote:
>
> Hello all,
>
> I have been running a Rockstor 3.8.16-8 on an older Dell Optiplex for about a
> month. The system has four drives separated into two Raid1 filesystems
> (“pools” in Rockstor terminology). A few days ago
On Fri, Feb 17, 2017 at 07:16:04PM +, fdman...@kernel.org wrote:
> From: Filipe Manana
>
> If we want to append an item to a leaf we were trying to move off from the
> leaf into its neighbors an amount of space corresponding to the item's
> size. That amount of space is
Since DISCARD is not as important as an operation like write, we don't
copy it to target device during replace, and it makes __btrfs_map_block
less complex.
Signed-off-by: Liu Bo
---
fs/btrfs/volumes.c | 306 +
1 file
This adds a helper to show directly whether ops require full stripe.
Signed-off-by: Liu Bo
---
fs/btrfs/volumes.c | 18 ++
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index bcd44eb..4a334a9 100644
As the part of getting extra mirror in __btrfs_map_block is
self-independent, this puts it into a separate function.
Signed-off-by: Liu Bo
---
fs/btrfs/volumes.c | 161 +
1 file changed, 89 insertions(+), 72 deletions(-)
We have similar code here and there, this merges them into a helper.
Signed-off-by: Liu Bo
---
fs/btrfs/extent_io.c | 3 +-
fs/btrfs/volumes.c | 163 +--
fs/btrfs/volumes.h | 2 +-
3 files changed, 57 insertions(+),
Since this part is mostly self-independent, this moves it to a separate
function.
Signed-off-by: Liu Bo
---
fs/btrfs/volumes.c | 179 +
1 file changed, 98 insertions(+), 81 deletions(-)
diff --git a/fs/btrfs/volumes.c
These two BUG_ON()s would never be true, ensured by callers' logic.
Signed-off-by: Liu Bo
---
fs/btrfs/volumes.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 4a334a9..ce74b6c 100644
---
This is attempting to make __btrfs_map_block less scary :)
The major changes are
1) split operations for discard out of __btrfs_map_block and we don't copy
discard operations for the target device of dev replace since they're not
as important as writes.
2) put dev replace stuff into helpers
With this, we can avoid allocating memory for dev replace copies if the
target dev is not available.
Signed-off-by: Liu Bo
---
fs/btrfs/volumes.c | 7 ---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index
Hi,
With RAID5, using 3 loop-back devices each has 4GB. On a fresh setup, created a
2mb file.
While checking no.of extents,it shows like:
# ./btrfs-debugfs -f /mnt/file2m.txt
(257 0): ram 110592 disk 145227776 disk_size 114688
(257 110592): ram 4096 disk 145461248 disk_size 4096
(257 114688):
16.02.2017 23:47, Austin S. Hemmelgarn пишет:
> On 2017-02-16 15:36, Chris Murphy wrote:
>> Hi,
>>
>> This man page contains a list for pretty much every other file system,
>> with a oneliner description: ext4, XFS is in there, and even NTFS, but
>> not Btrfs.
>>
>> Also, /etc/filesystems doesn't
Hi,
is there any chance to optimize btrfs_find_space_for_alloc / rb_next on
big devices?
I've plenty of free space but most of the time there's only low I/O but
high cpu usage. perf top shows:
60,41% [kernel] [k] rb_next
9,74% [kernel] [k]
Hello David,
Here is another round of inode vs btrfs_inode cleanups. This time
the size of the module is slightly increased:
textdata bss dec hex filename
934690 50443 18568 1003701 f50b5 fs/btrfs/btrfs.ko-patched
textdata bss dec hex filename
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/dir-item.c| 6 +++---
fs/btrfs/inode.c | 2 +-
fs/btrfs/ioctl.c | 2 +-
fs/btrfs/transaction.c | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/fs/btrfs/ctree.h
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/file.c | 22 +++---
fs/btrfs/inode.c | 8
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/fs/btrfs/ctree.h
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/extent-tree.c | 10 +-
fs/btrfs/inode.c | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/fs/btrfs/ctree.h
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent-tree.c | 27 ---
1 file changed, 12 insertions(+), 15 deletions(-)
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index
Signed-off-by: Nikolay Borisov
---
fs/btrfs/tree-log.c | 10 +-
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 3cc972330ab3..a92a73139065 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@
Signed-off-by: Nikolay Borisov
---
fs/btrfs/inode.c | 22 +++---
fs/btrfs/ioctl.c | 2 +-
fs/btrfs/transaction.c | 2 +-
3 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index
Signed-off-by: Nikolay Borisov
---
fs/btrfs/btrfs_inode.h | 8
fs/btrfs/ctree.h | 2 +-
fs/btrfs/extent-tree.c | 4 ++--
fs/btrfs/file-item.c | 2 +-
fs/btrfs/inode.c | 22 +++---
5 files changed, 19 insertions(+), 19 deletions(-)
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ioctl.c | 23 ++-
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index f907853e1c47..cdbf30e5743b 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@
Signed-off-by: Nikolay Borisov
---
fs/btrfs/tree-log.c | 45 +
1 file changed, 21 insertions(+), 24 deletions(-)
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index cc616d424b7a..f36e4c49bc0e 100644
---
Signed-off-by: Nikolay Borisov
---
fs/btrfs/scrub.c | 10 +-
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index bdf58b0eaef8..9a747ed9116d 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -4236,7 +4236,7 @@
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent_io.c | 2 +-
fs/btrfs/extent_io.h | 3 ++-
fs/btrfs/inode.c | 37 ++---
3 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index
In addition to changing the signature, this patch also switches
all the functions which are used as an argument to also take btrfs_inode.
Namely those are: btrfs_get_extent and btrfs_get_extent_filemap.
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 4 ++--
Signed-off-by: Nikolay Borisov
---
fs/btrfs/inode.c | 12 ++--
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index d78ec8d78781..d83ec55f00d5 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1635,15 +1635,15
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent_io.c| 4 ++--
fs/btrfs/file.c | 4 ++--
fs/btrfs/inode.c| 10 +-
fs/btrfs/ordered-data.c | 6 +++---
fs/btrfs/ordered-data.h | 2 +-
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent_io.c | 4 ++--
fs/btrfs/extent_io.h | 2 +-
fs/btrfs/inode.c | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 16860ab7cb5e..aecc3d87255e 100644
---
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/extent-tree.c | 2 +-
fs/btrfs/inode.c | 37 ++---
fs/btrfs/relocation.c | 2 +-
4 files changed, 21 insertions(+), 22 deletions(-)
diff --git
Signed-off-by: Nikolay Borisov
---
fs/btrfs/compression.c | 10 +-
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index b8de71abfbd3..9f5e2e222e2a 100644
--- a/fs/btrfs/compression.c
+++
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/file.c | 8
fs/btrfs/inode.c | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/file.c | 20 ++--
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index c12d7308205b..8e223c78c8fe 100644
---
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/file.c | 10 +-
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 26ebb7608b92..18edcc74150c 100644
--- a/fs/btrfs/file.c
Signed-off-by: Nikolay Borisov
---
fs/btrfs/inode.c | 40
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 52387c033e3f..257f6e65fd68 100644
--- a/fs/btrfs/inode.c
+++
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/file.c | 21 ++---
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 8e223c78c8fe..2d534d6c5514 100644
---
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/file.c | 8
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 37458605847a..53fedf3dcaef 100644
--- a/fs/btrfs/file.c
+++
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/file.c | 10 +-
fs/btrfs/inode.c | 26 +-
fs/btrfs/ioctl.c | 2 +-
fs/btrfs/relocation.c | 6 +++---
5
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/extent-tree.c | 8
fs/btrfs/file.c| 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 8ab0ce65a218..76e661d00822 100644
---
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h| 2 +-
fs/btrfs/extent-tree.c | 18 +-
fs/btrfs/file.c | 4 ++--
fs/btrfs/free-space-cache.c | 2 +-
fs/btrfs/inode-map.c| 2 +-
fs/btrfs/inode.c| 6 +++---
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/extent-tree.c | 69 +-
fs/btrfs/file.c| 2 +-
fs/btrfs/relocation.c | 2 +-
4 files changed,
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/extent-tree.c | 23 +++
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index
From: Nikolay Borisov
Signed-off-by: Nikolay Borisov
---
fs/btrfs/ctree.h | 2 +-
fs/btrfs/extent-tree.c | 10 +-
fs/btrfs/inode.c | 4 ++--
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/fs/btrfs/ctree.h
Signed-off-by: Nikolay Borisov
---
fs/btrfs/btrfs_inode.h | 6 +++---
fs/btrfs/delayed-inode.c| 2 +-
fs/btrfs/free-space-cache.c | 2 +-
fs/btrfs/inode.c| 19 +--
fs/btrfs/ioctl.c| 4 ++--
fs/btrfs/transaction.c | 2
Hi Nikolay,
[auto build test ERROR on next-20170217]
[cannot apply to btrfs/next v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.10-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system]
url:
https://github.com/0day-ci/linux/commits/Nikolay-Borisov/More
The function does not modify the input buffer, also update a typecast in
one caller.
Signed-off-by: David Sterba
---
fs/btrfs/disk-io.c | 4 ++--
fs/btrfs/disk-io.h | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
Signed-off-by: David Sterba
---
fs/btrfs/dev-replace.c | 5 +++--
fs/btrfs/dev-replace.h | 5 +++--
fs/btrfs/volumes.c | 18 ++
fs/btrfs/volumes.h | 12 ++--
4 files changed, 22 insertions(+), 18 deletions(-)
diff --git
A handful of char -> const char changes spotted during other cleanups.
David Sterba (4):
btrfs: constify device path passed to relevant helpers
btrfs: constify input buffer of btrfs_csum_data
btrfs: constify buffers used by compression helpers
btrfs: constify name of
Signed-off-by: David Sterba
---
fs/btrfs/compression.c | 2 +-
fs/btrfs/compression.h | 2 +-
fs/btrfs/lzo.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 903c32c9eb22..c76312405f5c 100644
Signed-off-by: David Sterba
---
fs/btrfs/ioctl.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 717f34f977d5..8449ce435b27 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -434,7 +434,7 @@ int
Hi Nikolay,
[auto build test WARNING on next-20170217]
[cannot apply to btrfs/next v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.10-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system]
url:
https://github.com/0day-ci/linux/commits/Nikolay-Borisov/More
Hi Nikolay,
[auto build test ERROR on next-20170217]
[cannot apply to btrfs/next v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.10-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system]
url:
https://github.com/0day-ci/linux/commits/Nikolay-Borisov/More
Hi Nikolay,
[auto build test WARNING on next-20170217]
[cannot apply to btrfs/next v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.10-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system]
url:
https://github.com/0day-ci/linux/commits/Nikolay-Borisov/More
Goffredo Baroncelli posted on Wed, 15 Feb 2017 19:25:57 +0100 as
excerpted:
> (Resended because I don saw it in the mailing lists)
>
> -
> Hi,
>
> I want to highlight this bug another time.
>
> I encountered this bug, when I was looking to a problem with find. I my
> machine find took an
Am Tue, 14 Feb 2017 13:52:48 +0100
schrieb Marc Joliet :
> Hi again,
>
> so, it seems that I've solved the problem: After having to
> umount/mount the FS several times to get btrfs-cleaner to finish, I
> thought of the "failed to load free space [...], rebuilding it now"
> type
On Thu, 16 Feb 2017 13:37:53 +0200
Imran Geriskovan wrote:
> What are your experiences for btrfs regarding 4.10 and 4.11 kernels?
> I'm still on 4.8.x. I'd be happy to hear from anyone using 4.1x for
> a very typical single disk setup. Are they reasonably stable/good
Imran Geriskovan posted on Thu, 16 Feb 2017 13:42:09 +0200 as excerpted:
> Opps.. I mean 4.9/4.10 Experiences
>
> On 2/16/17, Imran Geriskovan wrote:
>> What are your experiences for btrfs regarding 4.10 and 4.11 kernels?
>> I'm still on 4.8.x. I'd be happy to hear
E V posted on Thu, 16 Feb 2017 15:13:40 -0500 as excerpted:
> I can delete a multi GB file and get several GB of unallocated space,
> however if I try and copy big files to it again the same exact thing
> happens. However, if I play with balance and deleting files and such and
> manage to get it
Hi,
here's the first batch of patches for 4.11, I'd like to get it off my table.
Apart from the few top patches, the rest has been in next. This branch does not
conflict with Filipe's pull.
Good portion of the patches are cleanups, patch-per-change, so the total count
is high. The rest are the
On 2017-02-17 03:26, Duncan wrote:
Imran Geriskovan posted on Thu, 16 Feb 2017 13:42:09 +0200 as excerpted:
Opps.. I mean 4.9/4.10 Experiences
On 2/16/17, Imran Geriskovan wrote:
What are your experiences for btrfs regarding 4.10 and 4.11 kernels?
I'm still on
76 matches
Mail list logo