Patchwork [3/4] cifs: have cifsFileInfo hold an extra inode reference

login
register
mail settings
Submitter Jeff Layton
Date Sept. 8, 2009, 2:12 p.m.
Message ID <1252419179-31353-4-git-send-email-jlayton@redhat.com>
Download mbox | patch
Permalink /patch/33132/
State New
Headers show

Comments

Jeff Layton - Sept. 8, 2009, 2:12 p.m.
It's possible that this struct will outlive the filp to which it is
attached. If it does and it needs to do some work on the inode, then
it'll need a reference.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
 fs/cifs/cifsglob.h |    4 +++-
 fs/cifs/dir.c      |    2 +-
 fs/cifs/file.c     |    2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

Patch

diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index b8d673c..908b2de 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -365,8 +365,10 @@  static inline void cifsFileInfo_get(struct cifsFileInfo *cifs_file)
 /* Release a reference on the file private data */
 static inline void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
 {
-	if (atomic_dec_and_test(&cifs_file->count))
+	if (atomic_dec_and_test(&cifs_file->count)) {
+		iput(cifs_file->pInode);
 		kfree(cifs_file);
+	}
 }
 
 /*
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index a6424cf..6b45feb 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -147,7 +147,7 @@  cifs_fill_fileinfo(struct inode *newinode, __u16 fileHandle,
 
 	pCifsFile->netfid = fileHandle;
 	pCifsFile->pid = current->tgid;
-	pCifsFile->pInode = newinode;
+	pCifsFile->pInode = igrab(newinode);
 	pCifsFile->invalidHandle = false;
 	pCifsFile->closePend = false;
 	mutex_init(&pCifsFile->fh_mutex);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index fa7beac..9498d2c 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -50,7 +50,7 @@  static inline struct cifsFileInfo *cifs_init_private(
 	mutex_init(&private_data->lock_mutex);
 	INIT_LIST_HEAD(&private_data->llist);
 	private_data->pfile = file; /* needed for writepage */
-	private_data->pInode = inode;
+	private_data->pInode = igrab(inode);
 	private_data->invalidHandle = false;
 	private_data->closePend = false;
 	/* Initialize reference count to one.  The private data is