[SCM] Samba Shared Repository - branch master updated - e0711ffa526e22e3ffe483319ce5d7725d578647

Tim Prouty tprouty at samba.org
Tue Dec 9 22:55:54 GMT 2008


The branch, master has been updated
       via  e0711ffa526e22e3ffe483319ce5d7725d578647 (commit)
       via  51e7f79b3b4ae0fa830ac176df5ba8229e14f32d (commit)
       via  b3c785f22edeff5f731af95ec1252517c4677451 (commit)
       via  2053f77b3c71ad40a875614b98e547fd558375ad (commit)
       via  6153f622af0cd7855ca349f73307988c1b9478b8 (commit)
       via  d5d9d3dc0e2c85ab608972cfa8e41122504fb75e (commit)
      from  f62e0d6c96519a04f29df91c9c8722843e51be44 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit e0711ffa526e22e3ffe483319ce5d7725d578647
Author: Tim Prouty <tprouty at samba.org>
Date:   Mon Dec 8 16:57:58 2008 -0800

    s3: Add the OneFS SMB_VFS_CREATE_FILE implementation
    
    This is the first pass at extending the onefs vfs module to support
    the CIFS-specific enhancements available on OneFS.  Most of this patch
    is massaging the sama open path to work with ifs_createfile.
    
    ifs_createfile is a CIFS-specific syscall for opening/files and
    directories.  It adds support for:
    - Full in-kernel access checks using a windows access_mask
    - Cluster-coherent share mode locks
    - Cluster-coherent oplocks
    - Streams
    - Setting security descriptors at create time
    - Setting dos_attributes at create time
    
    This patch does not implement the samba side of the streams support or
    oplocks support.  Tests that expect oplocks to be granted or streams
    to be supported will fail.  This will be remedied in upcoming patches.

commit 51e7f79b3b4ae0fa830ac176df5ba8229e14f32d
Author: Tim Prouty <tprouty at samba.org>
Date:   Mon Dec 8 16:42:45 2008 -0800

    s3: Add onefs_open.c with code copied verbatim from smbd/open.c
    
    This is an intermediate step that makes it much easier to see how the
    OneFS SMB_VFS_CREATE_FILE implementation diverges from stock samba.
    The goal is that more common code can be refactored into utility
    functions.

commit b3c785f22edeff5f731af95ec1252517c4677451
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Nov 26 16:47:14 2008 -0800

    s3: Call fd_close from close_directory
    
    Some implementations of SMB_VFS_CREATE_FILE implementations actually
    keep an fd open for directories just as files.  In this case it is
    necessary to call fd_close when closing directories.  This is safe
    because fd_close is a no-op when fd == -1, which is true for directory
    opens originating from open.c (the default SMB_VFS_CREATE_FILE
    implementation).

commit 2053f77b3c71ad40a875614b98e547fd558375ad
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Nov 19 21:26:42 2008 -0800

    s3: Refactor calculating path from relative_fid into a separate function

commit 6153f622af0cd7855ca349f73307988c1b9478b8
Author: Tim Prouty <tprouty at samba.org>
Date:   Tue Nov 4 18:08:03 2008 -0800

    s3: Refactor getting sec_info from a security_descriptor into separate function

commit d5d9d3dc0e2c85ab608972cfa8e41122504fb75e
Author: Tim Prouty <tprouty at samba.org>
Date:   Wed Oct 29 17:28:19 2008 -0700

    s3: Make a few open utility functions non-static
    
    This allows vfs modules that implement SMB_VFS_CREATE_FILE to access
    some of the useful utility functions.

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in            |    3 +-
 source3/include/proto.h        |   37 +
 source3/lib/secdesc.c          |   27 +
 source3/modules/onefs.h        |   68 ++-
 source3/modules/onefs_acl.c    |  119 ++-
 source3/modules/onefs_open.c   | 2154 ++++++++++++++++++++++++++++++++++++++++
 source3/modules/onefs_system.c |  214 ++++
 source3/modules/vfs_onefs.c    |   27 +-
 source3/smbd/close.c           |    7 +
 source3/smbd/dosmode.c         |    2 +-
 source3/smbd/open.c            |  221 +++--
 11 files changed, 2718 insertions(+), 161 deletions(-)
 create mode 100644 source3/modules/onefs_open.c
 create mode 100644 source3/modules/onefs_system.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index bf79a7d..f53406c 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -650,7 +650,8 @@ VFS_SYNCOPS_OBJ = modules/vfs_syncops.o
 VFS_ACL_XATTR_OBJ = modules/vfs_acl_xattr.o
 VFS_ACL_TDB_OBJ = modules/vfs_acl_tdb.o
 VFS_SMB_TRAFFIC_ANALYZER_OBJ = modules/vfs_smb_traffic_analyzer.o
-VFS_ONEFS_OBJ = modules/vfs_onefs.o modules/onefs_acl.o
+VFS_ONEFS_OBJ = modules/vfs_onefs.o modules/onefs_acl.o modules/onefs_system.o \
+		modules/onefs_open.o
 
 PLAINTEXT_AUTH_OBJ = auth/pampass.o auth/pass_check.o
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index ed79ad0..d0ad361 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -723,6 +723,7 @@ bool sec_acl_equal(SEC_ACL *s1, SEC_ACL *s2);
 /* The following definitions come from lib/secdesc.c  */
 
 bool sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2);
+uint32_t get_sec_info(const SEC_DESC *sd);
 SEC_DESC_BUF *sec_desc_merge(TALLOC_CTX *ctx, SEC_DESC_BUF *new_sdb, SEC_DESC_BUF *old_sdb);
 SEC_DESC *make_sec_desc(TALLOC_CTX *ctx,
 			enum security_descriptor_revision revision,
@@ -7821,6 +7822,7 @@ bool dns_register_smbd_reply(struct dns_reg_state *dns_state,
 mode_t unix_mode(connection_struct *conn, int dosmode, const char *fname,
 		 const char *inherit_from_dir);
 uint32 dos_mode_msdfs(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf);
+int dos_attributes_to_stat_dos_flags(uint32_t dosmode);
 uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf);
 int file_set_dosmode(connection_struct *conn, const char *fname,
 		     uint32 dosmode, SMB_STRUCT_STAT *st,
@@ -8097,6 +8099,34 @@ NTSTATUS smb1_file_se_access_check(const struct security_descriptor *sd,
                           uint32_t access_desired,
                           uint32_t *access_granted);
 NTSTATUS fd_close(files_struct *fsp);
+void change_file_owner_to_parent(connection_struct *conn,
+				 const char *inherit_from_dir,
+				 files_struct *fsp);
+NTSTATUS change_dir_owner_to_parent(connection_struct *conn,
+				    const char *inherit_from_dir,
+				    const char *fname,
+				    SMB_STRUCT_STAT *psbuf);
+bool is_executable(const char *fname);
+bool is_stat_open(uint32 access_mask);
+bool request_timed_out(struct timeval request_time,
+		       struct timeval timeout);
+bool open_match_attributes(connection_struct *conn,
+			   const char *path,
+			   uint32 old_dos_attr,
+			   uint32 new_dos_attr,
+			   mode_t existing_unx_mode,
+			   mode_t new_unx_mode,
+			   mode_t *returned_unx_mode);
+NTSTATUS fcb_or_dos_open(struct smb_request *req,
+			 connection_struct *conn,
+			 files_struct *fsp_to_dup_into,
+			 const char *fname,
+			 struct file_id id,
+			 uint16 file_pid,
+			 uint16 vuid,
+			 uint32 access_mask,
+			 uint32 share_access,
+			 uint32 create_options);
 bool map_open_params_to_ntcreate(const char *fname, int deny_mode, int open_func,
 				 uint32 *paccess_mask,
 				 uint32 *pshare_mode,
@@ -8112,6 +8142,9 @@ void msg_file_was_renamed(struct messaging_context *msg,
 			  uint32_t msg_type,
 			  struct server_id server_id,
 			  DATA_BLOB *data);
+struct case_semantics_state;
+struct case_semantics_state *set_posix_case_semantics(TALLOC_CTX *mem_ctx,
+						      connection_struct *conn);
 NTSTATUS create_file_default(connection_struct *conn,
 			     struct smb_request *req,
 			     uint16_t root_dir_fid,
@@ -8130,6 +8163,10 @@ NTSTATUS create_file_default(connection_struct *conn,
 			     files_struct **result,
 			     int *pinfo,
 			     SMB_STRUCT_STAT *psbuf);
+NTSTATUS get_relative_fid_filename(connection_struct *conn,
+				   struct smb_request *req,
+				   uint16_t root_dir_fid,
+				   const char *fname, char **new_fname);
 
 /* The following definitions come from smbd/oplock.c  */
 
diff --git a/source3/lib/secdesc.c b/source3/lib/secdesc.c
index df85336..400f5f3 100644
--- a/source3/lib/secdesc.c
+++ b/source3/lib/secdesc.c
@@ -100,6 +100,33 @@ bool sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2)
 }
 
 /*******************************************************************
+ Given a security_descriptor return the sec_info.
+********************************************************************/
+
+uint32_t get_sec_info(const SEC_DESC *sd)
+{
+	uint32_t sec_info = ALL_SECURITY_INFORMATION;
+
+	SMB_ASSERT(sd);
+
+	if (sd->owner_sid == NULL) {
+		sec_info &= ~OWNER_SECURITY_INFORMATION;
+	}
+	if (sd->group_sid == NULL) {
+		sec_info &= ~GROUP_SECURITY_INFORMATION;
+	}
+	if (sd->sacl == NULL) {
+		sec_info &= ~SACL_SECURITY_INFORMATION;
+	}
+	if (sd->dacl == NULL) {
+		sec_info &= ~DACL_SECURITY_INFORMATION;
+	}
+
+	return sec_info;
+}
+
+
+/*******************************************************************
  Merge part of security descriptor old_sec in to the empty sections of 
  security descriptor new_sec.
 ********************************************************************/
diff --git a/source3/modules/onefs.h b/source3/modules/onefs.h
index 965f395..8d0f45a 100644
--- a/source3/modules/onefs.h
+++ b/source3/modules/onefs.h
@@ -21,6 +21,10 @@
 #ifndef _ONEFS_H
 #define _ONEFS_H
 
+#include "includes.h"
+
+#include <sys/isi_acl.h>
+
 /* OneFS Module smb.conf parameters and defaults */
 
 /**
@@ -34,13 +38,6 @@ enum onefs_acl_wire_format
 	ACL_FORMAT_ALWAYS /**< Always canonicalize */
 };
 
-const struct enum_list enum_onefs_acl_wire_format[] = {
-	{ACL_FORMAT_RAW,  "No Format"},
-	{ACL_FORMAT_WINDOWS_SD, "Format Windows SD"},
-	{ACL_FORMAT_ALWAYS, "Always Format SD"},
-	{-1, NULL}
-};
-
 #define PARM_ONEFS_TYPE "onefs"
 #define PARM_ACL_WIRE_FORMAT "acl wire format"
 #define PARM_ACL_WIRE_FORMAT_DEFAULT ACL_FORMAT_WINDOWS_SD
@@ -49,4 +46,61 @@ const struct enum_list enum_onefs_acl_wire_format[] = {
 #define PARM_CREATOR_OWNER_GETS_FULL_CONTROL "creator owner gets full control"
 #define PARM_CREATOR_OWNER_GETS_FULL_CONTROL_DEFAULT true
 
+/*
+ * vfs interface handlers
+ */
+NTSTATUS onefs_create_file(vfs_handle_struct *handle,
+			   struct smb_request *req,
+			   uint16_t root_dir_fid,
+			   const char *fname,
+			   uint32_t create_file_flags,
+			   uint32_t access_mask,
+			   uint32_t share_access,
+			   uint32_t create_disposition,
+			   uint32_t create_options,
+			   uint32_t file_attributes,
+			   uint32_t oplock_request,
+			   uint64_t allocation_size,
+			   struct security_descriptor *sd,
+			   struct ea_list *ea_list,
+			   files_struct **result,
+			   int *pinfo,
+			   SMB_STRUCT_STAT *psbuf);
+
+NTSTATUS onefs_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
+			   uint32 security_info, SEC_DESC **ppdesc);
+
+NTSTATUS onefs_get_nt_acl(vfs_handle_struct *handle, const char* name,
+			  uint32 security_info, SEC_DESC **ppdesc);
+
+NTSTATUS onefs_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
+			   uint32 security_info_sent, SEC_DESC *psd);
+
+
+/*
+ * Utility functions
+ */
+NTSTATUS onefs_setup_sd(uint32 security_info_sent, SEC_DESC *psd,
+			struct ifs_security_descriptor *sd);
+
+/*
+ * System Interfaces
+ */
+int onefs_sys_create_file(connection_struct *conn,
+			  int base_fd,
+			  const char *path,
+		          uint32_t access_mask,
+		          uint32_t open_access_mask,
+			  uint32_t share_access,
+			  uint32_t create_options,
+			  int flags,
+			  mode_t mode,
+			  int oplock_request,
+			  uint64_t id,
+			  struct security_descriptor *sd,
+			  uint32_t ntfs_flags,
+			  int *granted_oplock);
+
+
+
 #endif /* _ONEFS_H */
diff --git a/source3/modules/onefs_acl.c b/source3/modules/onefs_acl.c
index 3a692c9..5351118 100644
--- a/source3/modules/onefs_acl.c
+++ b/source3/modules/onefs_acl.c
@@ -19,20 +19,23 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "includes.h"
+#include "onefs.h"
 
-#include <sys/isi_acl.h>
 #include <isi_acl/isi_acl_util.h>
-#include <sys/isi_oplock.h>
 #include <ifs/ifs_syscalls.h>
 
-#include "onefs.h"
+const struct enum_list enum_onefs_acl_wire_format[] = {
+	{ACL_FORMAT_RAW,  "No Format"},
+	{ACL_FORMAT_WINDOWS_SD, "Format Windows SD"},
+	{ACL_FORMAT_ALWAYS, "Always Format SD"},
+	{-1, NULL}
+};
 
 /**
  * Turn SID into UID/GID and setup a struct ifs_identity
  */
 static bool
-onefs_sid_to_identity(DOM_SID *sid, struct ifs_identity *id, bool is_group)
+onefs_sid_to_identity(const DOM_SID *sid, struct ifs_identity *id, bool is_group)
 {
 	enum ifs_identity_type type = IFS_ID_TYPE_LAST+1;
 	uid_t uid = 0;
@@ -514,15 +517,22 @@ onefs_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
 		if (security_info & SACL_SECURITY_INFORMATION)
 			desired_access |= IFS_RTS_SACL_ACCESS;
 
-		if ((fsp->fh->fd = ifs_createfile(-1,
-						  fsp->fsp_name,
-						  desired_access,
-						  0, 0,
-						  OPLOCK_NONE,
-						  0, NULL, 0,
-						  NULL, 0, NULL)) == -1) {
-			DEBUG(0, ("Error opening file %s. errno=%d\n",
-			    fsp->fsp_name, errno));
+		if ((fsp->fh->fd = onefs_sys_create_file(handle->conn,
+							 -1,
+							 fsp->fsp_name,
+							 desired_access,
+							 desired_access,
+							 0,
+							 0,
+							 0,
+							 0,
+							 INTERNAL_OPEN_ONLY,
+							 0,
+							 NULL,
+							 0,
+							 NULL)) == -1) {
+			DEBUG(0, ("Error opening file %s. errno=%d (%s)\n",
+				  fsp->fsp_name, errno, strerror(errno)));
 			status = map_nt_error_from_unix(errno);
 			goto out;
 		}
@@ -679,22 +689,18 @@ onefs_get_nt_acl(vfs_handle_struct *handle, const char* name,
 }
 
 /**
- * Isilon-specific function for setting an NTFS ACL on an open file.
+ * Isilon-specific function for setting up an ifs_security_descriptor, given a
+ * samba SEC_DESC.
  *
- * @return NT_STATUS_UNSUCCESSFUL for userspace errors, NTSTATUS based off
- * errno on syscall errors
+ * @param[out] sd ifs_security_descriptor to fill in
+ *
+ * @return NTSTATUS_OK if successful
  */
-NTSTATUS
-onefs_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
-		  uint32 security_info_sent, SEC_DESC *psd)
+NTSTATUS onefs_setup_sd(uint32 security_info_sent, SEC_DESC *psd,
+			struct ifs_security_descriptor *sd)
 {
-	struct ifs_security_descriptor sd = {};
 	struct ifs_security_acl dacl, sacl, *daclp, *saclp;
 	struct ifs_identity owner, group, *ownerp, *groupp;
-	int fd;
-	bool fopened = false;
-
-	DEBUG(5,("Setting SD on file %s.\n", fsp->fsp_name ));
 
 	ownerp = NULL;
 	groupp = NULL;
@@ -759,10 +765,37 @@ onefs_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
 
 	/* Setup ifs_security_descriptor */
 	DEBUG(5,("Setting up SD\n"));
-	if (aclu_initialize_sd(&sd, psd->type, ownerp, groupp,
-	    (daclp ? &daclp : NULL), (saclp ? &saclp : NULL), false))
+	if (aclu_initialize_sd(sd, psd->type, ownerp, groupp,
+		(daclp ? &daclp : NULL), (saclp ? &saclp : NULL), false))
 		return NT_STATUS_UNSUCCESSFUL;
 
+	return NT_STATUS_OK;
+}
+
+/**
+ * Isilon-specific function for setting an NTFS ACL on an open file.
+ *
+ * @return NT_STATUS_UNSUCCESSFUL for userspace errors, NTSTATUS based off
+ * errno on syscall errors
+ */
+NTSTATUS
+onefs_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
+		  uint32 security_info_sent, SEC_DESC *psd)
+{
+	struct ifs_security_descriptor sd = {};
+	int fd;
+	bool fopened = false;
+	NTSTATUS status;
+
+	DEBUG(5,("Setting SD on file %s.\n", fsp->fsp_name ));
+
+	status = onefs_setup_sd(security_info_sent, psd, &sd);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(3, ("SD initialization failure: %s", nt_errstr(status)));
+		return status;
+	}
+
 	fd = fsp->fh->fd;
 	if (fd == -1) {
 		enum ifs_ace_rights desired_access = 0;
@@ -775,16 +808,24 @@ onefs_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
 		if (security_info_sent & SACL_SECURITY_INFORMATION)
 			desired_access |= IFS_RTS_SACL_ACCESS;
 
-		if ((fd = ifs_createfile(-1,
-					 fsp->fsp_name,
-					 desired_access,
-					 0, 0,
-					 OPLOCK_NONE,
-					 0, NULL, 0,
-					 NULL, 0, NULL)) == -1) {
-			DEBUG(0, ("Error opening file %s. errno=%d\n",
-			    fsp->fsp_name, errno));
-			return map_nt_error_from_unix(errno);
+		if ((fd = onefs_sys_create_file(handle->conn,
+						-1,
+						fsp->fsp_name,
+						desired_access,
+						desired_access,
+						0,
+						0,
+						0,
+						0,
+						INTERNAL_OPEN_ONLY,
+						0,
+						NULL,
+						0,
+						NULL)) == -1) {
+			DEBUG(0, ("Error opening file %s. errno=%d (%s)\n",
+				  fsp->fsp_name, errno, strerror(errno)));
+			status = map_nt_error_from_unix(errno);
+			goto out;
 		}
 		fopened = true;
 	}
@@ -792,10 +833,12 @@ onefs_fset_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
         errno = 0;
 	if (ifs_set_security_descriptor(fd, security_info_sent, &sd)) {
 		DEBUG(0, ("Error setting security descriptor = %d\n", errno));
+		status = map_nt_error_from_unix(errno);
 		goto out;
 	}
 
 	DEBUG(5, ("Security descriptor set correctly!\n"));
+	status = NT_STATUS_OK;
 
 	/* FALLTHROUGH */
 out:
@@ -803,5 +846,5 @@ out:
 		close(fd);
 
 	aclu_free_sd(&sd, false);
-	return errno ? map_nt_error_from_unix(errno) : NT_STATUS_OK;
+	return status;
 }
diff --git a/source3/modules/onefs_open.c b/source3/modules/onefs_open.c
new file mode 100644
index 0000000..bda5e7e
--- /dev/null
+++ b/source3/modules/onefs_open.c
@@ -0,0 +1,2154 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * This file began with some code from source3/smbd/open.c and modified it to
+ * work with ifs_createfile.
+ *
+ * ifs_createfile is a CIFS-specific syscall for opening/files and
+ * directories.  It adds support for:
+ *    - Full in-kernel access checks using a windows access_mask
+ *    - Cluster-coherent share mode locks
+ *    - Cluster-coherent oplocks
+ *    - Streams
+ *    - Setting security descriptors at create time
+ *    - Setting dos_attributes at create time
+ *
+ * Copyright (C) Andrew Tridgell 1992-1998
+ * Copyright (C) Jeremy Allison 2001-2004
+ * Copyright (C) Volker Lendecke 2005
+ * Copyright (C) Tim Prouty, 2008
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "onefs.h"
+
+extern const struct generic_mapping file_generic_mapping;
+extern bool global_client_failed_oplock_break;
+
+struct deferred_open_record {
+	bool delayed_for_oplocks;
+	bool failed; /* added for onefs_oplocks */
+	struct file_id id;
+};
+
+static NTSTATUS onefs_create_file_unixpath(connection_struct *conn,
+			      struct smb_request *req,
+			      const char *fname,
+			      uint32_t access_mask,
+			      uint32_t share_access,
+			      uint32_t create_disposition,
+			      uint32_t create_options,
+			      uint32_t file_attributes,
+			      uint32_t oplock_request,
+			      uint64_t allocation_size,
+			      struct security_descriptor *sd,
+			      struct ea_list *ea_list,
+
+			      files_struct **result,
+			      int *pinfo,
+			      SMB_STRUCT_STAT *psbuf);
+
+/****************************************************************************
+ Open a file.
+****************************************************************************/
+
+static NTSTATUS onefs_open_file(files_struct *fsp,
+				connection_struct *conn,
+				struct smb_request *req,
+				const char *parent_dir,
+				const char *name,
+				const char *path,
+				SMB_STRUCT_STAT *psbuf,
+				int flags,
+				mode_t unx_mode,
+				uint32 access_mask,
+				uint32 open_access_mask,
+				int oplock_request,
+				uint64 id,
+				uint32 share_access,
+				uint32 create_options,
+				uint32_t new_dos_attributes,
+				struct security_descriptor *sd,
+				int *granted_oplock)
+{


-- 
Samba Shared Repository


More information about the samba-cvs mailing list