License cleanup: add SPDX GPL-2.0 license identifier to files with no license
Many source files in the tree are missing licensing information, which
makes it harder for compliance tools to determine the correct license.
By default all files without license information are under the default
license of the kernel, which is GPL version 2.
Update the files which contain no license information with the 'GPL-2.0'
SPDX license identifier. The SPDX identifier is a legally binding
shorthand, which can be used instead of the full boiler plate text.
This patch is based on work done by Thomas Gleixner and Kate Stewart and
Philippe Ombredanne.
How this work was done:
Patches were generated and checked against linux-4.14-rc6 for a subset of
the use cases:
- file had no licensing information it it.
- file was a */uapi/* one with no licensing information in it,
- file was a */uapi/* one with existing licensing information,
Further patches will be generated in subsequent months to fix up cases
where non-standard license headers were used, and references to license
had to be inferred by heuristics based on keywords.
The analysis to determine which SPDX License Identifier to be applied to
a file was done in a spreadsheet of side by side results from of the
output of two independent scanners (ScanCode & Windriver) producing SPDX
tag:value files created by Philippe Ombredanne. Philippe prepared the
base worksheet, and did an initial spot review of a few 1000 files.
The 4.13 kernel was the starting point of the analysis with 60,537 files
assessed. Kate Stewart did a file by file comparison of the scanner
results in the spreadsheet to determine which SPDX license identifier(s)
to be applied to the file. She confirmed any determination that was not
immediately clear with lawyers working with the Linux Foundation.
Criteria used to select files for SPDX license identifier tagging was:
- Files considered eligible had to be source code files.
- Make and config files were included as candidates if they contained >5
lines of source
- File already had some variant of a license header in it (even if <5
lines).
All documentation files were explicitly excluded.
The following heuristics were used to determine which SPDX license
identifiers to apply.
- when both scanners couldn't find any license traces, file was
considered to have no license information in it, and the top level
COPYING file license applied.
For non */uapi/* files that summary was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 11139
and resulted in the first patch in this series.
If that file was a */uapi/* path one, it was "GPL-2.0 WITH
Linux-syscall-note" otherwise it was "GPL-2.0". Results of that was:
SPDX license identifier # files
---------------------------------------------------|-------
GPL-2.0 WITH Linux-syscall-note 930
and resulted in the second patch in this series.
- if a file had some form of licensing information in it, and was one
of the */uapi/* ones, it was denoted with the Linux-syscall-note if
any GPL family license was found in the file or had no licensing in
it (per prior point). Results summary:
SPDX license identifier # files
---------------------------------------------------|------
GPL-2.0 WITH Linux-syscall-note 270
GPL-2.0+ WITH Linux-syscall-note 169
((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) 21
((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) 17
LGPL-2.1+ WITH Linux-syscall-note 15
GPL-1.0+ WITH Linux-syscall-note 14
((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) 5
LGPL-2.0+ WITH Linux-syscall-note 4
LGPL-2.1 WITH Linux-syscall-note 3
((GPL-2.0 WITH Linux-syscall-note) OR MIT) 3
((GPL-2.0 WITH Linux-syscall-note) AND MIT) 1
and that resulted in the third patch in this series.
- when the two scanners agreed on the detected license(s), that became
the concluded license(s).
- when there was disagreement between the two scanners (one detected a
license but the other didn't, or they both detected different
licenses) a manual inspection of the file occurred.
- In most cases a manual inspection of the information in the file
resulted in a clear resolution of the license that should apply (and
which scanner probably needed to revisit its heuristics).
- When it was not immediately clear, the license identifier was
confirmed with lawyers working with the Linux Foundation.
- If there was any question as to the appropriate license identifier,
the file was flagged for further research and to be revisited later
in time.
In total, over 70 hours of logged manual review was done on the
spreadsheet to determine the SPDX license identifiers to apply to the
source files by Kate, Philippe, Thomas and, in some cases, confirmation
by lawyers working with the Linux Foundation.
Kate also obtained a third independent scan of the 4.13 code base from
FOSSology, and compared selected files where the other two scanners
disagreed against that SPDX file, to see if there was new insights. The
Windriver scanner is based on an older version of FOSSology in part, so
they are related.
Thomas did random spot checks in about 500 files from the spreadsheets
for the uapi headers and agreed with SPDX license identifier in the
files he inspected. For the non-uapi files Thomas did random spot checks
in about 15000 files.
In initial set of patches against 4.14-rc6, 3 files were found to have
copy/paste license identifier errors, and have been fixed to reflect the
correct identifier.
Additionally Philippe spent 10 hours this week doing a detailed manual
inspection and review of the 12,461 patched files from the initial patch
version early this week with:
- a full scancode scan run, collecting the matched texts, detected
license ids and scores
- reviewing anything where there was a license detected (about 500+
files) to ensure that the applied SPDX license was correct
- reviewing anything where there was no detection but the patch license
was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied
SPDX license was correct
This produced a worksheet with 20 files needing minor correction. This
worksheet was then exported into 3 different .csv files for the
different types of files to be modified.
These .csv files were then reviewed by Greg. Thomas wrote a script to
parse the csv files and add the proper SPDX tag to the file, in the
format that the file expected. This script was further refined by Greg
based on the output to detect more types of files automatically and to
distinguish between header and source .c files (which need different
comment types.) Finally Greg ran the script using the .csv files to
generate the patches.
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-11-01 22:07:57 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifndef _CSS_H
|
|
|
|
#define _CSS_H
|
|
|
|
|
2006-03-24 19:15:14 +08:00
|
|
|
#include <linux/mutex.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <linux/wait.h>
|
|
|
|
#include <linux/workqueue.h>
|
2007-04-27 22:01:28 +08:00
|
|
|
#include <linux/device.h>
|
2007-04-27 22:01:31 +08:00
|
|
|
#include <linux/types.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
#include <asm/cio.h>
|
2007-04-27 22:01:31 +08:00
|
|
|
#include <asm/chpid.h>
|
2008-07-14 15:59:05 +08:00
|
|
|
#include <asm/schid.h>
|
2006-01-06 16:19:21 +08:00
|
|
|
|
2009-12-07 19:51:18 +08:00
|
|
|
#include "cio.h"
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* path grouping stuff
|
|
|
|
*/
|
|
|
|
#define SPID_FUNC_SINGLE_PATH 0x00
|
|
|
|
#define SPID_FUNC_MULTI_PATH 0x80
|
|
|
|
#define SPID_FUNC_ESTABLISH 0x00
|
|
|
|
#define SPID_FUNC_RESIGN 0x40
|
|
|
|
#define SPID_FUNC_DISBAND 0x20
|
|
|
|
|
|
|
|
#define SNID_STATE1_RESET 0
|
|
|
|
#define SNID_STATE1_UNGROUPED 2
|
|
|
|
#define SNID_STATE1_GROUPED 3
|
|
|
|
|
|
|
|
#define SNID_STATE2_NOT_RESVD 0
|
|
|
|
#define SNID_STATE2_RESVD_ELSE 2
|
|
|
|
#define SNID_STATE2_RESVD_SELF 3
|
|
|
|
|
|
|
|
#define SNID_STATE3_MULTI_PATH 1
|
|
|
|
#define SNID_STATE3_SINGLE_PATH 0
|
|
|
|
|
2024-03-27 00:03:20 +08:00
|
|
|
/*
|
|
|
|
* Miscellaneous constants
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define CSS_NUM_CUB_PAGES 2
|
|
|
|
#define CSS_CUES_PER_PAGE 128
|
2024-03-27 00:03:22 +08:00
|
|
|
#define CSS_NUM_ECUB_PAGES 4
|
|
|
|
#define CSS_ECUES_PER_PAGE 64
|
2024-03-27 00:03:20 +08:00
|
|
|
|
2021-09-10 19:45:24 +08:00
|
|
|
/*
|
|
|
|
* Conditions used to specify which subchannels need evaluation
|
|
|
|
*/
|
|
|
|
enum css_eval_cond {
|
s390/cio: evaluate devices with non-operational paths
css_schedule_reprobe() function calls the evaluation for CSS_EVAL_UNREG
which is specific to the idset of unregistered subchannels. This
evaluation was introduced because, previously, if the underlying device
become not-accessible, the subchannel was unregistered. But, in the recent
changes in cio,with the commit '2297791c92d0 s390/cio: dont unregister
subchannel from child-drivers', we no longer unregister the subchannels
just because of a non-operational device. This allows to have subchannels
without any operational device connected on it. So, a css_schedule_reprobe
function on unregistered subchannel does not have any effect.
Change this functionality to evaluate the subchannels which does not
have a working path to the device. This could be due the erroneous
device or due to the erraneous path. Evaluate based on the values of OPM
and PAM&POM.
Here we introduced a new idset function,to keep I/O subchannels in the
idset when the last seen status indicates that the device has no working
path. A device has no working path if all available paths have been tried
without success.A failed I/O attempt on a path is indicated as a 0 bit
value in the POM mask. By looking at the POM mask bit values of available
paths (1 in PAM) that Linux is supposed to use (1 in vary mask OPM), we
can identify a non-working device as a device where the bit-wise and of
the PAM, POM and OPM mask return 0.
css_schedule_reprobe() is being used by dasd-driver and chsc-cio
component. dasd driver, when it detects a change in the pathgroup, invokes
the re-evaluation of the subchannel. And chsc-cio component upon a CRW
event, (resource accessibility event). In both the cases, it makes much
better sense to re-evalute the subchannel with no-valid path.
Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Reported-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Tested-by: Eric Farman <farman@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
2022-11-17 14:31:50 +08:00
|
|
|
CSS_EVAL_NO_PATH, /* Subchannels with no operational paths */
|
2021-09-10 19:45:24 +08:00
|
|
|
CSS_EVAL_NOT_ONLINE /* sch without an online-device */
|
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct path_state {
|
|
|
|
__u8 state1 : 2; /* path state value 1 */
|
|
|
|
__u8 state2 : 2; /* path state value 2 */
|
|
|
|
__u8 state3 : 1; /* path state value 3 */
|
|
|
|
__u8 resvd : 3; /* reserved */
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
2006-01-06 16:19:23 +08:00
|
|
|
struct extended_cssid {
|
|
|
|
u8 version;
|
|
|
|
u8 cssid;
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
struct pgid {
|
|
|
|
union {
|
|
|
|
__u8 fc; /* SPID function code */
|
|
|
|
struct path_state ps; /* SNID path state */
|
2006-06-04 17:51:28 +08:00
|
|
|
} __attribute__ ((packed)) inf;
|
2006-01-06 16:19:23 +08:00
|
|
|
union {
|
|
|
|
__u32 cpu_addr : 16; /* CPU address */
|
|
|
|
struct extended_cssid ext_cssid;
|
2006-06-04 17:51:28 +08:00
|
|
|
} __attribute__ ((packed)) pgid_high;
|
2005-04-17 06:20:36 +08:00
|
|
|
__u32 cpu_id : 24; /* CPU identification */
|
|
|
|
__u32 cpu_model : 16; /* CPU model */
|
|
|
|
__u32 tod_high; /* high word TOD clock */
|
|
|
|
} __attribute__ ((packed));
|
|
|
|
|
2006-01-11 17:56:22 +08:00
|
|
|
struct subchannel;
|
2008-07-14 15:59:02 +08:00
|
|
|
struct chp_link;
|
2008-07-14 15:58:45 +08:00
|
|
|
/**
|
|
|
|
* struct css_driver - device driver for subchannels
|
|
|
|
* @subchannel_type: subchannel type supported by this driver
|
|
|
|
* @drv: embedded device driver structure
|
|
|
|
* @irq: called on interrupts
|
|
|
|
* @chp_event: called for events affecting a channel path
|
|
|
|
* @sch_event: called for events affecting the subchannel
|
|
|
|
* @probe: function called on probe
|
|
|
|
* @remove: function called on remove
|
|
|
|
* @shutdown: called at device shutdown
|
2009-09-23 04:58:35 +08:00
|
|
|
* @settle: wait for asynchronous work to finish
|
2008-07-14 15:58:45 +08:00
|
|
|
*/
|
2005-04-17 06:20:36 +08:00
|
|
|
struct css_driver {
|
2008-07-14 15:59:03 +08:00
|
|
|
struct css_device_id *subchannel_type;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct device_driver drv;
|
2008-01-26 21:10:39 +08:00
|
|
|
void (*irq)(struct subchannel *);
|
2008-07-14 15:59:02 +08:00
|
|
|
int (*chp_event)(struct subchannel *, struct chp_link *, int);
|
2008-07-14 15:58:45 +08:00
|
|
|
int (*sch_event)(struct subchannel *, int);
|
2006-01-11 17:56:22 +08:00
|
|
|
int (*probe)(struct subchannel *);
|
2021-07-14 03:35:19 +08:00
|
|
|
void (*remove)(struct subchannel *);
|
2006-01-11 17:56:22 +08:00
|
|
|
void (*shutdown)(struct subchannel *);
|
2010-02-27 05:37:27 +08:00
|
|
|
int (*settle)(void);
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2008-01-26 21:10:38 +08:00
|
|
|
#define to_cssdriver(n) container_of(n, struct css_driver, drv)
|
|
|
|
|
2008-01-26 21:10:41 +08:00
|
|
|
extern int css_driver_register(struct css_driver *);
|
|
|
|
extern void css_driver_unregister(struct css_driver *);
|
|
|
|
|
2006-07-12 22:39:50 +08:00
|
|
|
extern void css_sch_device_unregister(struct subchannel *);
|
2013-04-13 19:03:54 +08:00
|
|
|
extern int css_register_subchannel(struct subchannel *);
|
2018-06-26 21:09:32 +08:00
|
|
|
extern struct subchannel *css_alloc_subchannel(struct subchannel_id,
|
|
|
|
struct schib *schib);
|
2008-07-14 15:58:45 +08:00
|
|
|
extern struct subchannel *get_subchannel_by_schid(struct subchannel_id);
|
2005-04-17 06:20:36 +08:00
|
|
|
extern int css_init_done;
|
2009-09-23 04:58:37 +08:00
|
|
|
extern int max_ssid;
|
2008-01-26 21:10:48 +08:00
|
|
|
int for_each_subchannel_staged(int (*fn_known)(struct subchannel *, void *),
|
|
|
|
int (*fn_unknown)(struct subchannel_id,
|
|
|
|
void *), void *data);
|
2006-01-06 16:19:22 +08:00
|
|
|
extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *);
|
2007-04-27 22:01:35 +08:00
|
|
|
void css_update_ssd_info(struct subchannel *sch);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-01-06 16:19:23 +08:00
|
|
|
struct channel_subsystem {
|
2020-09-11 01:23:45 +08:00
|
|
|
u8 cssid;
|
|
|
|
u8 iid;
|
|
|
|
bool id_valid; /* cssid,iid */
|
2006-01-15 05:21:03 +08:00
|
|
|
struct channel_path *chps[__MAX_CHPID + 1];
|
2006-01-06 16:19:23 +08:00
|
|
|
struct device device;
|
|
|
|
struct pgid global_pgid;
|
2006-03-24 19:15:14 +08:00
|
|
|
struct mutex mutex;
|
|
|
|
/* channel measurement related */
|
|
|
|
int cm_enabled;
|
2024-03-27 00:03:20 +08:00
|
|
|
void *cub[CSS_NUM_CUB_PAGES];
|
2024-03-27 00:03:22 +08:00
|
|
|
void *ecub[CSS_NUM_ECUB_PAGES];
|
2006-12-08 22:54:28 +08:00
|
|
|
/* for orphaned ccw devices */
|
|
|
|
struct subchannel *pseudo_subchannel;
|
2006-01-06 16:19:23 +08:00
|
|
|
};
|
|
|
|
#define to_css(dev) container_of(dev, struct channel_subsystem, device)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-10-12 22:11:13 +08:00
|
|
|
extern struct channel_subsystem *channel_subsystems[];
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-08 21:28:03 +08:00
|
|
|
/* Dummy helper which needs to change once we support more than one css. */
|
|
|
|
static inline struct channel_subsystem *css_by_id(u8 cssid)
|
|
|
|
{
|
|
|
|
return channel_subsystems[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Dummy iterator which needs to change once we support more than one css. */
|
|
|
|
#define for_each_css(css) \
|
|
|
|
for ((css) = channel_subsystems[0]; (css); (css) = NULL)
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* Helper functions to build lists for the slow path. */
|
2007-04-27 22:01:34 +08:00
|
|
|
void css_schedule_eval(struct subchannel_id schid);
|
|
|
|
void css_schedule_eval_all(void);
|
2021-09-10 19:45:24 +08:00
|
|
|
void css_schedule_eval_cond(enum css_eval_cond, unsigned long delay);
|
2010-02-27 05:37:29 +08:00
|
|
|
int css_complete_work(void);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-12-08 22:54:28 +08:00
|
|
|
int sch_is_pseudo_sch(struct subchannel *);
|
2008-01-26 21:10:45 +08:00
|
|
|
struct schib;
|
|
|
|
int css_sch_is_valid(struct schib *);
|
2006-12-08 22:54:28 +08:00
|
|
|
|
2010-02-27 05:37:24 +08:00
|
|
|
extern struct workqueue_struct *cio_work_q;
|
2008-04-17 13:45:59 +08:00
|
|
|
void css_wait_for_slow_path(void);
|
2009-12-07 19:51:18 +08:00
|
|
|
void css_sched_sch_todo(struct subchannel *sch, enum sch_todo todo);
|
2005-04-17 06:20:36 +08:00
|
|
|
#endif
|