From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Steve French <smfrench@gmail.com>,
Jeff Layton <jlayton@redhat.com>,
Steve French <sfrench@us.ibm.com>,
Suresh Jayaraman <sjayaraman@suse.de>
Subject: [patch 074/104] cifs: reinstate sharing of tree connections
Date: Wed, 3 Dec 2008 11:53:38 -0800 [thread overview]
Message-ID: <20081203195338.GW8950@kroah.com> (raw)
In-Reply-To: <20081203194725.GA8950@kroah.com>
[-- Attachment #1: cifs-reinstate-sharing-of-tree-connections.patch --]
[-- Type: text/plain, Size: 24400 bytes --]
2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jeff Layton <jlayton@redhat.com>
commit f1987b44f642e96176adc88b7ce23a1d74806f89 upstream
Use a similar approach to the SMB session sharing. Add a list of tcons
attached to each SMB session. Move the refcount to non-atomic. Protect
all of the above with the cifs_tcp_ses_lock. Add functions to
properly find and put references to the tcons.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Cc: Suresh Jayaraman <sjayaraman@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/cifs/cifs_debug.c | 236 +++++++++++++++++++++++++++------------------------
fs/cifs/cifsfs.c | 8 -
fs/cifs/cifsglob.h | 13 +-
fs/cifs/cifssmb.c | 43 ++-------
fs/cifs/connect.c | 94 +++++++++++++-------
fs/cifs/misc.c | 74 +++++++--------
6 files changed, 249 insertions(+), 219 deletions(-)
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -107,12 +107,13 @@ void cifs_dump_mids(struct TCP_Server_In
#ifdef CONFIG_PROC_FS
static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
{
- struct list_head *tmp, *tmp2, *tmp3;
+ struct list_head *tmp1, *tmp2, *tmp3;
struct mid_q_entry *mid_entry;
struct TCP_Server_Info *server;
struct cifsSesInfo *ses;
struct cifsTconInfo *tcon;
- int i;
+ int i, j;
+ __u32 dev_type;
seq_puts(m,
"Display Internal CIFS Data Structures for Debugging\n"
@@ -123,8 +124,8 @@ static int cifs_debug_data_proc_show(str
i = 0;
read_lock(&cifs_tcp_ses_lock);
- list_for_each(tmp, &cifs_tcp_ses_list) {
- server = list_entry(tmp, struct TCP_Server_Info,
+ list_for_each(tmp1, &cifs_tcp_ses_list) {
+ server = list_entry(tmp1, struct TCP_Server_Info,
tcp_ses_list);
i++;
list_for_each(tmp2, &server->smb_ses_list) {
@@ -133,12 +134,12 @@ static int cifs_debug_data_proc_show(str
if ((ses->serverDomain == NULL) ||
(ses->serverOS == NULL) ||
(ses->serverNOS == NULL)) {
- seq_printf(m, "\nentry for %s not fully "
- "displayed\n\t", ses->serverName);
+ seq_printf(m, "\n%d) entry for %s not fully "
+ "displayed\n\t", i, ses->serverName);
} else {
seq_printf(m,
- "\n%d) Name: %s Domain: %s Mounts: %d OS:"
- " %s \n\tNOS: %s\tCapability: 0x%x\n\tSMB"
+ "\n%d) Name: %s Domain: %s Uses: %d OS:"
+ " %s\n\tNOS: %s\tCapability: 0x%x\n\tSMB"
" session status: %d\t",
i, ses->serverName, ses->serverDomain,
ses->ses_count, ses->serverOS, ses->serverNOS,
@@ -156,14 +157,44 @@ static int cifs_debug_data_proc_show(str
atomic_read(&server->num_waiters));
#endif
- seq_puts(m, "\nMIDs:\n");
+ seq_puts(m, "\n\tShares:");
+ j = 0;
+ list_for_each(tmp3, &ses->tcon_list) {
+ tcon = list_entry(tmp3, struct cifsTconInfo,
+ tcon_list);
+ ++j;
+ dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
+ seq_printf(m, "\n\t%d) %s Mounts: %d ", j,
+ tcon->treeName, tcon->tc_count);
+ if (tcon->nativeFileSystem) {
+ seq_printf(m, "Type: %s ",
+ tcon->nativeFileSystem);
+ }
+ seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x"
+ "\nPathComponentMax: %d Status: 0x%d",
+ le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
+ le32_to_cpu(tcon->fsAttrInfo.Attributes),
+ le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
+ tcon->tidStatus);
+ if (dev_type == FILE_DEVICE_DISK)
+ seq_puts(m, " type: DISK ");
+ else if (dev_type == FILE_DEVICE_CD_ROM)
+ seq_puts(m, " type: CDROM ");
+ else
+ seq_printf(m, " type: %d ", dev_type);
+
+ if (tcon->need_reconnect)
+ seq_puts(m, "\tDISCONNECTED ");
+ seq_putc(m, '\n');
+ }
+
+ seq_puts(m, "\n\tMIDs:\n");
spin_lock(&GlobalMid_Lock);
list_for_each(tmp3, &server->pending_mid_q) {
- mid_entry = list_entry(tmp3, struct
- mid_q_entry,
+ mid_entry = list_entry(tmp3, struct mid_q_entry,
qhead);
- seq_printf(m, "State: %d com: %d pid:"
+ seq_printf(m, "\tState: %d com: %d pid:"
" %d tsk: %p mid %d\n",
mid_entry->midState,
(int)mid_entry->command,
@@ -177,41 +208,6 @@ static int cifs_debug_data_proc_show(str
read_unlock(&cifs_tcp_ses_lock);
seq_putc(m, '\n');
- seq_puts(m, "Shares:");
-
- i = 0;
- read_lock(&GlobalSMBSeslock);
- list_for_each(tmp, &GlobalTreeConnectionList) {
- __u32 dev_type;
- i++;
- tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
- dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
- seq_printf(m, "\n%d) %s Uses: %d ", i,
- tcon->treeName, atomic_read(&tcon->useCount));
- if (tcon->nativeFileSystem) {
- seq_printf(m, "Type: %s ",
- tcon->nativeFileSystem);
- }
- seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x"
- "\nPathComponentMax: %d Status: %d",
- le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
- le32_to_cpu(tcon->fsAttrInfo.Attributes),
- le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
- tcon->tidStatus);
- if (dev_type == FILE_DEVICE_DISK)
- seq_puts(m, " type: DISK ");
- else if (dev_type == FILE_DEVICE_CD_ROM)
- seq_puts(m, " type: CDROM ");
- else
- seq_printf(m, " type: %d ", dev_type);
-
- if (tcon->need_reconnect)
- seq_puts(m, "\tDISCONNECTED ");
- }
- read_unlock(&GlobalSMBSeslock);
-
- seq_putc(m, '\n');
-
/* BB add code to dump additional info such as TCP session info now */
return 0;
}
@@ -235,7 +231,9 @@ static ssize_t cifs_stats_proc_write(str
{
char c;
int rc;
- struct list_head *tmp;
+ struct list_head *tmp1, *tmp2, *tmp3;
+ struct TCP_Server_Info *server;
+ struct cifsSesInfo *ses;
struct cifsTconInfo *tcon;
rc = get_user(c, buffer);
@@ -243,33 +241,42 @@ static ssize_t cifs_stats_proc_write(str
return rc;
if (c == '1' || c == 'y' || c == 'Y' || c == '0') {
- read_lock(&GlobalSMBSeslock);
#ifdef CONFIG_CIFS_STATS2
atomic_set(&totBufAllocCount, 0);
atomic_set(&totSmBufAllocCount, 0);
#endif /* CONFIG_CIFS_STATS2 */
- list_for_each(tmp, &GlobalTreeConnectionList) {
- tcon = list_entry(tmp, struct cifsTconInfo,
- cifsConnectionList);
- atomic_set(&tcon->num_smbs_sent, 0);
- atomic_set(&tcon->num_writes, 0);
- atomic_set(&tcon->num_reads, 0);
- atomic_set(&tcon->num_oplock_brks, 0);
- atomic_set(&tcon->num_opens, 0);
- atomic_set(&tcon->num_closes, 0);
- atomic_set(&tcon->num_deletes, 0);
- atomic_set(&tcon->num_mkdirs, 0);
- atomic_set(&tcon->num_rmdirs, 0);
- atomic_set(&tcon->num_renames, 0);
- atomic_set(&tcon->num_t2renames, 0);
- atomic_set(&tcon->num_ffirst, 0);
- atomic_set(&tcon->num_fnext, 0);
- atomic_set(&tcon->num_fclose, 0);
- atomic_set(&tcon->num_hardlinks, 0);
- atomic_set(&tcon->num_symlinks, 0);
- atomic_set(&tcon->num_locks, 0);
+ read_lock(&cifs_tcp_ses_lock);
+ list_for_each(tmp1, &cifs_tcp_ses_list) {
+ server = list_entry(tmp1, struct TCP_Server_Info,
+ tcp_ses_list);
+ list_for_each(tmp2, &server->smb_session_list) {
+ ses = list_entry(tmp2, struct cifsSesInfo,
+ smb_session_list);
+ list_for_each(tmp3, &ses->tcon_list) {
+ tcon = list_entry(tmp3,
+ struct cifsTconInfo,
+ tcon_list);
+ atomic_set(&tcon->num_smbs_sent, 0);
+ atomic_set(&tcon->num_writes, 0);
+ atomic_set(&tcon->num_reads, 0);
+ atomic_set(&tcon->num_oplock_brks, 0);
+ atomic_set(&tcon->num_opens, 0);
+ atomic_set(&tcon->num_closes, 0);
+ atomic_set(&tcon->num_deletes, 0);
+ atomic_set(&tcon->num_mkdirs, 0);
+ atomic_set(&tcon->num_rmdirs, 0);
+ atomic_set(&tcon->num_renames, 0);
+ atomic_set(&tcon->num_t2renames, 0);
+ atomic_set(&tcon->num_ffirst, 0);
+ atomic_set(&tcon->num_fnext, 0);
+ atomic_set(&tcon->num_fclose, 0);
+ atomic_set(&tcon->num_hardlinks, 0);
+ atomic_set(&tcon->num_symlinks, 0);
+ atomic_set(&tcon->num_locks, 0);
+ }
+ }
}
- read_unlock(&GlobalSMBSeslock);
+ read_unlock(&cifs_tcp_ses_lock);
}
return count;
@@ -278,7 +285,9 @@ static ssize_t cifs_stats_proc_write(str
static int cifs_stats_proc_show(struct seq_file *m, void *v)
{
int i;
- struct list_head *tmp;
+ struct list_head *tmp1, *tmp2, *tmp3;
+ struct TCP_Server_Info *server;
+ struct cifsSesInfo *ses;
struct cifsTconInfo *tcon;
seq_printf(m,
@@ -307,44 +316,55 @@ static int cifs_stats_proc_show(struct s
GlobalCurrentXid, GlobalMaxActiveXid);
i = 0;
- read_lock(&GlobalSMBSeslock);
- list_for_each(tmp, &GlobalTreeConnectionList) {
- i++;
- tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
- seq_printf(m, "\n%d) %s", i, tcon->treeName);
- if (tcon->need_reconnect)
- seq_puts(m, "\tDISCONNECTED ");
- seq_printf(m, "\nSMBs: %d Oplock Breaks: %d",
- atomic_read(&tcon->num_smbs_sent),
- atomic_read(&tcon->num_oplock_brks));
- seq_printf(m, "\nReads: %d Bytes: %lld",
- atomic_read(&tcon->num_reads),
- (long long)(tcon->bytes_read));
- seq_printf(m, "\nWrites: %d Bytes: %lld",
- atomic_read(&tcon->num_writes),
- (long long)(tcon->bytes_written));
- seq_printf(m,
- "\nLocks: %d HardLinks: %d Symlinks: %d",
- atomic_read(&tcon->num_locks),
- atomic_read(&tcon->num_hardlinks),
- atomic_read(&tcon->num_symlinks));
-
- seq_printf(m, "\nOpens: %d Closes: %d Deletes: %d",
- atomic_read(&tcon->num_opens),
- atomic_read(&tcon->num_closes),
- atomic_read(&tcon->num_deletes));
- seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
- atomic_read(&tcon->num_mkdirs),
- atomic_read(&tcon->num_rmdirs));
- seq_printf(m, "\nRenames: %d T2 Renames %d",
- atomic_read(&tcon->num_renames),
- atomic_read(&tcon->num_t2renames));
- seq_printf(m, "\nFindFirst: %d FNext %d FClose %d",
- atomic_read(&tcon->num_ffirst),
- atomic_read(&tcon->num_fnext),
- atomic_read(&tcon->num_fclose));
+ read_lock(&cifs_tcp_ses_lock);
+ list_for_each(tmp1, &cifs_tcp_ses_list) {
+ server = list_entry(tmp1, struct TCP_Server_Info,
+ tcp_ses_list);
+ list_for_each(tmp2, &server->smb_ses_list) {
+ ses = list_entry(tmp2, struct cifsSesInfo,
+ smb_ses_list);
+ list_for_each(tmp3, &ses->tcon_list) {
+ tcon = list_entry(tmp3,
+ struct cifsTconInfo,
+ tcon_list);
+ i++;
+ seq_printf(m, "\n%d) %s", i, tcon->treeName);
+ if (tcon->need_reconnect)
+ seq_puts(m, "\tDISCONNECTED ");
+ seq_printf(m, "\nSMBs: %d Oplock Breaks: %d",
+ atomic_read(&tcon->num_smbs_sent),
+ atomic_read(&tcon->num_oplock_brks));
+ seq_printf(m, "\nReads: %d Bytes: %lld",
+ atomic_read(&tcon->num_reads),
+ (long long)(tcon->bytes_read));
+ seq_printf(m, "\nWrites: %d Bytes: %lld",
+ atomic_read(&tcon->num_writes),
+ (long long)(tcon->bytes_written));
+ seq_printf(m, "\nLocks: %d HardLinks: %d "
+ "Symlinks: %d",
+ atomic_read(&tcon->num_locks),
+ atomic_read(&tcon->num_hardlinks),
+ atomic_read(&tcon->num_symlinks));
+ seq_printf(m, "\nOpens: %d Closes: %d"
+ "Deletes: %d",
+ atomic_read(&tcon->num_opens),
+ atomic_read(&tcon->num_closes),
+ atomic_read(&tcon->num_deletes));
+ seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
+ atomic_read(&tcon->num_mkdirs),
+ atomic_read(&tcon->num_rmdirs));
+ seq_printf(m, "\nRenames: %d T2 Renames %d",
+ atomic_read(&tcon->num_renames),
+ atomic_read(&tcon->num_t2renames));
+ seq_printf(m, "\nFindFirst: %d FNext %d "
+ "FClose %d",
+ atomic_read(&tcon->num_ffirst),
+ atomic_read(&tcon->num_fnext),
+ atomic_read(&tcon->num_fclose));
+ }
+ }
}
- read_unlock(&GlobalSMBSeslock);
+ read_unlock(&cifs_tcp_ses_lock);
seq_putc(m, '\n');
return 0;
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -510,10 +510,11 @@ static void cifs_umount_begin(struct sup
tcon = cifs_sb->tcon;
if (tcon == NULL)
return;
- down(&tcon->tconSem);
- if (atomic_read(&tcon->useCount) == 1)
+
+ read_lock(&cifs_tcp_ses_lock);
+ if (tcon->tc_count == 1)
tcon->tidStatus = CifsExiting;
- up(&tcon->tconSem);
+ read_unlock(&cifs_tcp_ses_lock);
/* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
/* cancel_notify_requests(tcon); */
@@ -1014,7 +1015,6 @@ init_cifs(void)
int rc = 0;
cifs_proc_init();
INIT_LIST_HEAD(&cifs_tcp_ses_list);
- INIT_LIST_HEAD(&GlobalTreeConnectionList); /* BB to be removed by jl */
INIT_LIST_HEAD(&GlobalOplock_Q);
#ifdef CONFIG_CIFS_EXPERIMENTAL
INIT_LIST_HEAD(&GlobalDnotifyReqList);
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -233,16 +233,15 @@ struct cifsSesInfo {
* session
*/
struct cifsTconInfo {
- struct list_head cifsConnectionList;
+ struct list_head tcon_list;
+ int tc_count;
struct list_head openFileList;
- struct semaphore tconSem;
struct cifsSesInfo *ses; /* pointer to session associated with */
char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
char *nativeFileSystem;
__u16 tid; /* The 2 byte tree id */
__u16 Flags; /* optional support bits */
enum statusEnum tidStatus;
- atomic_t useCount; /* how many explicit/implicit mounts to share */
#ifdef CONFIG_CIFS_STATS
atomic_t num_smbs_sent;
atomic_t num_writes;
@@ -598,9 +597,13 @@ require use of the stronger protocol */
*/
GLOBAL_EXTERN struct list_head cifs_tcp_ses_list;
-/* protects cifs_tcp_ses_list and srv_count for each tcp session */
+/*
+ * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
+ * tcp session, and the list of tcon's per smb session. It also protects
+ * the reference counters for the server, smb session, and tcon. Finally,
+ * changes to the tcon->tidStatus should be done while holding this lock.
+ */
GLOBAL_EXTERN rwlock_t cifs_tcp_ses_lock;
-GLOBAL_EXTERN struct list_head GlobalTreeConnectionList; /* BB to be removed */
GLOBAL_EXTERN rwlock_t GlobalSMBSeslock; /* protects list inserts on 3 above */
GLOBAL_EXTERN struct list_head GlobalOplock_Q;
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -742,50 +742,31 @@ CIFSSMBTDis(const int xid, struct cifsTc
int rc = 0;
cFYI(1, ("In tree disconnect"));
- /*
- * If last user of the connection and
- * connection alive - disconnect it
- * If this is the last connection on the server session disconnect it
- * (and inside session disconnect we should check if tcp socket needs
- * to be freed and kernel thread woken up).
- */
- if (tcon)
- down(&tcon->tconSem);
- else
- return -EIO;
- atomic_dec(&tcon->useCount);
- if (atomic_read(&tcon->useCount) > 0) {
- up(&tcon->tconSem);
- return -EBUSY;
- }
+ /* BB: do we need to check this? These should never be NULL. */
+ if ((tcon->ses == NULL) || (tcon->ses->server == NULL))
+ return -EIO;
- /* No need to return error on this operation if tid invalidated and
- closed on server already e.g. due to tcp session crashing */
- if (tcon->need_reconnect) {
- up(&tcon->tconSem);
+ /*
+ * No need to return error on this operation if tid invalidated and
+ * closed on server already e.g. due to tcp session crashing. Also,
+ * the tcon is no longer on the list, so no need to take lock before
+ * checking this.
+ */
+ if (tcon->need_reconnect)
return 0;
- }
- if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) {
- up(&tcon->tconSem);
- return -EIO;
- }
rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon,
(void **)&smb_buffer);
- if (rc) {
- up(&tcon->tconSem);
+ if (rc)
return rc;
- }
rc = SendReceiveNoRsp(xid, tcon->ses, smb_buffer, 0);
if (rc)
cFYI(1, ("Tree disconnect failed %d", rc));
- up(&tcon->tconSem);
-
/* No need to return error on this operation if tid invalidated and
- closed on server already e.g. due to tcp session crashing */
+ closed on server already e.g. due to tcp session crashing */
if (rc == -EAGAIN)
rc = 0;
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -122,7 +122,7 @@ static int
cifs_reconnect(struct TCP_Server_Info *server)
{
int rc = 0;
- struct list_head *tmp;
+ struct list_head *tmp, *tmp2;
struct cifsSesInfo *ses;
struct cifsTconInfo *tcon;
struct mid_q_entry *mid_entry;
@@ -147,13 +147,12 @@ cifs_reconnect(struct TCP_Server_Info *s
ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
ses->need_reconnect = true;
ses->ipc_tid = 0;
- }
- read_unlock(&cifs_tcp_ses_lock);
- list_for_each(tmp, &GlobalTreeConnectionList) {
- tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
- if ((tcon->ses) && (tcon->ses->server == server))
+ list_for_each(tmp2, &ses->tcon_list) {
+ tcon = list_entry(tmp2, struct cifsTconInfo, tcon_list);
tcon->need_reconnect = true;
+ }
}
+ read_unlock(&cifs_tcp_ses_lock);
/* do not want to be sending data on a socket we are freeing */
down(&server->tcpSem);
if (server->ssocket) {
@@ -1451,6 +1450,52 @@ cifs_put_smb_ses(struct cifsSesInfo *ses
cifs_put_tcp_session(server);
}
+static struct cifsTconInfo *
+cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
+{
+ struct list_head *tmp;
+ struct cifsTconInfo *tcon;
+
+ write_lock(&cifs_tcp_ses_lock);
+ list_for_each(tmp, &ses->tcon_list) {
+ tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
+ if (tcon->tidStatus == CifsExiting)
+ continue;
+ if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
+ continue;
+
+ ++tcon->tc_count;
+ write_unlock(&cifs_tcp_ses_lock);
+ return tcon;
+ }
+ write_unlock(&cifs_tcp_ses_lock);
+ return NULL;
+}
+
+static void
+cifs_put_tcon(struct cifsTconInfo *tcon)
+{
+ int xid;
+ struct cifsSesInfo *ses = tcon->ses;
+
+ write_lock(&cifs_tcp_ses_lock);
+ if (--tcon->tc_count > 0) {
+ write_unlock(&cifs_tcp_ses_lock);
+ return;
+ }
+
+ list_del_init(&tcon->tcon_list);
+ write_unlock(&cifs_tcp_ses_lock);
+
+ xid = GetXid();
+ CIFSSMBTDis(xid, tcon);
+ _FreeXid(xid);
+
+ DeleteTconOplockQEntries(tcon);
+ tconInfoFree(tcon);
+ cifs_put_smb_ses(ses);
+}
+
int
get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
@@ -2206,11 +2251,11 @@ cifs_mount(struct super_block *sb, struc
/* search for existing tcon to this server share */
if (!rc) {
setup_cifs_sb(&volume_info, cifs_sb);
+ tcon = cifs_find_tcon(pSesInfo, volume_info.UNC);
if (tcon) {
cFYI(1, ("Found match on UNC path"));
- if (tcon->seal != volume_info.seal)
- cERROR(1, ("transport encryption setting "
- "conflicts with existing tid"));
+ /* existing tcon already has a reference */
+ cifs_put_smb_ses(pSesInfo);
} else {
tcon = tconInfoAlloc();
if (tcon == NULL) {
@@ -2238,6 +2283,10 @@ cifs_mount(struct super_block *sb, struc
if (rc)
goto mount_fail_check;
tcon->seal = volume_info.seal;
+ tcon->ses = pSesInfo;
+ write_lock(&cifs_tcp_ses_lock);
+ list_add(&tcon->tcon_list, &pSesInfo->tcon_list);
+ write_unlock(&cifs_tcp_ses_lock);
}
/* we can have only one retry value for a connection
@@ -2263,18 +2312,14 @@ mount_fail_check:
/* If find_unc succeeded then rc == 0 so we can not end */
/* up accidently freeing someone elses tcon struct */
if (tcon)
- tconInfoFree(tcon);
-
- /* should also end up putting our tcp session ref if needed */
- if (pSesInfo)
+ cifs_put_tcon(tcon);
+ else if (pSesInfo)
cifs_put_smb_ses(pSesInfo);
else
cifs_put_tcp_session(srvTcp);
goto out;
}
- atomic_inc(&tcon->useCount);
cifs_sb->tcon = tcon;
- tcon->ses = pSesInfo;
/* do not care if following two calls succeed - informational */
if (!tcon->ipc) {
@@ -3545,24 +3590,10 @@ int
cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
{
int rc = 0;
- int xid;
- struct cifsSesInfo *ses = NULL;
- struct task_struct *cifsd_task;
char *tmp;
- xid = GetXid();
-
- if (cifs_sb->tcon) {
- ses = cifs_sb->tcon->ses; /* save ptr to ses before delete tcon!*/
- rc = CIFSSMBTDis(xid, cifs_sb->tcon);
- if (rc == -EBUSY) {
- FreeXid(xid);
- return 0;
- }
- DeleteTconOplockQEntries(cifs_sb->tcon);
- tconInfoFree(cifs_sb->tcon);
- cifs_put_smb_ses(ses);
- }
+ if (cifs_sb->tcon)
+ cifs_put_tcon(cifs_sb->tcon);
cifs_sb->tcon = NULL;
tmp = cifs_sb->prepath;
@@ -3570,7 +3601,6 @@ cifs_umount(struct super_block *sb, stru
cifs_sb->prepath = NULL;
kfree(tmp);
- FreeXid(xid);
return rc;
}
--- a/fs/cifs/misc.c
+++ b/fs/cifs/misc.c
@@ -79,6 +79,7 @@ sesInfoAlloc(void)
ret_buf->status = CifsNew;
++ret_buf->ses_count;
INIT_LIST_HEAD(&ret_buf->smb_ses_list);
+ INIT_LIST_HEAD(&ret_buf->tcon_list);
init_MUTEX(&ret_buf->sesSem);
}
return ret_buf;
@@ -107,17 +108,14 @@ tconInfoAlloc(void)
struct cifsTconInfo *ret_buf;
ret_buf = kzalloc(sizeof(struct cifsTconInfo), GFP_KERNEL);
if (ret_buf) {
- write_lock(&GlobalSMBSeslock);
atomic_inc(&tconInfoAllocCount);
- list_add(&ret_buf->cifsConnectionList,
- &GlobalTreeConnectionList);
ret_buf->tidStatus = CifsNew;
+ ++ret_buf->tc_count;
INIT_LIST_HEAD(&ret_buf->openFileList);
- init_MUTEX(&ret_buf->tconSem);
+ INIT_LIST_HEAD(&ret_buf->tcon_list);
#ifdef CONFIG_CIFS_STATS
spin_lock_init(&ret_buf->stat_lock);
#endif
- write_unlock(&GlobalSMBSeslock);
}
return ret_buf;
}
@@ -129,10 +127,7 @@ tconInfoFree(struct cifsTconInfo *buf_to
cFYI(1, ("Null buffer passed to tconInfoFree"));
return;
}
- write_lock(&GlobalSMBSeslock);
atomic_dec(&tconInfoAllocCount);
- list_del(&buf_to_free->cifsConnectionList);
- write_unlock(&GlobalSMBSeslock);
kfree(buf_to_free->nativeFileSystem);
kfree(buf_to_free);
}
@@ -497,9 +492,10 @@ bool
is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
{
struct smb_com_lock_req *pSMB = (struct smb_com_lock_req *)buf;
- struct list_head *tmp;
- struct list_head *tmp1;
+ struct list_head *tmp, *tmp1, *tmp2;
+ struct cifsSesInfo *ses;
struct cifsTconInfo *tcon;
+ struct cifsInodeInfo *pCifsInode;
struct cifsFileInfo *netfile;
cFYI(1, ("Checking for oplock break or dnotify response"));
@@ -554,42 +550,42 @@ is_valid_oplock_break(struct smb_hdr *bu
return false;
/* look up tcon based on tid & uid */
- read_lock(&GlobalSMBSeslock);
- list_for_each(tmp, &GlobalTreeConnectionList) {
- tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
- if ((tcon->tid == buf->Tid) && (srv == tcon->ses->server)) {
+ read_lock(&cifs_tcp_ses_lock);
+ list_for_each(tmp, &srv->smb_ses_list) {
+ ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
+ list_for_each(tmp1, &ses->tcon_list) {
+ tcon = list_entry(tmp1, struct cifsTconInfo, tcon_list);
+ if (tcon->tid != buf->Tid)
+ continue;
+
cifs_stats_inc(&tcon->num_oplock_brks);
- list_for_each(tmp1, &tcon->openFileList) {
- netfile = list_entry(tmp1, struct cifsFileInfo,
+ list_for_each(tmp2, &tcon->openFileList) {
+ netfile = list_entry(tmp2, struct cifsFileInfo,
tlist);
- if (pSMB->Fid == netfile->netfid) {
- struct cifsInodeInfo *pCifsInode;
- read_unlock(&GlobalSMBSeslock);
- cFYI(1,
- ("file id match, oplock break"));
- pCifsInode =
- CIFS_I(netfile->pInode);
- pCifsInode->clientCanCacheAll = false;
- if (pSMB->OplockLevel == 0)
- pCifsInode->clientCanCacheRead
- = false;
- pCifsInode->oplockPending = true;
- AllocOplockQEntry(netfile->pInode,
- netfile->netfid,
- tcon);
- cFYI(1,
- ("about to wake up oplock thread"));
- if (oplockThread)
- wake_up_process(oplockThread);
- return true;
- }
+ if (pSMB->Fid != netfile->netfid)
+ continue;
+
+ read_unlock(&cifs_tcp_ses_lock);
+ cFYI(1, ("file id match, oplock break"));
+ pCifsInode = CIFS_I(netfile->pInode);
+ pCifsInode->clientCanCacheAll = false;
+ if (pSMB->OplockLevel == 0)
+ pCifsInode->clientCanCacheRead = false;
+ pCifsInode->oplockPending = true;
+ AllocOplockQEntry(netfile->pInode,
+ netfile->netfid, tcon);
+ cFYI(1, ("about to wake up oplock thread"));
+ if (oplockThread)
+ wake_up_process(oplockThread);
+
+ return true;
}
- read_unlock(&GlobalSMBSeslock);
+ read_unlock(&cifs_tcp_ses_lock);
cFYI(1, ("No matching file for oplock break"));
return true;
}
}
- read_unlock(&GlobalSMBSeslock);
+ read_unlock(&cifs_tcp_ses_lock);
cFYI(1, ("Can not process oplock break for non-existent connection"));
return true;
}
next prev parent reply other threads:[~2008-12-03 20:19 UTC|newest]
Thread overview: 190+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081203193901.715896543@mini.kroah.org>
2008-12-03 19:47 ` [patch 000/104] 2.6.27-stable review Greg KH
2008-12-03 19:48 ` [patch 001/104] USB: gadget rndis: send notifications Greg KH
2008-12-03 19:48 ` [patch 002/104] USB: gadget rndis: stop windows self-immolation Greg KH
2008-12-03 19:48 ` [patch 003/104] USB: usbmon: fix read(2) Greg KH
2008-12-03 19:48 ` [patch 004/104] USB: fix SB700 usb subsystem hang bug Greg KH
2008-12-03 19:48 ` [patch 005/104] USB: fix SB600 USB " Greg KH
2008-12-03 19:48 ` [patch 006/104] atl1e: fix broken multicast by removing unnecessary crc inversion Greg KH
2008-12-03 19:48 ` [patch 007/104] cpuset: fix regression when failed to generate sched domains Greg KH
2008-12-03 19:48 ` [patch 008/104] cgroups: fix a serious bug in cgroupstats Greg KH
2008-12-03 19:48 ` [patch 009/104] eCryptfs: Allocate up to two scatterlists for crypto ops on keys Greg KH
2008-12-03 19:48 ` [patch 010/104] pxa2xx_spi: bugfix full duplex dma data corruption Greg KH
2008-12-03 19:48 ` [patch 011/104] fbdev: clean the penguins dirty feet Greg KH
2008-12-05 12:58 ` Pavel Machek
2008-12-05 19:29 ` Henrique de Moraes Holschuh
2008-12-06 0:26 ` Greg KH
2008-12-06 2:44 ` Andrew Morton
2008-12-03 19:48 ` [patch 012/104] gpiolib: extend gpio label column width in debugfs file Greg KH
2008-12-03 19:48 ` [patch 013/104] lib/scatterlist.c: fix kunmap() argument in sg_miter_stop() Greg KH
2008-12-03 19:48 ` [patch 014/104] sysvipc: fix the ipc structures initialization Greg KH
2008-12-03 19:48 ` [patch 015/104] parisc: fix kernel crash when unwinding a userspace process Greg KH
2008-12-03 19:48 ` [patch 016/104] epoll: introduce resource usage limits Greg KH
2009-01-23 4:51 ` Bron Gondwana
2009-01-23 5:16 ` Greg KH
2009-01-23 9:47 ` Bron Gondwana
2009-01-23 17:06 ` Greg KH
2009-01-23 17:24 ` Bastien ROUCARIES
2009-01-23 19:36 ` Davide Libenzi
2009-01-24 3:50 ` Bron Gondwana
2009-01-24 8:36 ` Vegard Nossum
2009-01-24 13:03 ` Bron Gondwana
2009-01-25 11:01 ` Bron Gondwana
2009-01-25 12:20 ` Bron Gondwana
2009-01-28 0:35 ` Greg KH
2009-01-28 3:38 ` Bron Gondwana
2009-01-28 3:46 ` Davide Libenzi
2009-01-28 3:57 ` Bron Gondwana
2009-01-28 4:10 ` Davide Libenzi
2009-01-28 5:26 ` Greg KH
2009-01-28 5:36 ` Willy Tarreau
2009-01-28 5:48 ` Davide Libenzi
2009-01-28 6:20 ` Willy Tarreau
2009-01-28 6:36 ` Davide Libenzi
2009-01-28 6:59 ` Willy Tarreau
2009-01-28 6:38 ` Davide Libenzi
2009-01-28 6:52 ` Bron Gondwana
2009-01-28 7:34 ` Davide Libenzi
2009-01-28 10:45 ` Bron Gondwana
2009-01-28 6:57 ` Davide Libenzi
2009-01-28 9:24 ` Bron Gondwana
2009-01-28 16:56 ` Davide Libenzi
2009-01-28 21:46 ` Chris Adams
2009-01-28 23:54 ` Davide Libenzi
2009-01-28 3:47 ` [PATCH 1/3] epoll: increase default max_user_instances to 1024 Bron Gondwana
2009-01-28 4:00 ` Davide Libenzi
2009-01-28 4:07 ` Ray Lee
2009-01-28 4:14 ` Davide Libenzi
2009-01-28 4:55 ` Bron Gondwana
2009-01-28 5:30 ` Davide Libenzi
2009-01-28 5:38 ` Bron Gondwana
2009-01-28 10:16 ` Alan Cox
2009-01-28 10:59 ` Bron Gondwana
2009-01-28 11:36 ` Alan Cox
2009-01-28 13:28 ` Bron Gondwana
2009-01-28 4:39 ` Bron Gondwana
2009-01-28 5:32 ` Bron Gondwana
2009-01-28 11:08 ` Vegard Nossum
2009-01-28 16:52 ` Davide Libenzi
2009-01-28 20:51 ` Bron Gondwana
2009-01-28 23:51 ` Davide Libenzi
2009-01-29 0:28 ` Bron Gondwana
2009-01-28 3:47 ` [PATCH 2/3] epoll: allow 0 for "unlimited" on epoll limits Bron Gondwana
2009-01-28 3:47 ` [PATCH 3/3] epoll: add /proc/sys/fs/epoll/limits interface Bron Gondwana
2009-01-25 12:03 ` [patch 016/104] epoll: introduce resource usage limits Bron Gondwana
2009-01-23 19:28 ` Davide Libenzi
2008-12-03 19:48 ` [patch 017/104] Fix inotify watch removal/umount races Greg KH
2008-12-03 19:48 ` [patch 018/104] IA64: fix boot panic caused by offline CPUs Greg KH
2008-12-03 19:49 ` [patch 019/104] V4L/DVB (9352): Add some missing compat32 ioctls Greg KH
2008-12-03 19:49 ` [patch 020/104] Input: atkbd - add keymap quirk for Inventec Symphony systems Greg KH
2008-12-03 19:49 ` [patch 021/104] lib/idr.c: fix rcu related race with idr_find Greg KH
2008-12-09 21:40 ` Dave Airlie
2008-12-09 22:47 ` Linus Torvalds
2008-12-10 0:43 ` Dave Airlie
2008-12-10 1:46 ` Dave Airlie
2008-12-10 2:02 ` Andrew Morton
2008-12-10 2:08 ` Dave Airlie
2008-12-10 2:32 ` Andrew Morton
2008-12-10 17:33 ` Manfred Spraul
2008-12-03 19:49 ` [patch 022/104] parport_serial: fix array overflow Greg KH
2008-12-03 19:49 ` [patch 023/104] x86: more general identifier for Phoenix BIOS Greg KH
2008-12-03 19:49 ` [patch 024/104] x86: always define DECLARE_PCI_UNMAP* macros Greg KH
2008-12-03 19:49 ` [patch 025/104] ath9k: Fix SW-IOMMU bounce buffer starvation Greg KH
2008-12-03 19:50 ` [patch 026/104] ath9k: correct expected max RX buffer size Greg KH
2008-12-03 19:50 ` [patch 027/104] axnet_cs / pcnet_cs: moving PCMCIA_DEVICE_PROD_ID for Netgear FA411 Greg KH
2008-12-03 22:06 ` Cord Walter
2008-12-03 19:50 ` [patch 028/104] PCI Hotplug core: add name param pci_hp_register interface Greg KH
2008-12-03 19:50 ` [patch 029/104] PCI: update pci_create_slot() to take a hotplug param Greg KH
2008-12-03 19:50 ` [patch 030/104] PCI Hotplug: serialize pci_hp_register and pci_hp_deregister Greg KH
2008-12-03 19:50 ` [patch 031/104] PCI: prevent duplicate slot names Greg KH
2008-12-04 22:10 ` Alex Chiang
2008-12-05 18:27 ` [stable] " Greg KH
2008-12-09 22:41 ` Jesse Barnes
2008-12-03 19:50 ` [patch 032/104] PCI, PCI Hotplug: introduce slot_name helpers Greg KH
2008-12-03 19:50 ` [patch 033/104] PCI: acpiphp: remove name parameter Greg KH
2008-12-03 19:50 ` [patch 034/104] PCI: cpci_hotplug: stop managing hotplug_slot->name Greg KH
2008-12-03 22:15 ` Scott Murray
2008-12-03 19:50 ` [patch 035/104] PCI: cpqphp: " Greg KH
2008-12-03 19:51 ` [patch 036/104] PCI: fakephp: remove name parameter Greg KH
2008-12-03 19:51 ` [patch 037/104] PCI: ibmphp: stop managing hotplug_slot->name Greg KH
2008-12-03 19:51 ` [patch 038/104] PCI: pciehp: remove name parameter Greg KH
2008-12-03 19:51 ` [patch 039/104] PCI: rpaphp: kmalloc/kfree slot->name directly Greg KH
2008-12-03 19:51 ` [patch 040/104] PCI: SGI Hotplug: stop managing bss_hotplug_slot->name Greg KH
2008-12-03 19:51 ` [patch 041/104] PCI: shcphp: remove name parameter Greg KH
2008-12-03 19:51 ` [patch 042/104] PCI: Hotplug core: remove name Greg KH
2008-12-03 19:51 ` [patch 043/104] CPUFREQ: powernow-k8: ignore out-of-range PstateStatus value Greg KH
2008-12-03 19:51 ` [patch 044/104] xen: do not reserve 2 pages of padding between hypervisor and fixmap Greg KH
2008-12-03 19:51 ` [patch 045/104] x86: Hibernate: Fix breakage on x86_32 with CONFIG_NUMA set Greg KH
2008-12-03 19:51 ` [patch 046/104] x86: SB600: skip ACPI IRQ0 override if it is not routed to INT2 of IOAPIC Greg KH
2008-12-03 19:51 ` [patch 047/104] libata: Avoid overflow in libata when tf->hba_lbal > 127 Greg KH
2008-12-03 19:51 ` [patch 048/104] x86: call dmi-quirks for HP Laptops after early-quirks are executed Greg KH
2008-12-03 19:51 ` [patch 049/104] igb: Use device_set_wakeup_enable Greg KH
2008-12-03 19:51 ` [patch 050/104] e1000: " Greg KH
2008-12-03 19:52 ` [patch 051/104] e1000e: " Greg KH
2008-12-03 19:52 ` [patch 052/104] libata: blacklist Seagate drives which time out FLUSH_CACHE when used with NCQ Greg KH
2008-12-03 19:52 ` [patch 053/104] rtl8187: add device ID 0bda:8198 Greg KH
2008-12-03 19:52 ` [patch 054/104] rtl8187: Add USB ID for Belkin F5D7050 with RTL8187B chip Greg KH
2008-12-03 19:52 ` [patch 055/104] cifs: Reduce number of socket retries in large write path Greg KH
2008-12-03 19:52 ` [patch 056/104] cifs: Fix error in smb_send2 Greg KH
2008-12-03 19:52 ` [patch 057/104] powerpc/spufs: Fix spinning in spufs_ps_fault on signal Greg KH
2008-12-03 19:52 ` [patch 058/104] powerpc/spufs: add a missing mutex_unlock Greg KH
2008-12-03 19:52 ` [patch 059/104] WATCHDOG: hpwdt: set the mapped BIOS address space as executable Greg KH
2008-12-03 19:52 ` [patch 060/104] WATCHDOG: hpwdt: Fix kdump when using hpwdt Greg KH
2008-12-03 19:52 ` [patch 061/104] Remove -mno-spe flags as they dont belong Greg KH
2008-12-03 19:53 ` [patch 062/104] ACPI: EC: count interrupts only if called from interrupt handler Greg KH
2008-12-05 13:06 ` Pavel Machek
2008-12-06 0:26 ` Greg KH
2008-12-03 19:53 ` [patch 063/104] ieee1394: sbp2: another iPod mini quirk entry Greg KH
2008-12-03 19:53 ` [patch 064/104] firewire: fw-sbp2: " Greg KH
2008-12-03 19:53 ` [patch 065/104] IB/mlx4: Fix MTT leakage in resize CQ Greg KH
2008-12-03 19:53 ` [patch 066/104] net: Fix soft lockups/OOM issues w/ unix garbage collector (CVE-2008-5300) Greg KH
2008-12-03 19:53 ` [patch 067/104] libata: improve phantom device detection Greg KH
2008-12-04 4:20 ` Tejun Heo
2008-12-05 18:36 ` [stable] " Greg KH
2008-12-06 5:24 ` Tejun Heo
2008-12-03 19:53 ` [patch 068/104] cifs: Fix cifs reconnection flags Greg KH
2008-12-03 19:53 ` [patch 069/104] cifs: remove unused list, add new cifs sock list to prepare for mount/umount fix Greg KH
2008-12-03 19:53 ` [patch 070/104] cifs: clean up server protocol handling Greg KH
2008-12-03 19:53 ` [patch 071/104] cifs: disable sharing session and tcon and add new TCP sharing code Greg KH
2008-12-03 19:53 ` [patch 072/104] cifs: reinstate sharing of SMB sessions sans races Greg KH
2008-12-03 19:53 ` [patch 073/104] cifs: minor cleanup to cifs_mount Greg KH
2008-12-03 19:53 ` Greg KH [this message]
2008-12-03 19:53 ` [patch 075/104] cifs: Fix build break Greg KH
2008-12-03 19:55 ` [patch 076/104] cifs: Fix check for tcon seal setting and fix oops on failed mount from earlier patch Greg KH
2008-12-03 19:56 ` [patch 077/104] cifs: prevent cifs_writepages() from skipping unwritten pages Greg KH
2008-12-03 19:56 ` [patch 078/104] cifs: fix check for dead tcon in smb_init Greg KH
2008-12-03 19:56 ` [patch 079/104] ext4: Update flex_bg free blocks and free inodes counters when resizing Greg KH
2008-12-03 19:56 ` [patch 080/104] ext4: fix #11321: create /proc/ext4/*/stats more carefully Greg KH
2008-12-03 19:56 ` [patch 081/104] jbd2: fix /proc setup for devices that contain / in their names Greg KH
2008-12-03 19:56 ` [patch 082/104] ext4: add missing unlock in ext4_check_descriptors() on error path Greg KH
2008-12-03 19:56 ` [patch 083/104] ext4: elevate write count for migrate ioctl Greg KH
2008-12-03 19:56 ` [patch 084/104] ext4: Renumber EXT4_IOC_MIGRATE Greg KH
2008-12-03 19:56 ` [patch 085/104] ext4/jbd2: Avoid WARN() messages when failing to write to the superblock Greg KH
2008-12-03 19:56 ` [patch 086/104] ext4: fix initialization of UNINIT bitmap blocks Greg KH
2008-12-04 4:10 ` Theodore Tso
2008-12-05 18:36 ` [stable] " Greg KH
2008-12-03 19:56 ` [patch 087/104] jbd2: abort instead of waiting for nonexistent transaction Greg KH
2008-12-03 19:56 ` [patch 088/104] jbd2: Fix buffer head leak when writing the commit block Greg KH
2008-12-03 19:56 ` [patch 089/104] ext4: fix xattr deadlock Greg KH
2008-12-03 19:56 ` [patch 090/104] ext4: Free ext4_prealloc_space using kmem_cache_free Greg KH
2008-12-03 19:56 ` [patch 091/104] ext4: Do mballoc init before doing filesystem recovery Greg KH
2008-12-03 19:56 ` [patch 092/104] ext4: Fix duplicate entries returned from getdents() system call Greg KH
2008-12-03 19:56 ` [patch 093/104] jbd2: dont give up looking for space so easily in __jbd2_log_wait_for_space Greg KH
2008-12-03 19:56 ` [patch 094/104] ext4: Convert to host order before using the values Greg KH
2008-12-03 19:56 ` [patch 095/104] ext4: wait on all pending commits in ext4_sync_fs() Greg KH
2008-12-03 19:56 ` [patch 096/104] ext4: calculate journal credits correctly Greg KH
2008-12-03 19:56 ` [patch 097/104] ext4: Mark the buffer_heads as dirty and uptodate after prepare_write Greg KH
2008-12-03 19:56 ` [patch 098/104] ext4: add checksum calculation when clearing UNINIT flag in ext4_new_inode Greg KH
2008-12-03 19:56 ` [patch 099/104] ext3: fix ext3_dx_readdir hash collision handling Greg KH
2008-12-03 19:56 ` [patch 100/104] ext3: Fix duplicate entries returned from getdents() system call Greg KH
2008-12-03 19:56 ` [patch 101/104] ext3: dont try to resize if there are no reserved gdt blocks left Greg KH
2008-12-04 22:07 ` Valdis.Kletnieks
2008-12-03 19:56 ` [patch 102/104] ext2: fix ext2 block reservation early ENOSPC issue Greg KH
2008-12-03 19:56 ` [patch 103/104] ext3: fix ext3 " Greg KH
2008-12-03 19:56 ` [patch 104/104] jbd: ordered data integrity fix Greg KH
2008-12-03 21:39 ` [patch 000/104] 2.6.27-stable review Rafael J. Wysocki
2008-12-03 22:10 ` Michael Tokarev
2008-12-03 23:18 ` Rafael J. Wysocki
2008-12-05 0:33 ` Rafael J. Wysocki
2008-12-09 17:58 ` [stable] " Greg KH
2008-12-03 22:06 ` Michael Tokarev
2008-12-03 23:19 ` Greg KH
[not found] <bF63r-1nB-59@gated-at.bofh.it>
[not found] ` <bXmsS-4eW-1@gated-at.bofh.it>
[not found] ` <bXmMj-4HC-7@gated-at.bofh.it>
[not found] ` <bXqQ1-2GV-49@gated-at.bofh.it>
[not found] ` <bXxHH-5zl-23@gated-at.bofh.it>
[not found] ` <bXQqZ-1hm-9@gated-at.bofh.it>
[not found] ` <bYb2q-8bp-21@gated-at.bofh.it>
[not found] ` <bYchR-1AT-3@gated-at.bofh.it>
[not found] ` <bZ6Di-6ZV-1@gated-at.bofh.it>
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081203195338.GW8950@kroah.com \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jlayton@redhat.com \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=sfrench@us.ibm.com \
--cc=sjayaraman@suse.de \
--cc=smfrench@gmail.com \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox