forked from luck/tmp_suning_uos_patched
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: xfs: fix force shutdown handling in xfs_end_io xfs: constify xfs_item_ops xfs: Fix possible memory corruption in xfs_readlink
This commit is contained in:
commit
53e3ccfd15
|
@ -189,7 +189,7 @@ xfs_end_io(
|
|||
int error = 0;
|
||||
|
||||
if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
error = -EIO;
|
||||
ioend->io_error = -EIO;
|
||||
goto done;
|
||||
}
|
||||
if (ioend->io_error)
|
||||
|
|
|
@ -656,7 +656,7 @@ xfs_buf_item_committing(
|
|||
/*
|
||||
* This is the ops vector shared by all buf log items.
|
||||
*/
|
||||
static struct xfs_item_ops xfs_buf_item_ops = {
|
||||
static const struct xfs_item_ops xfs_buf_item_ops = {
|
||||
.iop_size = xfs_buf_item_size,
|
||||
.iop_format = xfs_buf_item_format,
|
||||
.iop_pin = xfs_buf_item_pin,
|
||||
|
|
|
@ -295,7 +295,7 @@ xfs_qm_dquot_logitem_committing(
|
|||
/*
|
||||
* This is the ops vector for dquots
|
||||
*/
|
||||
static struct xfs_item_ops xfs_dquot_item_ops = {
|
||||
static const struct xfs_item_ops xfs_dquot_item_ops = {
|
||||
.iop_size = xfs_qm_dquot_logitem_size,
|
||||
.iop_format = xfs_qm_dquot_logitem_format,
|
||||
.iop_pin = xfs_qm_dquot_logitem_pin,
|
||||
|
@ -483,7 +483,7 @@ xfs_qm_qoff_logitem_committing(
|
|||
{
|
||||
}
|
||||
|
||||
static struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
|
||||
static const struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
|
||||
.iop_size = xfs_qm_qoff_logitem_size,
|
||||
.iop_format = xfs_qm_qoff_logitem_format,
|
||||
.iop_pin = xfs_qm_qoff_logitem_pin,
|
||||
|
@ -498,7 +498,7 @@ static struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
|
|||
/*
|
||||
* This is the ops vector shared by all quotaoff-start log items.
|
||||
*/
|
||||
static struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
|
||||
static const struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
|
||||
.iop_size = xfs_qm_qoff_logitem_size,
|
||||
.iop_format = xfs_qm_qoff_logitem_format,
|
||||
.iop_pin = xfs_qm_qoff_logitem_pin,
|
||||
|
|
|
@ -217,7 +217,7 @@ xfs_efi_item_committing(
|
|||
/*
|
||||
* This is the ops vector shared by all efi log items.
|
||||
*/
|
||||
static struct xfs_item_ops xfs_efi_item_ops = {
|
||||
static const struct xfs_item_ops xfs_efi_item_ops = {
|
||||
.iop_size = xfs_efi_item_size,
|
||||
.iop_format = xfs_efi_item_format,
|
||||
.iop_pin = xfs_efi_item_pin,
|
||||
|
@ -477,7 +477,7 @@ xfs_efd_item_committing(
|
|||
/*
|
||||
* This is the ops vector shared by all efd log items.
|
||||
*/
|
||||
static struct xfs_item_ops xfs_efd_item_ops = {
|
||||
static const struct xfs_item_ops xfs_efd_item_ops = {
|
||||
.iop_size = xfs_efd_item_size,
|
||||
.iop_format = xfs_efd_item_format,
|
||||
.iop_pin = xfs_efd_item_pin,
|
||||
|
|
|
@ -795,7 +795,7 @@ xfs_inode_item_committing(
|
|||
/*
|
||||
* This is the ops vector shared by all buf log items.
|
||||
*/
|
||||
static struct xfs_item_ops xfs_inode_item_ops = {
|
||||
static const struct xfs_item_ops xfs_inode_item_ops = {
|
||||
.iop_size = xfs_inode_item_size,
|
||||
.iop_format = xfs_inode_item_format,
|
||||
.iop_pin = xfs_inode_item_pin,
|
||||
|
|
|
@ -626,7 +626,7 @@ xfs_log_item_init(
|
|||
struct xfs_mount *mp,
|
||||
struct xfs_log_item *item,
|
||||
int type,
|
||||
struct xfs_item_ops *ops)
|
||||
const struct xfs_item_ops *ops)
|
||||
{
|
||||
item->li_mountp = mp;
|
||||
item->li_ailp = mp->m_ail;
|
||||
|
|
|
@ -137,7 +137,7 @@ struct xfs_trans;
|
|||
void xfs_log_item_init(struct xfs_mount *mp,
|
||||
struct xfs_log_item *item,
|
||||
int type,
|
||||
struct xfs_item_ops *ops);
|
||||
const struct xfs_item_ops *ops);
|
||||
|
||||
xfs_lsn_t xfs_log_done(struct xfs_mount *mp,
|
||||
struct xlog_ticket *ticket,
|
||||
|
|
|
@ -326,7 +326,7 @@ typedef struct xfs_log_item {
|
|||
struct xfs_log_item *);
|
||||
/* buffer item iodone */
|
||||
/* callback func */
|
||||
struct xfs_item_ops *li_ops; /* function list */
|
||||
const struct xfs_item_ops *li_ops; /* function list */
|
||||
|
||||
/* delayed logging */
|
||||
struct list_head li_cil; /* CIL pointers */
|
||||
|
@ -341,7 +341,7 @@ typedef struct xfs_log_item {
|
|||
{ XFS_LI_IN_AIL, "IN_AIL" }, \
|
||||
{ XFS_LI_ABORTED, "ABORTED" }
|
||||
|
||||
typedef struct xfs_item_ops {
|
||||
struct xfs_item_ops {
|
||||
uint (*iop_size)(xfs_log_item_t *);
|
||||
void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *);
|
||||
void (*iop_pin)(xfs_log_item_t *);
|
||||
|
@ -352,7 +352,7 @@ typedef struct xfs_item_ops {
|
|||
void (*iop_push)(xfs_log_item_t *);
|
||||
bool (*iop_pushbuf)(xfs_log_item_t *);
|
||||
void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t);
|
||||
} xfs_item_ops_t;
|
||||
};
|
||||
|
||||
#define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip)
|
||||
#define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp)
|
||||
|
|
|
@ -112,7 +112,7 @@ xfs_readlink(
|
|||
char *link)
|
||||
{
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
int pathlen;
|
||||
xfs_fsize_t pathlen;
|
||||
int error = 0;
|
||||
|
||||
trace_xfs_readlink(ip);
|
||||
|
@ -122,13 +122,19 @@ xfs_readlink(
|
|||
|
||||
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
||||
|
||||
ASSERT(S_ISLNK(ip->i_d.di_mode));
|
||||
ASSERT(ip->i_d.di_size <= MAXPATHLEN);
|
||||
|
||||
pathlen = ip->i_d.di_size;
|
||||
if (!pathlen)
|
||||
goto out;
|
||||
|
||||
if (pathlen < 0 || pathlen > MAXPATHLEN) {
|
||||
xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)",
|
||||
__func__, (unsigned long long) ip->i_ino,
|
||||
(long long) pathlen);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
|
||||
if (ip->i_df.if_flags & XFS_IFINLINE) {
|
||||
memcpy(link, ip->i_df.if_u1.if_data, pathlen);
|
||||
link[pathlen] = '\0';
|
||||
|
|
Loading…
Reference in New Issue
Block a user