Lennart Poettering [Tue, 9 Dec 2014 23:27:26 +0000 (00:27 +0100)]
NEWS: prepare NEWS for new release
Lennart Poettering [Tue, 9 Dec 2014 23:26:16 +0000 (00:26 +0100)]
nspawn: create the macvlan MAC addresses in an arch independent stable way
Michal Schmidt [Tue, 9 Dec 2014 19:27:26 +0000 (20:27 +0100)]
journal: optimize iteration: skip files that cannot improve current candidate entry
Suppose that while iterating we have already looked into a journal file
and got a candidate for the next entry. And we are considering to look
into another journal file because it may contain an entry that is nearer
to the current location than the candidate.
We should skip the whole journal file if we can tell by looking at its
header that none of its entries can precede the candidate.
Before:
$ time ./journalctl --since=2014-06-01 --until=2014-07-01 > /dev/null
real 0m20.518s
user 0m19.989s
sys 0m0.328s
After:
$ time ./journalctl --since=2014-06-01 --until=2014-07-01 > /dev/null
real 0m9.445s
user 0m9.228s
sys 0m0.213s
Michal Schmidt [Tue, 9 Dec 2014 19:27:19 +0000 (20:27 +0100)]
journal: optimize iteration: skip whole files behind current location
Interleaving of entries from many journal files is expensive. But there
is room for optimization.
We can skip looking into journal files whose entries all lie before the
current iterating location. We can tell if that's the case from looking
at the journal file header. This saves a huge amount of work if one has
many of mostly not interleaved journal files.
On my workstation with 90 journal files in /var/log/journal/ID/
totalling 3.4 GB I get these results:
Before:
$ time ./journalctl --since=2014-06-01 --until=2014-07-01 > /dev/null
real 5m54.258s
user 2m4.263s
sys 3m48.965s
After:
$ time ./journalctl --since=2014-06-01 --until=2014-07-01 > /dev/null
real 0m20.518s
user 0m19.989s
sys 0m0.328s
The high "sys" time in the original was caused by putting more stress on
the mmap-cache than it could handle. With the patch the working set
now consists of fewer mmap windows and mmap-cache is not thrashing.
Thomas Hindoe Paaboel Andersen [Tue, 9 Dec 2014 19:50:37 +0000 (20:50 +0100)]
networkd: remove unused variable
It is no longer used after
45af44d47da6933b260c734ad9ff721f63f80a4d
WaLyong Cho [Tue, 9 Dec 2014 12:46:30 +0000 (21:46 +0900)]
unit: update unit dropin paths and time when dropin file is written.
If a unit is set property by "systemctl set-property", a new dropin
file is generated. But the unit's dropin_paths and dropin_mtime are
not updated. So the unit is shown as need daemon reload.
Update unit dropin_paths and dropin_mtime also when dropin file is
written.
Przemyslaw Kedzierski [Tue, 9 Dec 2014 11:17:24 +0000 (12:17 +0100)]
bus-proxy: cloning smack label
When dbus client connects to systemd-bus-proxyd through
Unix domain socket proxy takes client's smack label and sets for itself.
It is done before and independent of dropping privileges.
The reason of such soluton is fact that tests of access rights
performed by lsm may take place inside kernel, not only
in userspace of recipient of message.
The bus-proxyd needs CAP_MAC_ADMIN to manipulate its label.
In case of systemd running in system mode, CAP_MAC_ADMIN
should be added to CapabilityBoundingSet in service file of bus-proxyd.
In case of systemd running in user mode ('systemd --user')
it can be achieved by addition
Capabilities=cap_mac_admin=i and SecureBits=keep-caps
to user@.service file
and setting cap_mac_admin+ei on bus-proxyd binary.
WaLyong Cho [Tue, 9 Dec 2014 07:07:16 +0000 (16:07 +0900)]
run: introduce timer support option
Support timer options --on-active=, --on-boot=, --on-startup=,
--on-unit-active=, --on-unit-inactive=, --on-calendar=. Each options
corresponding with OnActiveSec=, OnBootSec=, OnStartupSec=,
OnUnitActiveSec=, OnUnitInactiveSec=, OnCalendar= of timer
respectively. And OnCalendar= and WakeSystem= supported by
--timer-property= option like --property= of systemd-run.
And if --unit= option and timer options are specified the command can
be omitted. In this case, systemd-run assumes the target service is
already loaded. And just try to generate transient timer unit only.
Lennart Poettering [Tue, 9 Dec 2014 17:17:35 +0000 (18:17 +0100)]
update TODO
Lennart Poettering [Tue, 9 Dec 2014 17:16:54 +0000 (18:16 +0100)]
sd-bus: get rid of PID starttime concept
As kdbus no longer exports this, remove all traces from sd-bus too
Lennart Poettering [Tue, 9 Dec 2014 17:07:46 +0000 (18:07 +0100)]
sd-bus: properly support passing memfds around with offset/size parameters
David Herrmann [Tue, 9 Dec 2014 10:12:41 +0000 (11:12 +0100)]
bus: sync with kdbus-git (ABI break)
kdbus-git gained two new features:
* memfd offsets: This allows to specify a 'start' offset in kdbus_memfd
so you can send partial memfd hunks instead of always
the full memfd
* KDBUS_HELLO_UNPRIVILEGED: If passed during HELLO, the client will be
treated as unprivileged.
Dan Winship [Tue, 18 Nov 2014 13:59:42 +0000 (08:59 -0500)]
libsystemd-network: fix writing of routes in dhcp lease file
inet_ntoa() uses a static buffer, so you can't call it twice in the
same fprintf() call.
Lennart Poettering [Tue, 9 Dec 2014 02:58:20 +0000 (03:58 +0100)]
sleep: drop redundant MESSAGE= prefix
Lennart Poettering [Tue, 9 Dec 2014 02:58:10 +0000 (03:58 +0100)]
update TODO
Wesley Dawson [Mon, 1 Dec 2014 07:27:00 +0000 (23:27 -0800)]
journalctl: respect --after-cursor semantics with --follow in all cases
In the case where no entries have been added to the journal after the specified
cursor, set need_seek before the main loop to prevent display of the entry at
said cursor.
Lennart Poettering [Tue, 9 Dec 2014 01:31:42 +0000 (02:31 +0100)]
core: rename unit_destroy_cgroup() to unit_destroy_cgroup_if_empty() since it's not quite as destructive as it sounds nowadays
Ross Lagerwall [Sat, 29 Nov 2014 15:27:14 +0000 (15:27 +0000)]
cgroup: Handle error when destroying cgroup
If a cgroup fails to be destroyed (most likely because there are still
processes running as part of a service after the main pid exits), don't
free and remove the cgroup unit from the manager. This fixes a
regression introduced by the cgroup rework in v205 where systemd would
forget about processes still running after the unit becomes inactive.
(This can happen when the main pid exits and KillMode=process or none).
Michael Marineau [Mon, 8 Dec 2014 19:05:31 +0000 (11:05 -0800)]
fstab-generator: Allow mount.usr without mount.usrflags, honor rw/ro
There is no need to require mount.usrflags. The original implementation
assumed that a btrfs subvolume would always be needed but that is not
applicable to systems that do not use btrfs for /usr.
Similar to using rootflags= for the default of mount.usrflags=, append
the classic 'ro' and 'rw' flags to the mount options.
Lennart Poettering [Tue, 9 Dec 2014 01:22:44 +0000 (02:22 +0100)]
fstab-generator: free all allocated strings
Lennart Poettering [Tue, 9 Dec 2014 01:12:11 +0000 (02:12 +0100)]
units: make sure container-getty@.service stops restarting when the pts device it is bound to is gone
We only want to restart the getty as long as the pts device is still
around. As soon as it is gone, the service should be removed to.
http://lists.freedesktop.org/archives/systemd-devel/2014-December/026048.html
Lennart Poettering [Tue, 9 Dec 2014 01:05:19 +0000 (02:05 +0100)]
update TODO
Lennart Poettering [Tue, 9 Dec 2014 00:20:09 +0000 (01:20 +0100)]
nspawn: make sure macvlan MAC addresses are stable
https://bugs.freedesktop.org/show_bug.cgi?id=85527
Lennart Poettering [Tue, 9 Dec 2014 00:09:21 +0000 (01:09 +0100)]
sd-rtnl: fix size check in sd_rtnl_message_append_string()
Lennart Poettering [Mon, 8 Dec 2014 23:08:31 +0000 (00:08 +0100)]
update TODO
Lennart Poettering [Mon, 8 Dec 2014 23:01:36 +0000 (00:01 +0100)]
sd-bus: catch up with current kdbus, don't do matches on kdbus monitor connections
Lennart Poettering [Mon, 8 Dec 2014 22:52:08 +0000 (23:52 +0100)]
update TODO
Lennart Poettering [Mon, 8 Dec 2014 22:47:19 +0000 (23:47 +0100)]
bus-proxy: fix compat with autostarted services
Zbigniew Jędrzejewski-Szmek [Mon, 8 Dec 2014 22:24:34 +0000 (17:24 -0500)]
load-fragment: remove wrong ifdef guard
config_parse_warn_compat is now always used for removed options.
https://bugs.freedesktop.org/show_bug.cgi?id=87125
Tom Gundersen [Mon, 8 Dec 2014 18:54:06 +0000 (19:54 +0100)]
networkd: manager - enumerate addresses globally, rather than per-link
The kernel always returns all addresses, rather than only for the given link, so let's only enumerate once.
Olivier Brunel [Fri, 5 Dec 2014 15:06:45 +0000 (16:06 +0100)]
journal: Fix navigating backwards missing entries
With DIRECTION_UP (i.e. navigating backwards) in generic_array_bisect() when the
needle was found as the last item in the array, it wasn't actually processed as
match, resulting in entries being missed.
https://bugs.freedesktop.org/show_bug.cgi?id=86855
Tom Gundersen [Mon, 8 Dec 2014 17:36:49 +0000 (18:36 +0100)]
networkd: link - typo
Tom Gundersen [Mon, 8 Dec 2014 17:36:16 +0000 (18:36 +0100)]
sd-rtnl: fix bogus warning about dropping 20 bytes from multi-part messages
Nothing was being dropped, we just failed to account for the NLMSG_DONE.
Tom Gundersen [Mon, 8 Dec 2014 12:58:48 +0000 (13:58 +0100)]
networkd: route - ignore unknown address family
Tom Gundersen [Sun, 7 Dec 2014 12:00:01 +0000 (13:00 +0100)]
udev: link-config - simplify net-match
Dave Reisner [Sat, 6 Dec 2014 18:34:27 +0000 (13:34 -0500)]
Check return value from reading name_assign_type attr
This file won't exist on kernels earlier than 3.17.
Mantas Mikulėnas [Mon, 8 Dec 2014 11:53:30 +0000 (13:53 +0200)]
networkd: update manpage for optional Gateway=
Following commit
59580681f5f.
WaLyong Cho [Mon, 8 Dec 2014 15:03:53 +0000 (00:03 +0900)]
timer: timer can be a transient unit
WaLyong Cho [Mon, 8 Dec 2014 15:03:52 +0000 (00:03 +0900)]
bus: StartTransientUnit can have aux unit
Lennart Poettering [Sat, 6 Dec 2014 01:41:03 +0000 (02:41 +0100)]
update TODO
Lennart Poettering [Sat, 6 Dec 2014 01:39:15 +0000 (02:39 +0100)]
sd-bus: rework ELF error mapping table magic
The ELF magic cannot work for consumers of our shard library, since they
are in a different module. Hence make all the ELF magic private, and
instead introduce a public function to register additional static
mapping table.
Thomas Hindoe Paaboel Andersen [Sat, 6 Dec 2014 08:43:31 +0000 (09:43 +0100)]
remove duplicated includes
Tom Gundersen [Fri, 5 Dec 2014 14:56:10 +0000 (15:56 +0100)]
net_setup/networkd: warn if matching is done on possibly unstable ifname
Lennart Poettering [Fri, 5 Dec 2014 13:09:33 +0000 (14:09 +0100)]
update TODO
Felipe Sateler [Fri, 5 Dec 2014 13:08:38 +0000 (14:08 +0100)]
man: fix reference to obsolete command "systemctl dump"
https://bugs.freedesktop.org/show_bug.cgi?id=87020
Daniel Mack [Fri, 5 Dec 2014 09:03:00 +0000 (10:03 +0100)]
sd-bus: follow kdbus changes (ABI break)
Implement a recent change in the kdbus pool logic:
PAYLOAD_VEC_OFF items are now referencing offsets relative to the
connection's pool, not to the item itself. Follow this change in
sd-bus.
Jan Janssen [Tue, 2 Dec 2014 17:49:30 +0000 (18:49 +0100)]
cryptsetup-generator: Add support for naming luks devices on kernel cmdline
Jan Janssen [Tue, 2 Dec 2014 17:49:29 +0000 (18:49 +0100)]
cryptsetup-generator: Add support for UUID-specific key files on kernel command line
Jan Janssen [Tue, 2 Dec 2014 17:49:28 +0000 (18:49 +0100)]
cryptsetup-generator: Split main() into more functions and use hasmaps
Lennart Poettering [Thu, 4 Dec 2014 23:47:38 +0000 (00:47 +0100)]
man: there's actually no "fail" fstab option, but only "nofail"
Tom Gundersen [Thu, 4 Dec 2014 20:57:13 +0000 (21:57 +0100)]
networkd: add basic [Link] settings to .network files
This allows the default link settings (set in .link files) to be overridden per Network. Only MTU and MACAddress is supported for now.
WaLyong Cho [Thu, 4 Dec 2014 03:46:06 +0000 (12:46 +0900)]
gitignore: ignore generated systemd-bootchart.service
Lennart Poettering [Thu, 4 Dec 2014 19:30:46 +0000 (20:30 +0100)]
sd-bus: add extra assert check
Maciej Wereski [Thu, 4 Dec 2014 09:32:10 +0000 (10:32 +0100)]
tmpfiles, man: Add xattr support to tmpfiles
This patch makes it possible to set extended attributes on files created
by tmpfiles. This can be especially used to set SMACK security labels on
volatile files and directories.
It is done by adding new line of type "t". Such line should contain
attributes in Argument field, using following format:
name=value
All other fields are ignored.
If value contains spaces, then it must be surrounded by quotation marks.
User can also put quotation mark in value by escaping it with backslash.
Example:
D /var/run/cups - - - -
t /var/run/cups - - - - security.SMACK64=printing
Colin Walters [Thu, 4 Dec 2014 18:12:40 +0000 (13:12 -0500)]
missing: define NET_NAME_UNKNOWN
It's only exposed to userspace since
commit
685343fc3ba61a1f6eef361b786601123db16c28
Author: Tom Gundersen <teg@jklm.no>
AuthorDate: Mon Jul 14 16:37:22 2014 +0200
Commit: David S. Miller <davem@davemloft.net>
CommitDate: Tue Jul 15 16:12:01 2014 -0700
to the kernel.
Tom Gundersen [Thu, 4 Dec 2014 17:12:55 +0000 (18:12 +0100)]
udev: net_setup - allow matching on OriginalName=
This has been requested repeatedly, so let's give it a go. We explicitly do not allow matching
on names that have already been changed (from a previous udev run, or otherwise), and matching
on unpredictable names (ethX) is discouraged (but not currently disallowed).
We also currently allow:
[Match]
Name=veth0
[Link]
Name=my-name0
SomeOtherSetting=true
Which means that the link file will be applied the first time it is invoked, but
not on subsequent invocations, which may be surprising.
David Herrmann [Thu, 4 Dec 2014 15:45:00 +0000 (16:45 +0100)]
missing: apparently, there's a world beyond x86..
..so make them cry and print a warning if __NR_memfd_create is not
defined. This should make syscall() fail with -ENOSYS, thus trigger a
suitable runtime error-path.
Tom Gundersen [Thu, 4 Dec 2014 15:36:28 +0000 (16:36 +0100)]
sd-rtnl: fix compile
No idea how this appeared to compile for me. Mea culpa.
Lennart Poettering [Thu, 4 Dec 2014 15:17:26 +0000 (16:17 +0100)]
update TODO
Lennart Poettering [Thu, 4 Dec 2014 15:17:18 +0000 (16:17 +0100)]
smack-util: remove warning when building without SMACK support
Tom Gundersen [Thu, 4 Dec 2014 15:14:06 +0000 (16:14 +0100)]
sd-rtnl: rename sd_rtnl_message_route_get_{dst,src}_len to *_prefixlen
This makes the API more consistent.
Marcel Holtmann [Thu, 4 Dec 2014 15:07:49 +0000 (16:07 +0100)]
hwdb: Update database of Bluetooth company identifiers
Tom Gundersen [Thu, 4 Dec 2014 14:55:46 +0000 (15:55 +0100)]
networkd: tunnel - allow INADDR_ANY as the local address
Tom Gundersen [Thu, 4 Dec 2014 14:52:21 +0000 (15:52 +0100)]
networkd: add support for source routing
Maurizio Lombardi [Mon, 22 Sep 2014 09:48:57 +0000 (11:48 +0200)]
udevd: SAS: use SAS addr + PHY id in by-path whenever possible.
This patch changes the naming scheme for sas disks. The original names used
disk's sas address and lun, the new scheme uses sas address of the
nearest expander (if available) and a phy id of the used connection.
If no expander is used, the phy id of hba phy is used.
Note that names that refer to RAID or other abstract devices are
unchanged.
Name in raid configuration:
hba_pci_address-sas-raid_sas_address-lunY-partZ
Name in expander bare disk configuration:
hba_pci_address-sas-expander_sas_address-phyX-lunY-partZ
Name format without expanders:
hba_pci_address-sas-phyX-lunY-partZ
Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Tom Gundersen [Thu, 4 Dec 2014 11:19:57 +0000 (12:19 +0100)]
networkd: fix compile
Rebase failure on my side.
Tom Gundersen [Thu, 4 Dec 2014 11:19:27 +0000 (12:19 +0100)]
networkctl: use the shared functions for enumerating the local gateways
Susant Sahani [Sat, 15 Nov 2014 03:17:16 +0000 (08:47 +0530)]
networkd: Add bridge port path cost
This patch add support to specify path cost of the
bridge port to be configured via conf file.
Exampe: conf
file: br.netdev
[NetDev]
Name=br-test
Kind=bridge
file: br.network
[Match]
Name=em1
[Network]
Bridge=br-test
[BridgePort]
Cost=332
bridge link
2: em1 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master
br-test state disabled priority 32 cost 332
Susant Sahani [Sat, 15 Nov 2014 02:54:59 +0000 (08:24 +0530)]
networkd: support vxlan parameters
V3: fix copy paste error
V4: Make manual and config more readable
Add vxlan paramertes to config.
Lennart Poettering [Thu, 4 Dec 2014 03:17:09 +0000 (04:17 +0100)]
update TODO
Lennart Poettering [Thu, 4 Dec 2014 03:16:29 +0000 (04:16 +0100)]
rtnl: order local addresses/gateways by the address itself as last resort
This way we can be sure that the returned list is stable regarding
modifications in the kernel.
Michal Sekletar [Wed, 12 Nov 2014 12:53:27 +0000 (13:53 +0100)]
selinux: figure out selinux context applied on exec() before closing all fds
We need original socket_fd around otherwise mac_selinux_get_child_mls_label
fails with -EINVAL return code. Also don't call setexeccon twice but rather pass
context value of SELinuxContext option as an extra argument.
Michal Sekletar [Wed, 12 Nov 2014 14:19:42 +0000 (15:19 +0100)]
units: skip mounting /dev/hugepages if we don't have CAP_SYS_ADMIN
Preparation for allowing systemd to run gracefully in containers lacking
CAP_SYS_ADMIN.
Lennart Poettering [Thu, 4 Dec 2014 01:36:04 +0000 (02:36 +0100)]
utf8: minor simplifications
Lennart Poettering [Thu, 4 Dec 2014 01:27:14 +0000 (02:27 +0100)]
utf8: when escaping unprintable unichars, escape the whole unichar, not just the first byte of it
WaLyong Cho [Wed, 12 Nov 2014 10:49:32 +0000 (19:49 +0900)]
bootchart: escape non printable process name
WaLyong Cho [Wed, 12 Nov 2014 10:49:31 +0000 (19:49 +0900)]
utf8: intruduce utf8_escape_non_printable
WaLyong Cho [Sat, 15 Nov 2014 06:42:11 +0000 (15:42 +0900)]
bootchart: add standalone bootchart service
Lennart Poettering [Thu, 4 Dec 2014 00:41:12 +0000 (01:41 +0100)]
rtnl: when querying local addresses and gateways, take address family into account
Thomas Hindoe Paaboel Andersen [Wed, 3 Dec 2014 23:23:27 +0000 (00:23 +0100)]
sd-bus: avoid a null dereference
Thomas Hindoe Paaboel Andersen [Wed, 3 Dec 2014 23:14:37 +0000 (00:14 +0100)]
systemctl: fix a leak
Thomas Hindoe Paaboel Andersen [Wed, 3 Dec 2014 23:05:20 +0000 (00:05 +0100)]
test-path-util: fix a leak
Michael Biebl [Sat, 29 Nov 2014 05:35:38 +0000 (06:35 +0100)]
vconsole: don't hard-code systemd-vconsole-setup binary path
Thomas Hindoe Paaboel Andersen [Wed, 3 Dec 2014 22:50:38 +0000 (23:50 +0100)]
networkctl: remove unused variable
Thomas Hindoe Paaboel Andersen [Sat, 29 Nov 2014 23:37:16 +0000 (00:37 +0100)]
util: don't shadow variable
environ is already defined in unistd.h
Lennart Poettering [Wed, 3 Dec 2014 21:23:41 +0000 (22:23 +0100)]
resolved: don't resolve the hostname "gateway" with LLMNR, leave that to nss-myhostname
Lennart Poettering [Wed, 3 Dec 2014 21:23:06 +0000 (22:23 +0100)]
rtnl: make checks for default routes more strict
Also check that the source netmask is 0, not only the destination
netmask.
Lennart Poettering [Wed, 3 Dec 2014 20:42:58 +0000 (21:42 +0100)]
nss-myhostname: always resolve the host name "gateway" to the local default gateway
This is useful inside of containers or local networks to intrdouce a
stable name of the default gateway host (in case of containers usually
the host, in case of LANs usually local router).
Torstein Husebø [Wed, 3 Dec 2014 19:59:00 +0000 (20:59 +0100)]
networkd: fix typo
V2: found another one
Tom Gundersen [Wed, 3 Dec 2014 19:00:28 +0000 (20:00 +0100)]
udevd: don't take reference for NULL rtnl object
Lennart Poettering [Wed, 3 Dec 2014 17:31:51 +0000 (18:31 +0100)]
strv: add calls to add two entries to an strv at once
Jan Synacek [Wed, 3 Dec 2014 13:56:56 +0000 (14:56 +0100)]
localed: log xkbcommon errors
The errors are prefixed with "libxkbcommon" to provide some context,
because they are quite confusing without it. With the prefix, we at
least know where they come from.
Lennart Poettering [Wed, 3 Dec 2014 16:52:51 +0000 (17:52 +0100)]
nspawn: correct EEXIST check when creating directory to mount /tmp in
https://bugs.freedesktop.org/show_bug.cgi?id=86309
David Herrmann [Wed, 3 Dec 2014 16:01:54 +0000 (17:01 +0100)]
build-sys: update man-list
Run 'make update-man-list'.
Didier Roche [Mon, 24 Nov 2014 10:14:22 +0000 (11:14 +0100)]
machine-id-commit: add man pages
Add man pages for systemd-machine-id-commit.service and
systemd-machine-id-commit.
Didier Roche [Mon, 24 Nov 2014 09:12:06 +0000 (10:12 +0100)]
machine-id-commit: add unit file
The unit file only active the machine-id-commit helper if /etc is mounted
writable and /etc/machine-id is an independant mount point (should be a tmpfs).
Didier Roche [Mon, 24 Nov 2014 08:54:18 +0000 (09:54 +0100)]
machine-id-commit: Introduce machine-id-commit binary
This binary enables to commit transient machine-id on disk if it becomes
writable.
Didier Roche [Mon, 24 Nov 2014 08:43:29 +0000 (09:43 +0100)]
machine-id-setup: add a machine_id_commit call to commit on disk a transient machine-id
If /etc was read only at boot time with an empty /etc/machine-id, the latter
will be mounted as a tmpfs and get reset at each boot. If the system becomes rw
later, this functionality enables to commit in a race-free manner the
transient machine-id to disk.
Lennart Poettering [Wed, 3 Dec 2014 02:13:34 +0000 (03:13 +0100)]
machine-id-setup: casting const away is ugly, let's not do it if there's no reason to
Lennart Poettering [Wed, 3 Dec 2014 02:13:14 +0000 (03:13 +0100)]
update TODO