Commit b9386771 authored by Anton Altaparmakov's avatar Anton Altaparmakov

Merge ssh://linux-ntfs@bkbits.net/ntfs-2.6-devel

into cantab.net:/home/src/ntfs-2.6-devel
parents 54f4cc4a ec4db73b
......@@ -277,6 +277,8 @@ ChangeLog
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
2.1.20:
- Fix two stupid bugs introduced in 2.1.18 release.
2.1.19:
- Minor bugfix in handling of the default upcase table.
- Many internal cleanups and improvements. Many thanks to Linus
......
......@@ -60,8 +60,8 @@ chars_in_buffer() - Report the number of bytes in the buffer.
set_termios() - Called on termios structure changes. The caller
passes the old termios data and the current data
is in the tty. Called under the termios lock so
may not sleep. Serialized against itself only.
is in the tty. Called under the termios semaphore so
allowed to sleep. Serialized against itself only.
read() - Move data from the line discipline to the user.
Multiple read calls may occur in parallel and the
......@@ -158,8 +158,8 @@ write_room() - Return the number of characters tht can be stuffed
ioctl() - Called when an ioctl may be for the driver
set_termios() - Called on termios change, may get parallel calls,
may block for now (may change that)
set_termios() - Called on termios change, serialized against
itself by a semaphore. May sleep.
set_ldisc() - Notifier for discipline change. At the point this
is done the discipline is not yet usable. Can now
......
......@@ -316,6 +316,10 @@ u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
unsigned int addr;
int i;
struct device_node *np = pci_busdev_to_OF_node(bus, devfn);
if (np == NULL)
return PCIBIOS_DEVICE_NOT_FOUND;
/*
* When a device in K2 is powered down, we die on config
* cycle accesses. Fix that here.
......@@ -363,6 +367,9 @@ u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
unsigned int addr;
int i;
struct device_node *np = pci_busdev_to_OF_node(bus, devfn);
if (np == NULL)
return PCIBIOS_DEVICE_NOT_FOUND;
/*
* When a device in K2 is powered down, we die on config
* cycle accesses. Fix that here.
......
......@@ -271,7 +271,7 @@ static int __pmac u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
int offset, int len, u32 *val)
{
struct pci_controller *hose;
struct device_node *busdn;
struct device_node *busdn, *dn;
unsigned long addr;
if (bus->self)
......@@ -284,6 +284,16 @@ static int __pmac u3_ht_read_config(struct pci_bus *bus, unsigned int devfn,
if (hose == NULL)
return PCIBIOS_DEVICE_NOT_FOUND;
/* We only allow config cycles to devices that are in OF device-tree
* as we are apparently having some weird things going on with some
* revs of K2 on recent G5s
*/
for (dn = busdn->child; dn; dn = dn->sibling)
if (dn->devfn == devfn)
break;
if (dn == NULL)
return PCIBIOS_DEVICE_NOT_FOUND;
addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
if (!addr)
return PCIBIOS_DEVICE_NOT_FOUND;
......
......@@ -130,8 +130,6 @@ LIST_HEAD(tty_drivers); /* linked list of tty drivers */
/* Semaphore to protect creating and releasing a tty. This is shared with
vt.c for deeply disgusting hack reasons */
DECLARE_MUTEX(tty_sem);
/* Lock for tty_termios changes - private to tty_io/tty_ioctl */
spinlock_t tty_termios_lock = SPIN_LOCK_UNLOCKED;
#ifdef CONFIG_UNIX98_PTYS
extern struct tty_driver *ptm_driver; /* Unix98 pty masters; for /dev/ptmx */
......@@ -239,10 +237,9 @@ static int check_tty_count(struct tty_struct *tty, const char *routine)
static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
{
unsigned long flags;
spin_lock_irqsave(&tty_termios_lock, flags);
down(&tty->termios_sem);
tty->termios->c_line = num;
spin_unlock_irqrestore(&tty_termios_lock, flags);
up(&tty->termios_sem);
}
/*
......@@ -811,10 +808,9 @@ void do_tty_hangup(void *data)
*/
if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
{
unsigned long flags;
spin_lock_irqsave(&tty_termios_lock, flags);
down(&tty->termios_sem);
*tty->termios = tty->driver->init_termios;
spin_unlock_irqrestore(&tty_termios_lock, flags);
up(&tty->termios_sem);
}
/* Defer ldisc switch */
......@@ -2606,6 +2602,7 @@ static void initialize_tty_struct(struct tty_struct *tty)
tty->flip.flag_buf_ptr = tty->flip.flag_buf;
INIT_WORK(&tty->flip.work, flush_to_ldisc, tty);
init_MUTEX(&tty->flip.pty_sem);
init_MUTEX(&tty->termios_sem);
init_waitqueue_head(&tty->write_wait);
init_waitqueue_head(&tty->read_wait);
INIT_WORK(&tty->hangup_work, do_tty_hangup, tty);
......
......@@ -29,8 +29,6 @@
#undef DEBUG
extern spinlock_t tty_termios_lock;
/*
* Internal flag options for termios setting behavior
*/
......@@ -101,7 +99,6 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios
int canon_change;
struct termios old_termios = *tty->termios;
struct tty_ldisc *ld;
unsigned long flags;
/*
* Perform the actual termios internal changes under lock.
......@@ -110,7 +107,7 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios
/* FIXME: we need to decide on some locking/ordering semantics
for the set_termios notification eventually */
spin_lock_irqsave(&tty_termios_lock, flags);
down(&tty->termios_sem);
*tty->termios = *new_termios;
unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
......@@ -145,13 +142,6 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios
wake_up_interruptible(&tty->link->read_wait);
}
}
/*
* Fixme! We should really try to protect the driver and ldisc
* termios usage too. But they need to be able to sleep, so
* the global termios spinlock is not the right thing.
*/
spin_unlock_irqrestore(&tty_termios_lock, flags);
if (tty->driver->set_termios)
(*tty->driver->set_termios)(tty, &old_termios);
......@@ -162,6 +152,7 @@ static void change_termios(struct tty_struct * tty, struct termios * new_termios
(ld->set_termios)(tty, &old_termios);
tty_ldisc_deref(ld);
}
up(&tty->termios_sem);
}
static int set_termios(struct tty_struct * tty, void __user *arg, int opt)
......@@ -255,15 +246,14 @@ static int get_sgflags(struct tty_struct * tty)
static int get_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
{
struct sgttyb tmp;
unsigned long flags;
spin_lock_irqsave(&tty_termios_lock, flags);
down(&tty->termios_sem);
tmp.sg_ispeed = 0;
tmp.sg_ospeed = 0;
tmp.sg_erase = tty->termios->c_cc[VERASE];
tmp.sg_kill = tty->termios->c_cc[VKILL];
tmp.sg_flags = get_sgflags(tty);
spin_unlock_irqrestore(&tty_termios_lock, flags);
up(&tty->termios_sem);
return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
}
......@@ -299,7 +289,6 @@ static int set_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
int retval;
struct sgttyb tmp;
struct termios termios;
unsigned long flags;
retval = tty_check_change(tty);
if (retval)
......@@ -307,13 +296,13 @@ static int set_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
return -EFAULT;
spin_lock_irqsave(&tty_termios_lock, flags);
down(&tty->termios_sem);
termios = *tty->termios;
termios.c_cc[VERASE] = tmp.sg_erase;
termios.c_cc[VKILL] = tmp.sg_kill;
set_sgflags(&termios, tmp.sg_flags);
spin_unlock_irqrestore(&tty_termios_lock, flags);
up(&tty->termios_sem);
change_termios(tty, &termios);
return 0;
}
......@@ -405,7 +394,6 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
void __user *p = (void __user *)arg;
int retval;
struct tty_ldisc *ld;
unsigned long flags;
if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
tty->driver->subtype == PTY_TYPE_MASTER)
......@@ -549,11 +537,11 @@ int n_tty_ioctl(struct tty_struct * tty, struct file * file,
case TIOCSSOFTCAR:
if (get_user(arg, (unsigned int __user *) arg))
return -EFAULT;
spin_lock_irqsave(&tty_termios_lock, flags);
down(&tty->termios_sem);
tty->termios->c_cflag =
((tty->termios->c_cflag & ~CLOCAL) |
(arg ? CLOCAL : 0));
spin_unlock_irqrestore(&tty_termios_lock, flags);
up(&tty->termios_sem);
return 0;
default:
return -ENOIOCTLCMD;
......
......@@ -1766,7 +1766,12 @@ void locks_remove_flock(struct file *filp)
while ((fl = *before) != NULL) {
if (fl->fl_file == filp) {
if (IS_FLOCK(fl)) {
/*
* We might have a POSIX lock that was created at the same time
* the filp was closed for the last time. Just remove that too,
* regardless of ownership, since nobody can own it.
*/
if (IS_FLOCK(fl) || IS_POSIX(fl)) {
locks_delete_lock(before);
continue;
}
......@@ -1774,9 +1779,7 @@ void locks_remove_flock(struct file *filp)
lease_modify(before, F_UNLCK);
continue;
}
/* FL_POSIX locks of this process have already been
* removed in filp_close->locks_remove_posix.
*/
/* What? */
BUG();
}
before = &fl->fl_next;
......
......@@ -21,7 +21,7 @@ ToDo/Notes:
- Enable the code for setting the NT4 compatibility flag when we start
making NTFS 1.2 specific modifications.
2.1.20-WIP
2.1.21-WIP
- Implement extent mft record deallocation
fs/ntfs/mft.c::ntfs_extent_mft_record_free().
......@@ -44,7 +44,18 @@ ToDo/Notes:
fs/ntfs/attrib.[hc]::ntfs_attr_set() and switch
fs/ntfs/logfile.c::ntfs_empty_logfile() to using it.
- Remove unnecessary casts from LCN_* constants.
- Implement fs/ntfs/runlist.c::ntfs_rl_truncate().
- Implement fs/ntfs/runlist.c::ntfs_rl_truncate_nolock().
2.1.20 - Fix two stupid bugs introduced in 2.1.18 release.
- Fix stupid bug in fs/ntfs/attrib.c::ntfs_attr_reinit_search_ctx()
where we did not clear ctx->al_entry but it was still set due to
changes in ntfs_attr_lookup() and ntfs_external_attr_find() in
particular.
- Fix another stupid bug in fs/ntfs/attrib.c::ntfs_external_attr_find()
where we forgot to unmap the extent mft record when we had finished
enumerating an attribute which caused a bug check to trigger when the
VFS calls ->clear_inode.
2.1.19 - Many cleanups, improvements, and a minor bug fix.
......
......@@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \
index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \
unistr.o upcase.o
EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.20-WIP\"
EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.21-WIP\"
ifeq ($(CONFIG_NTFS_DEBUG),y)
EXTRA_CFLAGS += -DDEBUG
......
......@@ -774,11 +774,13 @@ static int ntfs_external_attr_find(const ATTR_TYPE type,
* correctly yet as we do not know what @ctx->attr will be set to by
* the call to ntfs_attr_find() below.
*/
if (ni != base_ni)
unmap_extent_mft_record(ni);
ctx->mrec = ctx->base_mrec;
ctx->attr = (ATTR_RECORD*)((u8*)ctx->mrec +
le16_to_cpu(ctx->mrec->attrs_offset));
ctx->is_first = TRUE;
ctx->ntfs_ino = ctx->base_ntfs_ino;
ctx->ntfs_ino = base_ni;
ctx->base_ntfs_ino = NULL;
ctx->base_mrec = NULL;
ctx->base_attr = NULL;
......
......@@ -244,6 +244,7 @@ struct tty_struct {
struct tty_driver *driver;
int index;
struct tty_ldisc ldisc;
struct semaphore termios_sem;
struct termios *termios, *termios_locked;
char name[64];
int pgrp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment